解决方法
是.首先将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应用程序中不起作用,但它对我尝试的其他一切都有效.我不知道这是添加什么版本,但它应该适用于几乎所有你遇到的应用程序.