Как проверить версию iOS SDK, используемую для компиляции.ipa или.файл приложения

У меня просто .файлы ipa (у меня нет сборки env) без какого-либо доступа к проекту. Я пытаюсь определить, были ли они построены, связывая SDK 7. Есть ли способ или утилита для проверки версии SDK .МФА./файлы приложений были скомпилированы?

2 ответов


да. Сначала скопируйте 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, используемому при компиляции приложения. для фондов.рамки вы можете посмотреть их в 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. В зависимости от текущей версии, которую вы видите, вам может потребоваться аналогичная интерполяция. Для сравнения, в другом приложении, которое я знаю, было последним построенный несколько лет назад, версия foundation-678.24.0. Глядя на это вверх подтверждает возраст приложения:

#define NSFoundationVersionNumber_iPhoneOS_2_0  678.24

вероятно, можно найти номера версий для других фреймворков, но я не отследил соответствующие файлы заголовков для них. Если вы хотите версию SDK, версия Foundation расскажет вам то, что вы хотите знать.

дополнение: Мэтт Стивенс указал мне что можно посмотреть версия более непосредственно, делая это:

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, о котором я упоминал выше, но он работает на всем остальном, что я пробовал. Я не знаю, для какой версии это было добавлено, но оно должно работать почти для каждого приложения, с которым вы сталкиваетесь.


есть еще один способ сделать это: открытая информация.файл plist

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

что дает вам результат, как:

"DTSDKName" => "iphoneos7.0"

P. S. Этот способ работает и для очень древних приложений.