【发布时间】:2014-03-08 05:09:23
【问题描述】:
我只有 .ipa 文件(我没有构建环境),无法访问该项目。我正在尝试确定它们是否是链接 SDK 7 构建的。有没有办法或实用程序来检查 .ipa/.app 文件的 SDK 版本是用什么编译的?
【问题讨论】:
我只有 .ipa 文件(我没有构建环境),无法访问该项目。我正在尝试确定它们是否是链接 SDK 7 构建的。有没有办法或实用程序来检查 .ipa/.app 文件的 SDK 版本是用什么编译的?
【问题讨论】:
如果你有windows pc,把iPA带到windows,解压(我用的是7zip)。现在跟随路径 解压文件夹/Payload/APP_NAME.app 在 DTSDKName keyy 下,您将获得您的 sdk 版本。
【讨论】:
如果应用是您自己的并且您可以访问 appstoreconnect,您可以查看您上传的构建并从中推断出 IOS SDK。在 App Store Connect 中单击您的应用程序的构建,您将看到构建 SDK 作为该构建的字段之一。
然后您可以检查https://xcodereleases.com/,您将在 IOS SDKs 列下看到 Build SDK。单击最后一列中的发行说明链接,您将转到包含 SDK 信息的 XCode 版本的发行说明。
【讨论】:
还有另一种方法:打开 Info.plist
plutil -p Payload/APPNAME.app/Info.plist | grep DTSDKName
这会给你这样的结果:
"DTSDKName" => "iphoneos7.0"
附:这种方式也适用于非常古老的应用程序。
【讨论】:
iphoneos11.0 SDK 构建的应用程序,可以在我的 8.1.2 iPhone 4S 上运行。你可能想要MinimumOSVersion。
是的。首先将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 应用程序,但它确实适用于我尝试过的所有其他应用程序。我不知道这是为哪个版本添加的,但它应该适用于您遇到的几乎所有应用。
【讨论】:
LC_VERSION_MIN_IPHONEOS 条目。 @Speakus 下面使用plutil 解决这个问题的答案效果很好。