Xcode .mobileprovision文件是否可以从命令行“安装”?

我试图自动化使用在Mac Mini服务器(OSX 10.7)上运行的bash脚本为我们的客户创build应用程序的过程。

我的脚本是基于github上原本在https://gist.github.com/949831上发布的壮观有用的脚本

我正在使用xcodebuild构build应用程序,然后使用xcrun签署和embeddedmobileprovision文件。

当我用mobileprovision文件完成所有这些工作时,我使用GUI手动安装到Xcode(例如,双击),它工作正常。 如果我只是尝试使用SCP复制到服务器上的mobileprovision文件,它会失败(代码签名错误:无法findconfiguration文件“123abc123”。)

据推测这是因为该文件不是“安装”。

有没有办法从terminal安装mobileprovision文件? 我正在使用SSH,因此使用诸如“打开”命令之类的东西将无法工作。

谢谢!

如果你不想下载外部依赖项(比如Ben),大多数情况下,下面的代码可以工作:

uuid=`grep UUID -A1 -a adhoc.mobileprovision | grep -io "[-A-F0-9]\{36\}"` cp adhoc.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/$uuid.mobileprovision 

请注意, UUID由hex数字组成,因此正确的范围是[-A-F0-9]而不是[-A-Z0-9]

奖金:下载并安assembly置文件

使用cupertino工具 ,以下片段从Developer Portal下载所有的发布configuration文件并安装它们。

 ios profiles:download:all --type distribution for file in *.*provision*; do uuid=`grep UUID -A1 -a "$file" | grep -io "[-A-F0-9]\{36\}"` extension="${file##*.}" echo "$file -> $uuid" mv -f "$file" ~/Library/MobileDevice/Provisioning\ Profiles/"$uuid.$extension" done 

cupertino( ios命令)可以安装sudo gem install cupertino

自从问这个问题以来,我自己就build立了一个解决scheme。 秘密是简单地将文件复制到〜/ Library / MobileDevice / Provisioning Profiles /文件夹,但是(这里是棘手的位)重命名为[The UUID] .mobileprovision。

UUID被保存在文件本身的文本部分(在plist中)。 不幸的是,该文件还包括二进制,所以“默认阅读”不能读取它。 幸运的是, 这个人build立了一个小命令行工具来获得UUID(和其他一些东西了)。

这是我完整的工作脚本:

https://gist.github.com/2568707

所有其他答案的汇编update_provisioning_profile.sh :

 #!/bin/sh # # Download and install a single iOS provisioning profile # Requires https://github.com/nomad/cupertino # # Usage # - Login to your account once: # ios login # - Configure TEAM and PROFILE (instructions below) # - Run update_provisioning_profile.sh at anytime, usually after adding/removing devices to the profile # Configure the team identifier # Copy it from developer portal or just use cupertino to get it: # ios devices # Copy the string in parens and set it as TEAM TEAM="team id" # Configure the profile name you want to manage # Copy it from developer portal or use cupertino to get a list (ignoring Xcode managed profiles): # ios profiles --team ${TEAM} | grep -v 'iOS Team Provisioning Profile' # Copy the name as-is and set as PROFILE PROFILE="profile name" # Fetch the profile using `cupertino` tool # you need to run `ios login` once to setup the account ios profiles:download "${PROFILE}" --team ${TEAM} PROFILE_FILE=`echo $PROFILE | tr ' ' '_'` # `cupertino` tool will replace spaces with _ UUID=`/usr/libexec/PlistBuddy -c 'Print :UUID' /dev/stdin <<< $(security cms -D -i ${PROFILE_FILE}.mobileprovision)` # copy where Xcode can find it cp ${PROFILE_FILE}.mobileprovision "$HOME/Library/MobileDevice/Provisioning Profiles/${UUID}.mobileprovision" # clean rm ${PROFILE_FILE}.mobileprovision 

轻松适应您的configuration需求。

看起来苹果在每个键值对下方的.mobileprovisionconfiguration文件文件中添加了空行,grep选项不再起作用。

以下是如何用PlistBuddy检索它并使用python脚本进行安全性检索

 command = "/usr/libexec/PlistBuddy -c 'Print :UUID' /dev/stdin <<< $(security cms -D -i abc.mobileprovision)" uuid = os.popen(command).readline().rstrip('\n') 

我们在Jenkins运行我们的构build,并有类似的问题。 我们的Ad Hocconfigurationconfiguration文件经常变化,我们不想在每次更改时都在xcode中安装每个构build从属服务器,所以下面是我的工作:

 /usr/bin/xcrun -sdk iphoneos PackageApplication -v <path to yourapp.app> -o <path to your .ipa file> --sign "<Name of signing identity>" --embed <path to .mobileprovision file> 

“”是您在目标的“生成设置”中的“代码签名”部分中看到的内容。

看来cupertino没有任何近期的发展。 Fastlane有一个名为Fastlane的工具来pipe理configuration文件(创build,下载,更新,修复): https : //github.com/fastlane/fastlane/tree/master/sigh#readme

使用fastlane叹息安装一个特定的临时文件,或者你可以创build一个新的。

 fastlane sigh renew --adhoc -n "provisional-profile-name" --app_identifier "app-identifier" -u "user-name" --ignore_profiles_with_different_name 

temporary-profile-name只是configuration文件的名称,不包含.mobileprovision扩展名。

要创build一个新的adhocconfiguration文件,添加所有的设备UUID,

 fastlane sigh --adhoc --app_identifier "app-identifier" -u "username" 

中fastfile,

 lane :build do sigh( adhoc: true, app_identifier: "***APP_ID**", provisioning_name: "**Profile_name**", username: "Apple_ID", force: true, skip_certificate_verification: true, ) gym( #export_options: "exportPlist.plist", scheme: "**scheme-name**", export_method: "ad-hoc", xcargs: "PROVISIONING_PROFILE=$SIGH_UUID", ) end