如何使用应用商店配置文件退出应用以添加 beta-reports-active 密钥?

Posted

技术标签:

【中文标题】如何使用应用商店配置文件退出应用以添加 beta-reports-active 密钥?【英文标题】:How to resign an app with app store provisioning profile to add beta-reports-active key? 【发布时间】:2014-11-25 16:21:32 【问题描述】:

为了通过 Apple 的新 Test Flight 服务分发应用程序,beta-reports-active 密钥需要存在。目前,我正在使用 Apple 的 bot 服务器分发到带有 Ad Hoc 分发配置文件的旧 Test Flight 系统。使用构建后触发器,我想获取已创建的 archive 并构建可以上传到 iTunes Connect 的 App Store Distribution ipa。我写了一个脚本来做到这一点。我使用xcrun 命令构建:

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "$APP" -o "$APP_STORE_IPA" --sign "$SIGNING_IDENTITY" --embed "$PROVISIONING_PROFILE"

SIGNING_IDENTITYPROVISIONING_PROFILE 都是应用商店分发证书/配置文件。所以配置文件被嵌入到ipa 中,它包含beta-reports-active 标志。但是,当我查看 ipa 以验证其权利时,它并不存在。

我做错了什么?我在这方面看到的所有信息都只是建议重新生成配置文件。我已经这样做了,并且知道密钥存在。它没有被添加到权利中。我有一个小部件也捆绑在 ipa 中。我不会就此辞职。

【问题讨论】:

你能试试这个漂亮的脚本吗?我自己没试过github.com/KrauseFx/sigh 【参考方案1】:

您总是可以尝试使用 xcodebuild 导出命令:

xcodebuild -exportArchive -archivePath 'APP' -exportPath 'IPA' \
-exportFormat 'ipa' -exportWithOriginalSigningIdentity

或者如果您想要不同的个人资料和身份:

xcodebuild -exportArchive -archivePath 'APP' -exportPath 'IPA' \
-exportFormat 'ipa' -exportWithOriginalSigningIdentity \
-exportProvisioningProfile profilename -exportSigningIdentity identityname

请参阅man xcodebuild 了解更多信息。

【讨论】:

感谢您的建议。我正在修改我的脚本以使用该命令。现在它失败了:“错误:指定的配置文件和签名身份之间不匹配”这让我感到困惑,因为我已经验证了配置文件是正确的,并且我正在使用我的 ios 分发证书进行签名。有什么想法吗? 我认为您可能需要确保您的签名身份已完全指定。 IE。而不仅仅是“iPhone Distribution”,您使用“iPhone Distribution: Company Ltd. (ABCD1234)” @jervine10 此外,-exportProvisioningProfile 的值是名称,不是 UUID,不是文件名,而是配置文件的实际名称(如 Xcode 中的 Provisioning Profiles 部分所示)构建设置)。如果您需要帮助找到这个,请告诉我。 谢谢,我确实设法弄清楚了,但在那之后我得到了我提到的错误。 @jervine10 您正在使用的配置文件的应用程序 ID 是否匹配?【参考方案2】:

好吧,我想我终于弄明白了。看起来 Bot Server 可能有一些苹果需要解决的问题。我注意到 Bot 服务器生成的分发 IPA 缺少我的应用程序所需的任何权利。我做了一些搜索,发现其他人也有同样的问题。这是一个很好地解释了这个问题的问题:IPA created via Xcode bot fails to run for APNS but runs if built manually via Xcode itself or built as an archive by Xcode

因此,考虑到这一点,我创建了一个权利文件并将其添加到我的项目中,其中包含我需要的最低权利。我对项目中的小部件也做了同样的事情。然后在我的后期集成触发期间,我读取了两个权利文件并为其添加了必要的权利。

# Copy the Entitlements file out of the payload so we can update it
APP_ENTITLEMENTS="/tmp/distributionEntitlements.plist"
rm -rf $APP_ENTITLEMENTS
codesign -d --entitlements :$APP_ENTITLEMENTS "/tmp/Payload/MyAppName.app"

WIDGET_ENTITLEMENTS="/tmp/widgetDistributionEntitlements.plist"
rm -rf $WIDGET_ENTITLEMENTS
codesign -d --entitlements :$WIDGET_ENTITLEMENTS "/tmp/Payload/MyAppName.app/Plugins/$WIDGET_NAME"

# Copy over the latest build the bot just created
echo "Copying latest Archive to /tmp/...";
cp -Rp "$XCS_ARCHIVE" "/tmp/"

APP="/tmp/Archive.xcarchive/Products/Applications/MyAppName.app"

