簡體   English   中英

如何檢查用於編譯 .ipa 或 .app 文件的 iOS SDK 版本

[英]How to check the iOS SDK version used to compile .ipa or .app file

我只有 .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查找這些NSObjCRuntime.h 它包含一堆命名常量,它們在 iOS(或 OS X)版本和otool給你的版本號之間進行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 向我指出,也可以通過這樣做更直接地查找版本:

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 應用程序中不起作用,但它確實適用於我嘗試過的所有其他應用程序。 我不知道這是為哪個版本添加的,但它幾乎適用於您遇到的每個應用程序。

還有另一種方法:打開 Info.plist

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

這給你的結果如下:

"DTSDKName" => "iphoneos7.0"

PS 這種方式也適用於非常古老的應用程序。

如果應用程序是您自己的並且您可以訪問 appstoreconnect,您可以查看您上傳的構建並從中推斷出 IOS SDK。 在 App Store Connect 中,單擊您的應用程序的構建,您將看到構建 SDK 作為該構建的字段之一。

然后,您可以查看https://xcodereleases.com/ ,您將在 IOS SDKs 列下看到 Build SDK。 單擊最后一列中的發行說明鏈接,您將看到該版本 XCode 的發行說明,其中包含 SDK 信息。

App Store Connect 構建信息

xcodereleases.com 構建信息

如果你有 windows pc,把 iPA 帶到 windows 上,解壓縮它(我用的是 7zip)。 現在按照 Path Unzipped folder/Payload/APP_NAME.app 在 DTSDKName keyy 下,您將獲得您的 sdk 版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM