Разбор файлов mobileprovision в bash? - PullRequest
22 голосов
/ 18 июня 2011

Я занимаюсь созданием системы php / bash / mysql для автоматизации распространения adhoc для приложений iPhone. Но я хочу прочитать ключ-идентификатор приложения в файле проектов mobileprovision и изменить его в соответствии с этим в файле info.plist.

В настоящее время я могу создавать файлы ipa из php, ЕСЛИ ключ cfbundleidentifer совпадает с его файлом обеспечения.

Я нашел такой код https://gist.github.com/711794, но я хочу, чтобы bash-скрипт интегрировал его в мою систему.

Спасибо

Ответы [ 6 ]

47 голосов
/ 08 мая 2012

Если вы используете это на компьютере с Mac OS X, вы можете использовать следующее:

/usr/libexec/PlistBuddy -c 'Print :Entitlements:application-identifier' /dev/stdin <<< $(security cms -D -i path_to_mobileprovision)
26 голосов
/ 17 января 2013

Если вы хотите извлекать plist из mobileprovision надлежащим образом и не полагаться на grepping / sedding / etc., Вы можете использовать OpenSSL следующим образом:

openssl smime -inform der -verify -noverify -in file.mobileprovision

Полный пример в вашем случаеможет быть:

openssl smime -inform der -verify -noverify -in file.mobileprovision > tmp.plist
/usr/libexec/PlistBuddy -c 'Print :Entitlements:application-identifier' tmp.plist

Часть OpenSSL должна работать на любой платформе, хотя я пока делал это только на Mac.PlistBuddy работает только на Mac, но можно найти и другие утилиты для чтения / записи файлов списка свойств.

6 голосов
/ 12 декабря 2017

Я создал функцию bash на основе ответа Джлаври, чтобы вывести список всех идентификаторов комплекта .mobileprovision из папки ~/Library/MobileDevice/Provisioning Profiles.

Сохраните это в свой .bash_profile и просто вызовите его с помощью list_xcode_provisioning_profiles из терминала.

list_xcode_provisioning_profiles() {
    while IFS= read -rd '' f; do
        2> /dev/null /usr/libexec/PlistBuddy -c 'Print :Entitlements:application-identifier' /dev/stdin \
            <<< $(security cms -D -i "$f")

    done < <(find "$HOME/Library/MobileDevice/Provisioning Profiles" -name '*.mobileprovision' -print0)
}
6 голосов
/ 24 августа 2011

Одно из множества решений ...

Используйте egrep с опцией -a, которая обрабатывает двоичные файлы как текстовые файлы, и '-A 2', которая будет отображать две строки после строки, которую вы хотите сопоставить: ApplicationIdentifierPrefix.

После этого обрежьте строку скобок и пробелов с помощью sed.

Использование серии труб:

egrep -a -A 2 ApplicationIdentifierPrefix file.mobileprovision | grep string | sed -e 's/<string>//' -e 's/<\/string>//' -e 's/ //'
0 голосов
/ 27 ноября 2017

Я использовал код из mobileprovision-read репозитория, чтобы иметь возможность извлекать информацию из файла mobileprovision. Для чтения файла используются API-интерфейсы macOS.

Вот пример использования сгенерированной программы:

mobileprovision-read -- mobileprovision files querying tool.

USAGE
mobileprovision-read -f fileName [-o option]

OPTIONS
    type – prints mobileprovision profile type (debug, ad-hoc, enterprise, appstore)
    appid – prints application identifier
Will print raw provision's plist if option is not specified.
You can also use key path as an option.

EXAMPLES
mobileprovision-read -f test.mobileprovision -o type
    Prints profile type

mobileprovision-read -f test.mobileprovision -o UUID
    Prints profile UUID

mobileprovision-read -f test.mobileprovision -o ProvisionedDevices
    Prints provisioned devices UDIDs

mobileprovision-read -f test.mobileprovision -o Entitlements.get-task-allow
    Prints 0 if profile doesn't allow debugging 1 otherwise
0 голосов
/ 19 июня 2011

Это слегка утомительно, поскольку .mobileprovision - это "данные, подписанные PKCS # 7" или около того.

К счастью, вы, вероятно, можете обойтись без использования grep:)

...