如何检查用于编译.ipa或.app文件的iOS SDK版本

时间:2014-02-10 17:55:17

标签: ios iphone ios7

我只有.ipa文件(我没有构建环境),没有任何访问项目的权限。我正在尝试确定它们是否构建了连接SDK 7.是否有方法或实用程序来检查.ipa / .app文件的SDK版本是否已编译?

3 个答案:

答案 0 :(得分:39)

是。首先将ipa复制到/tmp这样的安全位置并解压缩:

cd /tmp/
cp ~/Music/iTunes/Mobile\ Applications/APPNAME.ipa .
unzip APPNAME.ipa

然后使用otool查看它链接的框架版本:

otool -L Payload/APPNAME.app/APPNAME

这将为您提供如下结果:

Payload/APPNAME.app/APPNAME (architecture armv7):
    /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.8.0)
    /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 992.0.0)
    /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 2372.0.0)
    /System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 600.0.0)
    /System/Library/Frameworks/AudioToolbox.framework/AudioToolbox (compatibility version 1.0.0, current version 359.0.0)
    /System/Library/Frameworks/MediaPlayer.framework/MediaPlayer (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 9.6.0)
    /System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration (compatibility version 1.0.0, current version 499.0.0)
    /System/Library/Frameworks/CoreLocation.framework/CoreLocation (compatibility version 1.0.0, current version 1491.2.0)
    /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 173.8.0)
    /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 793.0.0)

可以针对不同的架构重复此信息。

对于每个框架,“当前版本”是内部版本号,对应于编译应用程序时使用的SDK。对于Foundation.framework,您可以在NSObjCRuntime.h中查看这些内容。它包含一堆命名常量,可在iOS(或OS X)版本和otool为您提供的版本号之间进行转换。例如:

#define NSFoundationVersionNumber_iOS_5_0  881.00
#define NSFoundationVersionNumber_iOS_5_1  890.10
#define NSFoundationVersionNumber_iOS_6_0  993.00
#define NSFoundationVersionNumber_iOS_6_1  993.00

常量不包括当前的iOS版本。你可以在运行时找到它。创建一个新的测试项目并在某处添加此行:

NSLog(@"Foundation version: %f", NSFoundationVersionNumber);

那将打印出当前值。在iOS 7.0.4上,我得到1047.220000。 (这适用于任何版本的iOS和Foundation,但在可能的情况下更容易查找头文件中的值。)

数字并不总是完全匹配,因为iOS的每个次要版本都没有常量。但是两个版本号都会随着时间而增加在这种情况下,上面的“当前版本”是992.0.0,我碰巧知道这个应用程序是为iOS 5.1.1编译的。根据您看到的当前版本,您可能需要进行类似的插值。为了比较,在我知道的另一个应用程序是几年前建立的,基础版本是678.24.0。查看此内容可确认应用程序的年龄:

#define NSFoundationVersionNumber_iPhoneOS_2_0  678.24

可能可以查找其他框架的版本号,但我没有找到适合它们的头文件。如果你想要的是SDK版本,那么Foundation版本会告诉你你想知道什么。

附录: Matt Stevens pointed out to me通过这样做也可以更直接地查找版本:

otool -l Payload/APPNAME.app/APPNAME | fgrep --after-context=3 LC_VERSION_MIN_IPHONEOS

这会给你带来如下结果:

      cmd LC_VERSION_MIN_IPHONEOS
  cmdsize 16
  version 5.0
      sdk 6.0

这在我上面提到的古老的iPhone OS 2.0应用程序中不起作用,但它确实适用于我尝试过的所有其他内容。我不知道这个版本的添加版本,但它几乎适用于您遇到的每个应用程序。

答案 1 :(得分:10)

还有另一种方法:打开Info.plist

plutil -p Payload/APPNAME.app/Info.plist | grep DTSDKName

这给你的结果如下:

"DTSDKName" => "iphoneos7.0"

P.S。这种方式也适用于非常古老的应用程序。

答案 2 :(得分:2)

如果该应用程序是您自己的,并且可以访问appstoreconnect,则可以查看您上载的内部版本并从中推断出IOS SDK。在App Store Connect中,单击您的应用程序的构建,您将看到Build SDK作为该构建的字段之一。

然后您可以检查https://xcodereleases.com/,然后在IOS SDKs列下看到Build SDK。单击最后一列中的发行说明链接,这将带您进入该XCode版本的发行说明,其中包括SDK信息。

App Store Connect Build Information

xcodereleases.com build information

相关问题