Не удается повторно подписать приложение iOS с другими правами на 32-разрядных устройствах

У меня есть идея, согласно которой я хочу создать свое приложение один раз на нашем сервере сборки и распространить его в нескольких средах, прежде чем, наконец, попасть в магазин iTunes.

Одна из проблем, с которыми я сталкиваюсь, — это права. Если я скопирую права $ENVIRONMENT.plist в приложение и повторно подпишусь с ним, приложение установится и будет работать должным образом на 64-битном устройстве. Проблема, с которой я столкнулся, заключается в том, что приложение не работает на 32-битном устройстве (ARMv7/ARMv7S), и, поскольку оно изначально было создано для Ad-Hoc (HockeyApp), оно не имеет разрешений на бета-тестирование.

По сути, у меня есть разные файлы plist для разных сред.

dev.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>XXXXX.com.mydomain.mobile</string>
    <key>keychain-access-groups</key>
    <array>
        <string>XXXXX.com.mydomain.mobile</string>
    </array>
    <key>get-task-allow</key>
    <false/>
</dict>
</plist>

prod.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>XXXXX.com.mydomain.mobile</string>
    <key>keychain-access-groups</key>
    <array>
        <string>XXXXX.com.mydomain.mobile</string>
    </array>
    <key>get-task-allow</key>
    <false/>
    <key>beta-reports-active</key>
    <true/>
</dict>
</plist>

Затем я копирую файлы plist во время развертывания и пытаюсь повторно подписать

cp $ENVIRONMENT.plist "${APPFOLDER}/Entitlements.plist"
/usr/bin/codesign -f -v -v -s "$CERTIFICATE_NAME" --entitlements="${APPFOLDER}/entitlements.plist" "${APPFOLDER}/Payload/$APPNAME.app" 
pushd ${APPFOLDER} 
zip -qr ~/Desktop/Archive/$ENVIRONMENT_NAME/$APPNAME-$APP_VERSION.ipa Payload
popd

Когда я использую этот подход, я могу запустить приложение на iPhone 6+ без проблем, но когда я пытаюсь запустить приложение на iPhone 4S или iPhone 5, я получаю сбой при запуске без каких-либо журналов сбоев.

Как правильно повторно подписать приложение с разными правами для разных сред? Опять же, сбой происходит только на 32-битных устройствах, 64-битные работают, как и ожидалось, даже после отставки.

РЕДАКТИРОВАТЬ:

Если я просто создам приложение с помощью Visual Studio и не буду распаковывать/обновлять/уходить в отставку, то приложение будет работать должным образом на всех платформах.

РЕДАКТИРОВАТЬ:

Вот единственный вывод ошибки, который я могу получить. Это из консоли устройства XCode.

Jul  7 11:01:02 Company-iPhone-4S SpringBoard[48] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
Jul  7 11:01:02 Company-iPhone-4S SpringBoard[48] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
Jul  7 11:01:02 Company-iPhone-4S SpringBoard[48] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
Jul  7 11:01:02 Company-iPhone-4S securityd[86] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
Jul  7 11:01:02 Company-iPhone-4S securityd[86] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
Jul  7 11:01:02 Company-iPhone-4S amfid[312] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
Jul  7 11:01:02 Company-iPhone-4S securityd[86] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
Jul  7 11:01:02 Company-iPhone-4S securityd[86] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
Jul  7 11:01:02 Company-iPhone-4S amfid[312] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
Jul  7 11:01:02 Company-iPhone-4S kernel[0] <Notice>: xpcproxy[359] Container: /private/var/mobile/Containers/Data/Application/877013A4-BF2A-4AC9-8CEA-1598EA2CD336 (sandbox)
Jul  7 11:01:02 Company-iPhone-4S com.apple.xpc.launchd[1] <Error>: assertion failed: 13F69: launchd + 85529 [083E000D-4C31-3B98-A2C4-6FADB4D1940F]: 0x3
Jul  7 11:01:02 Company-iPhone-4S MyCompMyAppMobileiOS[359] <Warning>: Found new TLS offset at 176
Jul  7 11:01:02 Company-iPhone-4S MyCompMyAppMobileiOS[359] <Warning>: The assembly mscorlib.dll was not found or could not be loaded.
Jul  7 11:01:02 Company-iPhone-4S MyCompMyAppMobileiOS[359] <Warning>: It should have been installed in the `/Users/builder/data/lanes/3412/3cf8aaed/source/maccore/builds/install/target7/lib/mono/2.1/mscorlib.dll' directory.
Jul  7 11:01:02 Company-iPhone-4S com.apple.xpc.launchd[1] (UIKitApplication:com.MyComp.mobile[0x3eca][359]) <Warning>: Service exited with abnormal code: 1
Jul  7 11:01:02 Company-iPhone-4S SpringBoard[48] <Warning>: Application 'UIKitApplication:com.MyComp.mobile[0x3eca]' exited voluntarily.
Jul  7 11:01:03 Company-iPhone-4S kernel[0] <Notice>: xpcproxy[360] Container: /private/var/mobile/Containers/Data/Application/877013A4-BF2A-4AC9-8CEA-1598EA2CD336 (sandbox)
Jul  7 11:01:03 Company-iPhone-4S com.apple.xpc.launchd[1] <Error>: assertion failed: 13F69: launchd + 85529 [083E000D-4C31-3B98-A2C4-6FADB4D1940F]: 0x3
Jul  7 11:01:03 Company-iPhone-4S MyCompMyAppMobileiOS[360] <Warning>: Found new TLS offset at 176
Jul  7 11:01:03 Company-iPhone-4S MyCompMyAppMobileiOS[360] <Warning>: The assembly mscorlib.dll was not found or could not be loaded.
Jul  7 11:01:03 Company-iPhone-4S MyCompMyAppMobileiOS[360] <Warning>: It should have been installed in the `/Users/builder/data/lanes/3412/3cf8aaed/source/maccore/builds/install/target7/lib/mono/2.1/mscorlib.dll' directory.
Jul  7 11:01:03 Company-iPhone-4S com.apple.xpc.launchd[1] (UIKitApplication:com.MyComp.mobile[0xc803][360]) <Warning>: Service exited with abnormal code: 1
Jul  7 11:01:03 Company-iPhone-4S SpringBoard[48] <Warning>: Application 'UIKitApplication:com.MyComp.mobile[0xc803]' exited voluntarily.

