命令行更新预配资料

56

在这方面我找不到任何相关的信息(也许是我使用了错误的搜索关键词..):
我们正在尝试为我们的应用程序构建一个合理的持续集成环境。为了有一个真正明智的实现,构建服务器应该能够通过命令行自动刷新所使用的苹果设备配置文件,类似于X-Code组织者的功能,但是自动化的。
是否有任何线索表明这是可能的?


请查看以下网址:<br> https://dev59.com/NW855IYBdhLWcg3wYjWF 我认为这会有所帮助。 - jfalexvijay
1
感谢您的提问。到目前为止,我的命令行解决方案是 $ open vnc://server ;-) - mpontillo
5个回答

58

以下是我的bash脚本,其中脚本的第一个参数($1)代表新配置文件的位置。

rm -Rf ~/Library/MobileDevice/Provisioning\ Profiles/*
cp "$1"/*.* ~/Library/MobileDevice/Provisioning\ Profiles/

基本上,那个~/Library/MobileDevice/Provisioning Profiles/文件夹中的任何内容都可以用来进行构建(并将显示在Xcode中)。

如果您想搭建一个CI系统,我最近就如何使用Hudson进行演示,并发布了一些幻灯片和笔记在这里。如果您有任何问题,请发送电子邮件给我,我的电子邮件地址在我的网站上。


3
谢谢你的回答。但是你有没有想过如何获得1美元?首先,你如何将这些资料导入你的构建机器中呢? - Blitz
5
我的工作主要是承包,每个客户都有自己的iTunes Connect帐户,因此我把这个任务交给了他们。我已经培训他们如何使用新的UDID更新预配配置文件,并向每个客户分享了一个Dropbox.com文件夹,他们可以在其中保存它们特定的预配配置文件。我的构建过程的第一步是使用Dropbox上的客户特定预配配置文件更新预配配置文件,以便构建始终使用最新版本。上传新配置文件也会触发构建,因此他们可以添加新设备并获得全新的构建,而无需我的干预。 - James J
我在Hudson中安装了一个插件,忘记名字了,它检查文件夹的内容是否有变化。这是基于项目配置的,Hudson中的每个项目都会检查Dropbox中特定于项目的文件夹是否有更改(例如新的预配资料)。 - James J
3
我认为这个解决方案值得注意的是它说明了你不需要将文件重命名为<provid>.mobileprovision,这是在使用XCode(我使用的是4.2)导入文件时发生的事情。这意味着对于xcrun ... PackageApplication命令中的 --embed参数可以保持稳定,从而使自动化变得更加容易。 - ckhan
@James J,那项目文件本身呢?它们能自动更新以使用新的prov文件吗?也就是说,我有5个项目都使用相同的DEV prov,目前我必须进入所有5个XCode项目并手动选择正确的provisioning文件。我想将其作为构建的一部分自动化。目前的想法是,编写一些awk/sed脚本来将正确的UDID插入到proj文件中... - ThaDon
显示剩余2条评论

16
更新:Cupertino将不再使用最新的iTunes。考虑使用sigh代替。
听起来这个命令行界面将会大有帮助: https://github.com/nomad/cupertino 它允许您下载所有分销配置文件,如下所示(感谢@tdubik): ios profiles:download:all --type distribution 另一种方法是使用企业开发许可证(每年$300),该许可证允许您为设备构建应用程序而无需进行任何配备!因此,您可以构建您的应用程序,并将其发送到设备,而无需去苹果开发中心或注册任何新设备。
请注意,这不允许您将应用程序分发给应用商店,但如果您是为客户构建大量应用程序的开发公司,则可能会减轻您的“构建并发送给客户”过程!我不确定这是否符合苹果的正当使用政策,请在考虑此选项之前检查一下。但这可能是原型等方面需要考虑的内容,当他们真正想要发布时,您需要让他们获取自己的开发者计划许可证。

3
企业授权无法用于App Store分发,因此您需要具有另一个与苹果的开发者账户才能有效地使用此产品(假设您打算将您的应用程序发布到App Store)。 - danieljimenez
2
感谢提供 Github 链接!这是最佳答案。然而,我不建议使用 Enterprise 来为客户构建应用程序 - 苹果不喜欢这样做。Enterprise 仅限于“公司内部部署”,我相信协议规定您必须控制所有与 Enterprise 一起使用的设备。 - Sperr
是的,我不确定那是否正确... 我也预料到了,并且想着比我更有经验的人会知道... 感谢你的澄清! - Brad Parks
1
使用Cupertino,只需执行ios profiles:download:all --distribution即可轻松完成。 - Tomasz Dubik
1
这是 Fastlane 开发的一个工具 sigh 的链接,用于管理配置文件(创建、下载、更新、修复):https://github.com/fastlane/fastlane/tree/master/sigh#readme - Toland Hon
显示剩余2条评论

1

尝试使用https://github.com/lacostej/apple-dev中的apple_dev_center.rb。

它可以解析苹果开发者网站上的信息,并自动下载配置文件,使您可以将它们复制到正确的位置。


1

我一直在尝试让这个工作起来,终于成功了!

可以使用fastlane sigh仅下载和安装你需要的临时配置文件。

fastlane sigh renew --adhoc -n "provisional_profile_name"
--app_identifier "your_app_identifier" -u "apple_login _username" --ignore_profiles_with_different_name

注意:该命令需要系统中已安装任何应用程序的临时配置文件。否则,它会向我抛出错误。 provisional_profile_name = 只需配置文件名称,不需要扩展名。

1
Sigh可以为您管理配置文件。但是,它不支持安装您已经获取的配置文件。然而,我仍然发现查看他们的源代码以了解他们如何在下载后安装配置文件非常有价值。
幸运的是,这非常类似于James J的答案
def self.install_profile(profile)
  UI.message "Installing provisioning profile..."
  profile_path = File.expand_path("~") + "/Library/MobileDevice/Provisioning Profiles/"
  uuid = ENV["SIGH_UUID"] || ENV["SIGH_UDID"]
  profile_filename = uuid + ".mobileprovision"
  destination = profile_path + profile_filename

  # If the directory doesn't exist, make it first
  unless File.directory?(profile_path)
    FileUtils.mkdir_p(profile_path)
  end

  # copy to Xcode provisioning profile directory
  FileUtils.copy profile, destination

  if File.exist? destination
    UI.success "Profile installed at \"#{destination}\""
  else
    UI.user_error!("Failed installation of provisioning profile at location: #{destination}")
  end
end

我有一个脚本可以为我执行本地安装:

#!/bin/bash -euo pipefail

BASH_SOURCE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

cd "$BASH_SOURCE_DIR"

# by default bash passes the glob characters if nothing matched the glob
# disable that
# https://dev59.com/h2Mk5IYBdhLWcg3w3xvq#18887210
shopt -s nullglob
# this creates a proper bash array, which we need since our profiles
# have funny characters in them
MOBILE_PROVISIONS=(*.mobileprovision)
# re-enable default nullglob behavior
shopt -u nullglob

# On a brand new machine that has never run any app on a development device
# the ~/Library/MobileDevice/"Provisioning Profiles" directory doesn't exist
mkdir -p ~/Library/MobileDevice/"Provisioning Profiles"

for mobileprovision in "${MOBILE_PROVISIONS[@]}"
do
  uuid=$( ./uuid-from-mobileprovision.bash "${mobileprovision}" )
  cp "${mobileprovision}" ~/Library/MobileDevice/"Provisioning Profiles"/"${uuid}".mobileprovision
done

这取决于另一个名为uuid-from-mobileprovision.bash的脚本:

#!/bin/bash -euo pipefail

if [ ! -f "${1}" ]
then
  echo "Usage: $0 <path/to/mobileprovision/file>" 1>&2
  exit 1
fi

UUID=$( grep --text --after-context=1 UUID "${1}" | grep --ignore-case --only-matching "[-A-Z0-9]\{36\}" )
if [ -z "${UUID}" ]
then
  echo "Invalid mobileprovision file: ${1}" 1>&2
  exit 2
else
  echo "${UUID}"
fi

快车道能够与免费的开发者账户一起使用吗?它一直给我一个错误,说我没有user_details_data的权限。 - Elliott B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接