【问题标题】:How to check the iOS SDK version used to compile .ipa or .app file如何检查用于编译 .ipa 或 .app 文件的 iOS SDK 版本
【发布时间】:2014-03-08 05:09:23
【问题描述】:

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

【问题讨论】:

    标签: ios iphone ios7


    【解决方案1】:

    如果你有windows pc,把iPA带到windows,解压(我用的是7zip)。现在跟随路径 解压文件夹/Payload/APP_NAME.app 在 DTSDKName keyy 下,您将获得您的 sdk 版本。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        这会给你这样的结果:

        "DTSDKName" => "iphoneos7.0"
        

        附:这种方式也适用于非常古老的应用程序。

        【讨论】:

        • 对我不起作用。我得到“意外的字符 Î 在行”。另一方面,接受的答案效果很好。
        • @mrvincenzo 对我来说这种方式总是很有效。你能把问题Info.plist文件发给我看看吗?
        • 这会检查使用的 SDK 版本,而不是最低兼容 iOS 版本。我有使用iphoneos11.0 SDK 构建的应用程序,可以在我的 8.1.2 iPhone 4S 上运行。你可能想要MinimumOSVersion
        • 最初的问题是“如何检查用于编译 .ipa 或 .app 文件的 iOS SDK 版本”。那不是寻求最低操作系统版本。
        【解决方案4】:

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

        【讨论】:

        • re: fgrep - 我注意到这不适用于为模拟器构建的应用程序。我在 otool 输出中没有看到 LC_VERSION_MIN_IPHONEOS。不要试图以任何方式减损这个出色的答案。
        • @jmoody 它适用于我的模拟器构建,在我的最新构建中它显示“8.3 版”和“sdk 8.3”。你在什么环境下不工作?
        • 啊。看起来可能是使用单声道(Xamarin)构建的模拟器应用程序和使用 Xcode 构建的模拟器应用程序之间的区别。但为什么会这样,我不明白。
        • 有趣...谢谢。
        • 我刚刚在为 iOS 11.1 构建的应用程序上尝试过这个,输出中没有 LC_VERSION_MIN_IPHONEOS 条目。 @Speakus 下面使用plutil 解决这个问题的答案效果很好。
        猜你喜欢
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 2022-01-07
        • 2014-11-24
        • 1970-01-01
        相关资源
        最近更新 更多