примечание: я повторно создал свой профиль распространения, чтобы в нем были бета-версии, и я использую вздыхает, чтобы получить последнюю копию моих профилей подготовки.

примечание. Причина отказа заключается в том, что у меня есть некоторая конфигурация XML, которая указывает приложению разные серверы для каждой среды (разработки, тестирования, производства), и она обновляется перед отказом.


person Chase Florell    schedule 04.07.2016    source источник
comment
Хм... может проблема в том, что вы копируете $ENVIRONMENT.plist в ${APPFOLDER}/Entitlements.plist (обратите внимание на права в верхнем регистре), но затем вы подписываете --entitlements=${APPFOLDER}/entitlements.plist (обратите внимание на нижний регистр). Файловая система iOS чувствительна к регистру. Однако я думаю, что это не сработает и на 64-битных устройствах, но об этом стоит упомянуть.   -  person jgoldberger - MSFT    schedule 07.07.2016
comment
@jgoldberger Вы знаете, я думал об этом, и поэтому я переместил этот фрагмент кода в часть powershell моего развертывания Copy-Item "$here\entitlements\$environment.plist" "$here\$($this.ipaName)\entitlements.plist"   -  person Chase Florell    schedule 07.07.2016
comment
Я захватил вывод консоли с запуска iPhone 6+, и там не было ничего важного. Одно и то же приложение, загруженное из HockeyApp, два совершенно разных результата.   -  person Chase Florell    schedule 07.07.2016


Ответы (1)


Я хотел бы прояснить одну вещь: кодовое обозначение предназначено только для создания подписи, чтобы убедиться, что каждый байт в файле .app точно такой же, как когда он был подписан его создателем (указывается идентификатором подписи). Так что теоретически это не должно иметь ничего общего с тем, на какой платформе развернуто приложение.

И я также хочу более четко понять ваш сценарий: вы хотите протестировать свое приложение через TestFlight или только для специального тестирования через HockeyApp? Поскольку право на бета-тестирование требуется только для бета-тестирования через TestFlight. Это также не имеет ничего общего с вашим сбоем на 32-битной платформе.

Тогда для вашей проблемы мое предложение:

1) Проверьте конфигурацию вашего приложения, особенно его целевые платформы, чтобы убедиться, что ARMV7 поддерживается;

2) Протестируйте свое приложение через Xcode, чтобы исключить любые другие проблемы с подписью/профилем. Это может проверить, может ли ваше приложение работать правильно как на 64-битной, так и на 32-битной версии в режиме разработки.

3) Последнее и самое главное, было бы полезно прикрепить журнал ошибок, созданный как из выходных данных Xcode, так и из устройства во время развертывания. Это было бы большим подспорьем в устранении неполадок.

person Fangfang Wu - MSFT    schedule 05.07.2016
comment
Приложение написано на C# (Xamarin). Он поддерживает ARMv7 и ARM64. Мы тестируем среды разработки и тестирования в HockeyApp (Ad-Hoc), а производственную среду (дымовой тест) тестируем в TestFlight перед публичным выпуском. Если codesign просто проверяет, как вы говорите, какая команда требуется для повторной подписи? Самое приятное, что нет аварийной нагрузки (как я уже говорил). Я также сделал правку. - person Chase Florell; 05.07.2016
comment
1. codesign предназначен для создания подписи, и это правильный инструмент для повторной подписи. 2. Не могли бы вы получить какой-либо журнал с разбитого устройства iphone? 3.Есть ли у вас такая же проблема при распространении через HockeyApp? Я спрашиваю это потому, что даже для разового распространения нам все равно нужно выполнить кодирование перед загрузкой в ​​HA. - person Fangfang Wu - MSFT; 06.07.2016
comment
Я добавил сообщение об ошибке, которое я получаю из XCode, к исходному вопросу. - person Chase Florell; 07.07.2016
comment
Это похоже на проблему Apple iOS, а не на проблему подписи кода. Аналогичный отчет об ошибке можно найти здесь: forums.developer.apple.com/thread/20193. Согласно обсуждению в этой теме, я полагаю, что это может быть связано с давлением памяти: forums.developer.apple .com/thread/4743? - person Fangfang Wu - MSFT; 18.07.2016
comment
Спасибо за это. Да, я нашел эту тему и искал ее. У меня проблема в том, что я могу заставить приложение работать на старых устройствах до его повторной подписи :( - так запутался. - person Chase Florell; 19.07.2016