当前位置:   article > 正文

iOS自动签名打包(xcodebuild)----常用_ios xcodebuild ipa打包如何指定证书

ios xcodebuild ipa打包如何指定证书

iOS自动打包主要用xcodebuild命令, 在终端输入xcodebuild --help可以查看xcodebuild的参数。

xcodebuild具体语法:

  • workspace的工程

    xcodebuild [-project name.xcodeproj] [[-target targetname] … | -alltargets] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

    xcodebuild [-project name.xcodeproj] -scheme schemename [[-destination destinationspecifier] …] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

命令中可以添加一些参数实现在命令执行时配置不同的环境。比如,如果想archive 出Debug环境的包,那么就可以在命令中添加-configuration Debug 参数。还可以通过添加PROVISIONING_PROFILE参数来指定签名所用的 Profile 文件的UUID

  • 对于基于workspace的工程,比如cocoapods项目,脚本格式如下:

    xcodebuild -workspace name.xcworkspace -scheme schemename [[-destination destinationspecifier] …] [-destination-timeout value] [-configuration configurationname] [-sdk [sdkfullpath | sdkname]] [action …] [buildsetting=value …] [-userdefault=value …]

当然还有很多可选参数,在这就不一一列举了,如果有兴趣可以通过xcodebuild --help查看。

shell脚本(工程不是WorkSpace)

脚本下载路径:github下载地址

  1. #author by 得力
  2. #注意:脚本目录和xxxx.xcodeproj要在同一个目录,如果放到其他目录,请自行修改脚本。
  3. #工程名字(Target名字)
  4. Project_Name="Target名字,系统默认和工程名字一样"
  5. #配置环境,Release或者Debug
  6. Configuration="Release"
  7. #AdHoc版本的Bundle ID
  8. AdHocBundleID="com.xxx"
  9. #AppStore版本的Bundle ID
  10. AppStoreBundleID="com.xxx"
  11. #enterprise的Bundle ID
  12. EnterpriseBundleID="com.xxx"
  13. # ADHOC
  14. #证书名#描述文件
  15. ADHOCCODE_SIGN_IDENTITY="iPhone Distribution: xxxx"
  16. ADHOCPROVISIONING_PROFILE_NAME="xxxx-xxxx-xxxx-xxxx"
  17. #AppStore证书名#描述文件
  18. APPSTORECODE_SIGN_IDENTITY="iPhone Distribution: xxxx"
  19. APPSTOREROVISIONING_PROFILE_NAME="xxxx-xxxx-xxxx-xxxx"
  20. #企业(enterprise)证书名#描述文件
  21. ENTERPRISECODE_SIGN_IDENTITY="iPhone Distribution: xxxxx"
  22. ENTERPRISEROVISIONING_PROFILE_NAME="xxxx-xxxx-xxxx-xxxx"
  23. #加载各个版本的plist文件
  24. ADHOCExportOptionsPlist=./ADHOCExportOptionsPlist.plist
  25. AppStoreExportOptionsPlist=./AppStoreExportOptionsPlist.plist
  26. EnterpriseExportOptionsPlist=./EnterpriseExportOptionsPlist.plist
  27. ADHOCExportOptionsPlist=${ADHOCExportOptionsPlist}
  28. AppStoreExportOptionsPlist=${AppStoreExportOptionsPlist}
  29. EnterpriseExportOptionsPlist=${EnterpriseExportOptionsPlist}
  30. echo "~~~~~~~~~~~~选择打包方式(输入序号)~~~~~~~~~~~~~~~"
  31. echo " 1 appstore"
  32. echo " 2 adhoc"
  33. echo " 3 enterprise"
  34. # 读取用户输入并存到变量里
  35. read parameter
  36. sleep 0.5
  37. method="$parameter"
  38. # 判读用户是否有输入
  39. if [ -n "$method" ]
  40. then
  41. #clean下
  42. xcodebuild clean -xcodeproj ./$Project_Name/$Project_Name.xcodeproj -configuration $Configuration -alltargets
  43. if [ "$method" = "1" ]
  44. then
  45. #appstore脚本
  46. xcodebuild -project $Project_Name.xcodeproj -scheme $Project_Name -configuration $Configuration -archivePath build/$Project_Name-appstore.xcarchive clean archive build CODE_SIGN_IDENTITY="${APPSTORECODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${APPSTOREROVISIONING_PROFILE_NAME}" PRODUCT_BUNDLE_IDENTIFIER="${AppStoreBundleID}"
  47. xcodebuild -exportArchive -archivePath build/$Project_Name-appstore.xcarchive -exportOptionsPlist $AppStoreExportOptionsPlist -exportPath ~/Desktop/$Project_Name-appstore.ipa
  48. elif [ "$method" = "2" ]
  49. then
  50. #adhoc脚本
  51. xcodebuild -project $Project_Name.xcodeproj -scheme $Project_Name -configuration $Configuration -archivePath build/$Project_Name-adhoc.xcarchive clean archive build CODE_SIGN_IDENTITY="${ADHOCCODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${ADHOCPROVISIONING_PROFILE_NAME}" PRODUCT_BUNDLE_IDENTIFIER="${AdHocBundleID}"
  52. xcodebuild -exportArchive -archivePath build/$Project_Name-adhoc.xcarchive -exportOptionsPlist $ADHOCExportOptionsPlist -exportPath ~/Desktop/$Project_Name-adhoc.ipa
  53. elif [ "$method" = "3" ]
  54. then
  55. #企业打包脚本
  56. xcodebuild -project $Project_Name.xcodeproj -scheme $Project_Name -configuration $Configuration -archivePath build/$Project_Name-enterprise.xcarchive clean archive build CODE_SIGN_IDENTITY="${ENTERPRISECODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${ENTERPRISEROVISIONING_PROFILE_NAME}" PRODUCT_BUNDLE_IDENTIFIER="${EnterpriseBundleID}"
  57. xcodebuild -exportArchive -archivePath build/$Project_Name-enterprise.xcarchive -exportOptionsPlist $EnterpriseExportOptionsPlist -exportPath ~/Desktop/$Project_Name-enterprise.ipa
  58. else
  59. echo "参数无效...."
  60. exit 1
  61. fi
  62. fi

