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

标签 ios iphone ios7

我只有 .ipa 文件(我没有构建环境)而无法访问项目。我正在尝试确定它们是否是链接 SDK 7 构建的。有没有一种方法或实用程序可以检查 .ipa/.app 文件的 SDK 版本是用它编译的?

最佳答案

是的。首先将 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 应用程序中不起作用,但它确实适用于我尝试过的所有其他应用程序。我不知道这是为哪个版本添加的,但它应该适用于您遇到的几乎所有应用。

关于ios - 如何检查用于编译.ipa 或.app 文件的iOS SDK 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21684501/

相关文章:

ios7 - iAd正在测试应用程序上运行,但不在appstore上运行时

ios7 - 我们可以从 SKSpriteNode 获取图像名称吗?

ios - 我们可以将混合应用程序与 native iOS 应用程序合并吗?

iphone - 如何在没有点符号的情况下写这个

iphone - 2 个或更多落针之间的距离

ios - 如何在 iOS SDK 上通过给定的邮政编码 (ZIP) 获取国家名称

某些用户的 iOS 应用程序崩溃

ios - ARC 下指向 Objective-C 对象的 C 风格指针数组

ios - 手动将委托(delegate)和数据源添加到 xib 文件中的 UICollectionView

ios - 是否可以在没有 Swift 或 Objective-C 的情况下使用 Go 创建 iOS 应用程序?