我只有.ipa文件(我没有构建环境)没有任何访问项目.我正在尝试确定它们是否构建了链接SDK 7.是否有方法或实用程序来检查.ipa/.app文件的SDK版本是否已编译?
Tom*_*ton 39
是.首先将ipa复制到安全位置,/tmp然后解压缩:
cd /tmp/
cp ~/Music/iTunes/Mobile\ Applications/APPNAME.ipa .
unzip APPNAME.ipa
Run Code Online (Sandbox Code Playgroud)
然后用它otool来查看它链接的框架版本:
otool -L Payload/APPNAME.app/APPNAME
Run Code Online (Sandbox Code Playgroud)
这将给你如下结果:
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)
Run Code Online (Sandbox Code Playgroud)
可以针对不同的架构重复该信息.
对于每个框架,"当前版本"是内部版本号,对应于编译应用程序时使用的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
Run Code Online (Sandbox Code Playgroud)
常量不包括当前的iOS版本.你可以在运行时找到它.创建一个新的测试项目并在某处添加此行:
NSLog(@"Foundation version: %f", NSFoundationVersionNumber);
Run Code Online (Sandbox Code Playgroud)
那将打印出当前值.在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
Run Code Online (Sandbox Code Playgroud)
它可能可以查找其他框架的版本号,但我没有找到适合它们的头文件.如果你想要的是SDK版本,那么Foundation版本会告诉你你想知道什么.
附录: Matt Stevens向我指出,通过这样做也可以更直接地查找版本:
otool -l Payload/APPNAME.app/APPNAME | fgrep --after-context=3 LC_VERSION_MIN_IPHONEOS
Run Code Online (Sandbox Code Playgroud)
这给你的结果如下:
cmd LC_VERSION_MIN_IPHONEOS
cmdsize 16
version 5.0
sdk 6.0
Run Code Online (Sandbox Code Playgroud)
这在我上面提到的古老的iPhone OS 2.0应用程序中不起作用,但它确实适用于我尝试过的其他一切.我不知道这个版本的添加版本,但它几乎适用于您遇到的每个应用程序.
Max*_*kin 12
还有另一种方法:打开Info.plist
plutil -p Payload/APPNAME.app/Info.plist | grep DTSDKName
Run Code Online (Sandbox Code Playgroud)
这给你的结果如下:
"DTSDKName" => "iphoneos7.0"
Run Code Online (Sandbox Code Playgroud)
PS这种方式适用于非常古老的应用程序.
| 归档时间: |
|
| 查看次数: |
10022 次 |
| 最近记录: |