注意:1.由于脚本配置的路径问题,所以xcodebuild.shxxx.xcodeproj放到同一个目录下,否则会出现路径问题。如图所示:


脚本目录和工程在同一个目录

2.由于Xcode8可以在Project->General中自动配置证书,所以用脚本打包前先去掉该功能。如图所示:


去掉自动配置证书

3.配置脚本,需要配置的信息如下图,不需要的版本可以不用配置。比如只需要AppStoreipa,则只需要配置AppStore版本相关的配置。


配置脚本

4.执行脚本,打开终端,cd到当前脚本所在路径,然后执行: ./xcodebuild.sh即可。
5.导出的ipa包默认保存到桌面,当前保存目录如果需要修改,可以自己修改脚本。如图所示,比如我项目名字是OneProject,则导出的包如下图:


ipa包文件夹

打开文件夹就是ipa包了,如图:


ipa包


6.如何查看证书名字和配置文件的UUID呢?
打开钥匙串访问,找到证书,点击显示简介,里面有个常用名字,复制到脚本中即可,如图所示:


证书

常用名称

配置文件UUID可以在Xcode中查看,Xcode->Preferences...->Accounts,如下图:

或终端输入命令获取Xcode UUID :

defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID

 


点击View Details

点击Show in Finder

配置文件UUID

上面的配置文件的名字是6994F55C-1960-4EF9-AA7E-9C1FABDBA7A8.mobileprovision。则配置的文件的UUID就是6994F55C-1960-4EF9-AA7E-9C1FABDBA7A8。所以复制6994F55C-1960-4EF9-AA7E-9C1FABDBA7A8到脚本中。

执行脚本

打开终端,cd到当前脚本所在路径,在终端输入:./xcodebuild.sh,点击回车即可。

WorkSpace脚本