echo "Updating entitlements file"
/usr/libexec/PlistBuddy -c "Add :beta-reports-active bool true" $APP_ENTITLEMENTS
/usr/libexec/PlistBuddy -c "Add :aps-environment string production" $APP_ENTITLEMENTS
cat $APP_ENTITLEMENTS

echo "Updating widget entitlements file"
/usr/libexec/PlistBuddy -c "Add :beta-reports-active bool true" $WIDGET_ENTITLEMENTS
cat $WIDGET_ENTITLEMENTS

当然,您必须再次对这些应用程序进行代码设计:

echo "Codesign the widget"
cp "$WIDGET_PROVISIONING_PROFILE" "$APP/Plugins/$WIDGET_NAME/embedded.mobileprovision"
codesign -fv -s "$FULL_SIGNING_IDENTITY" "$APP/Plugins/$WIDGET_NAME" --entitlements "$WIDGET_ENTITLEMENTS" --preserve-metadata=resource-rules,requirements

echo "Codesign the app"
codesign -fv -s "$FULL_SIGNING_IDENTITY" "$APP" --entitlements "$APP_ENTITLEMENTS" --preserve-metadata=resource-rules,requirements

echo "Creating .ipa"
# Remove any whitespace
FILENAME=$XCS_BOT_NAME// /
echo "Filename: $FILENAME"
APP_STORE_IPA="/tmp/$FILENAME_AppStore_$VERSION_NUMBER.ipa"
rm "$APP_STORE_IPA"
/usr/bin/xcrun -sdk iphoneos PackageApplication -v "$APP" -o "$APP_STORE_IPA" --sign "$SIGNING_IDENTITY" --embed "$PROVISIONING_PROFILE"

在这一切之后,我可以将此 IPA 上传到 Apple 并使用他们新的 TestFlight beta 分发工具进行分发。

【讨论】:

【参考方案3】:

我使用以下命令退出可能对您有用的 ipa。基本技术是解压缩 ipa,添加所需的移动配置文件,使用所需证书对代码进行签名,然后压缩到新的 ipa。

unzip -q "$IPAFILE"
cp "$PROV_PROFILE" Payload/*.app/embedded.mobileprovision
/usr/bin/codesign -f -s "$SIGN_CERT"  --keychain "$KEYCHAIN" \
     --entitlements Payload/*.app/$APP-Entitlements.plist \
     --resource-rules Payload/*.app/ResourceRules.plist Payload/*.app
zip -qr "$NEW_IPAFILE" Payload

如果您使用标准钥匙串,则可以省略 --keychain 选项。您的 Entitlements.plist 文件的名称可能不同。 SIGN_CERT 是您的证书的文本名称。例如“iPhone 分发:Blah Blah”

确保权利 plist 与您的签名证书和配置文件具有相同的 TEAM ID。

【讨论】:

【参考方案4】:

Xcode 会自动将此测试版权利添加到您的权利列表中。您只需进行新的修改,点击身份下的团队帐户,重新选择您的帐户,新的个人资料将由 iTunes connect 重新制作。

之后,上传您的新二进制文件。

上传后,您可以为您的应用分配 Beta 测试人员,选择预发布版本并将内部或外部 Beta 测试人员添加到列表中。

希望对你有所帮助。

【讨论】:

【参考方案5】:

执行此操作的更好方法是将发布配置文件设置为应用商店配置文件。那么您就不需要提供 --embed 标志,并且 beta 报告标志将为真。

然后,如果您还需要临时构建,您可以提供相同的 xcrun 命令 --embed 与临时配置文件。

ARCHIVE = "$ARCHIVE_FOLDER/Products/Applications/$PRODUCT_NAME.app"

#Adhoc
/usr/bin/xcrun -sdk iphoneos PackageApplication -v ARCHIVE -o IPA_DESTINATION --sign "SIGNING_IDENTITY" --embed PATH_TO_PROVISIONING_PROFILE 

#App Store
/usr/bin/xcrun -sdk iphoneos PackageApplication -v ARCHIVE -o IPA_DESTINATION --sign "SIGNING_IDENTITY"

【讨论】:

以上是关于如何使用应用商店配置文件退出应用以添加 beta-reports-active 密钥?的主要内容,如果未能解决你的问题,请参考以下文章

应用商店 Ad Hoc 配置文件无 beta 权利

iTunes Beta 测试和分发配置文件

Android 切换现有应用以上传密钥

我们是不是需要使用相同的证书和配置文件来分发新应用以替换 iOS 中的旧应用?

如何配置 azure 应用以在从应用中删除用户时发送通知

临时或分发到应用商店进行 Beta 测试?试飞