如果你的项目用的workspace,或者cocoapods,则上面的脚本不适用了,具体脚本如下,脚本配置和上面一样。
脚本下载路径:github下载地址

  1. #author by 得力
  2. #注意:脚本目录和WorkSpace目录在同一个目录
  3. #工程名字(Target名字)
  4. Project_Name="Target名字,系统默认等于工程名字"
  5. #workspace的名字
  6. Workspace_Name="WorkSpace名字"
  7. #配置环境,Release或者Debug,默认release
  8. Configuration="Release"
  9. #AdHoc版本的Bundle ID
  10. AdHocBundleID="com.xxxx"
  11. #AppStore版本的Bundle ID
  12. AppStoreBundleID="com.xxxx"
  13. #enterprise的Bundle ID
  14. EnterpriseBundleID="com.xxxx"
  15. # ADHOC证书名#描述文件
  16. ADHOCCODE_SIGN_IDENTITY="iPhone Distribution: xxxx"
  17. ADHOCPROVISIONING_PROFILE_NAME="xxxxx-xxxx-xxxx-xxxx-xxxxxx"
  18. #AppStore证书名#描述文件
  19. APPSTORECODE_SIGN_IDENTITY="iPhone Distribution: xxxxx"
  20. APPSTOREROVISIONING_PROFILE_NAME="xxxxx-xxxx-xxxx-xxxx-xxxxxx"
  21. #企业(enterprise)证书名#描述文件
  22. ENTERPRISECODE_SIGN_IDENTITY="iPhone Distribution: xxxx"
  23. ENTERPRISEROVISIONING_PROFILE_NAME="xxxxx-xxxx-xxx-xxxx"
  24. #加载各个版本的plist文件
  25. ADHOCExportOptionsPlist=./ADHOCExportOptionsPlist.plist
  26. AppStoreExportOptionsPlist=./AppStoreExportOptionsPlist.plist
  27. EnterpriseExportOptionsPlist=./EnterpriseExportOptionsPlist.plist
  28. ADHOCExportOptionsPlist=${ADHOCExportOptionsPlist}
  29. AppStoreExportOptionsPlist=${AppStoreExportOptionsPlist}
  30. EnterpriseExportOptionsPlist=${EnterpriseExportOptionsPlist}
  31. echo "~~~~~~~~~~~~选择打包方式(输入序号)~~~~~~~~~~~~~~~"
  32. echo " 1 adHoc"
  33. echo " 2 AppStore"
  34. echo " 3 Enterprise"
  35. # 读取用户输入并存到变量里
  36. read parameter
  37. sleep 0.5
  38. method="$parameter"
  39. # 判读用户是否有输入
  40. if [ -n "$method" ]
  41. then
  42. if [ "$method" = "1" ]
  43. then
  44. #adhoc脚本
  45. xcodebuild -workspace $Workspace_Name.xcworkspace -scheme $Project_Name -configuration $Configuration -archivePath build/$Project_Name-adhoc.xcarchive clean archive build CODE_SIGN_IDENTITY="${ADHOCCODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${ADHOCPROVISIONING_PROFILE_NAME}" PRODUCT_BUNDLE_IDENTIFIER="${AdHocBundleID}"
  46. xcodebuild -exportArchive -archivePath build/$Project_Name-adhoc.xcarchive -exportOptionsPlist ${ADHOCExportOptionsPlist} -exportPath ~/Desktop/$Project_Name-adhoc.ipa
  47. elif [ "$method" = "2" ]
  48. then
  49. #appstore脚本
  50. xcodebuild -workspace $Workspace_Name.xcworkspace -scheme $Project_Name -configuration $Configuration -archivePath build/$Project_Name-appstore.xcarchive archive build CODE_SIGN_IDENTITY="${APPSTORECODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${APPSTOREROVISIONING_PROFILE_NAME}" PRODUCT_BUNDLE_IDENTIFIER="${AppStoreBundleID}"
  51. xcodebuild -exportArchive -archivePath build/$Project_Name-appstore.xcarchive -exportOptionsPlist ${AppStoreExportOptionsPlist} -exportPath ~/Desktop/$Project_Name-appstore.ipa
  52. elif [ "$method" = "3" ]
  53. then
  54. #企业打包脚本
  55. xcodebuild -workspace $Workspace_Name.xcworkspace -scheme $Project_Name -configuration $Configuration -archivePath build/$Project_Name-enterprise.xcarchive archive build CODE_SIGN_IDENTITY="${ENTERPRISECODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${ENTERPRISEROVISIONING_PROFILE_NAME}" PRODUCT_BUNDLE_IDENTIFIER="${EnterpriseBundleID}"
  56. xcodebuild -exportArchive -archivePath build/$Project_Name-enterprise.xcarchive -exportOptionsPlist ${EnterpriseExportOptionsPlist} -exportPath ~/Desktop/$Project_Name-enterprise.ipa
  57. else
  58. echo "参数无效...."
  59. exit 1
  60. fi
  61. fi

可能出现的问题

1.如果配置的证书名字、BundleID配置文件UUID不一致,脚本就会报错,这个可以看脚本提示错误,由于错误非常明显,所以就不在截图了。
2.如果执行脚本的过程出现如下错误,在终端输入:rvm system,回车即可。



3.如果执行脚本的过程出现-bash: ./xx.sh: Permission denied,表示权限问题,所以在终端执行:chmod 777 xx.sh,然后回车即可,但是要注意: chmod 777后面是脚本路径。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号