批量打包-解决推送
来源:互联网 发布:mac chrome 导出插件 编辑:程序博客网 时间:2024/06/18 15:57
1.由于业务需要,我们需要将一个ipa打包为很多除了icon和名字不一样的App,利用企业账号分发下去,遇到很多坑。
我利用的是网上教程利用一个母包然后修改母包再次打包生成新的ipa文件
准备工作 1. 要打包的证书文件
2.ipa母包文件
3.子包的配置文件
脚本文件
#!/bin/bash resign.shfor file2 in `ls -a ./module`do if [ x"$file2" != x"." -a x"$file2" != x".." -a x"$file2" != x".DS_Store" ]; then echo $file2 #Conf file CONF=./module/$file2/resign.conf echo $CONF #Datetime NOW=$(date +"%Y%m%d_%s") #Load config if [ -f ${CONF} ]; then . ${CONF} fi #Temp TEMP="temp" if [ -e ${TEMP} ]; then echo "ERROR: temp already exists" exit 1 fi #Check app ID if [ -z ${APP_ID} ]; then echo "ERROR: missing APP_ID" exit 1 fi echo ${APP_ID} if [ -z ${APP_NAME} ]; then echo "ERROR: missing APP_NAME" exit 1 fi echo ${APP_NAME} if [ -z ${APP_SCHOOLCODE} ]; then echo "ERROR: missing APP_SCHOOLCODE" exit 1 fi echo ${APP_SCHOOLCODE} # if [ -z ${APP_SCHOOLMESSAGE} ]; then # echo "ERROR: missing APP_SCHOOLMESSAGE" # exit 1 # fi # echo ${APP_SCHOOLMESSAGE} #Create build dir if [[ ! -d ${BUILD_PATH} ]]; then mkdir ${BUILD_PATH} fi #Copy mother package if [[ ! -f "../Package/ipa/QA/LXTStudentClient.ipa" ]]; then echo "mother package not exists" exit 1 fi cp ../Package/ipa/QA/LXTStudentClient.ipa ./module/$file2${ASSETS_PATH}/${APP_NAME}.ipa #Unzip the mother ipa echo "Unzip ipa" unzip -q ./module/$file2${ASSETS_PATH}${APP_NAME}.ipa -d ${TEMP} #Remove old Codesignature echo "Remove old CodeSignature" rm -r "${TEMP}/Payload/${APP_NAME}.app/_CodeSignature" "${TEMP}/Payload/${APP_NAME}.app/CodeResources" 2> /dev/null | true #Replace embedded mobil provisioning profile echo "Replace embedded mobile provisioning profile" cp "./module/$file2${ASSETS_PATH}${PROFILE_NAME}.mobileprovision" "${TEMP}/Payload/${APP_NAME}.app/embedded.mobileprovision" # Change icon echo "Change icon" cp "./module/$file2${ASSETS_PATH}/Icon-iPad-40@2x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon40x40@2x~ipad.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPad-40.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon40x40~ipad.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-57.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon57x57.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-57@2x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon57x57@2x.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-60@2x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon60x60@2x.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-60@3x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon60x60@3x.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-29@3x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon29x29@3x.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-29@2x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon29x29@2x.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-29.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon29x29.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-40@3x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon40x40@3x.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-40@2x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon40x40@2x.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-20@3x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon20x20@3x.png" cp "./module/$file2${ASSETS_PATH}/Icon-iPhone-20@2x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon20x20@2x.png" # cp "./module/$file2${ASSETS_PATH}/AppIcon40x40@2x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon40@2x.png" # cp "./module/$file2${ASSETS_PATH}/AppIcon40x40@3x.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon40@3x.png" # cp "./module/$file2${ASSETS_PATH}/AppIcon57x57.png" "${TEMP}/Payload/${APP_NAME}.app/AppIcon29x29.png" # #Change Bundleversion # if [[ ! -z ${APP_BUNDLE_VERSION} ]]; then # /usr/libexec/PlistBuddy -c "Set CFBundleVersion ${APP_BUNDLE_VERSION}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist # fi # #Change CFBundleShortVersionString # if [[ ! -z ${APP_BUNDLE_SHORT_VERSION_STRING} ]]; then # /usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString ${APP_BUNDLE_SHORT_VERSION_STRING}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist # fi if [[ ! -z ${App_DisapleName} ]]; then /usr/libexec/PlistBuddy -c "Set CFBundleDisplayName ${App_DisapleName}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist fi # #Change Bundleidentifier # /usr/libexec/PlistBuddy -c "Set Bundle display name ${APP_NAME}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist /usr/libexec/PlistBuddy -c "Set CFBundleIdentifier ${APP_ID}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist /usr/libexec/PlistBuddy -c "Set school_code ${APP_SCHOOLCODE}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist #/usr/libexec/PlistBuddy -c "Set school_message ${APP_SCHOOLMESSAGE}" ${TEMP}/Payload/${APP_NAME}.app/Info.plist # #Create entitlements from template ENTITLEMENTS=$(<./templates/entitlements.template) ENTITLEMENTS=${ENTITLEMENTS//#APP_ID#/$APP_ID} ENTITLEMENTS=${ENTITLEMENTS//#APP_PREFIX#/$APP_PREFIX} echo ${ENTITLEMENTS} > ${TEMP}/entitlements.temp # #Re-sign # #这里注意命令参数的不同 # /usr/bin/codesign -f -s "${CERTIFICATE_TYPE}: ${CERTIFICATE_NAME}" --identifier "${APP_ID}" --entitlements "${TEMP}/entitlements.temp" --resource-rules "${TEMP}/Payload/${APP_NAME}.app/ResourceRules.plist" "${TEMP}/Payload/${APP_NAME}.app" /usr/bin/codesign -f -s "${CERTIFICATE_TYPE}: ${CERTIFICATE_NAME}" --identifier "${APP_ID}" --entitlements "${TEMP}/entitlements.temp" "${TEMP}/Payload/${APP_NAME}.app" # xcrun -sdk iphoneos xcodebuild -exportArchive ${TEMP}/Payload/${APP_NAME}.app -o /Users/apple/Desktop/Code/PHP更换接口/批量打包/三个机构打包正式/Resign-ipa/buildscrun/${APP_SCHOOLCODE}.ipa #Remove copyed mother package echo "Remove mother package" rm -rf ./module/$file2${ASSETS_PATH}/LXTStudentClient.ipa #Re-package echo "Re-package" cd ${TEMP} zip -qr "${APP_SCHOOLCODE}_resigned_${NOW}.ipa" Payload mv ${APP_SCHOOLCODE}_resigned_${NOW}.ipa ../${BUILD_PATH}/${APP_SCHOOLCODE}.ipa #Remove temp cd ../ rm -rf ${TEMP} fidoneexit 0
每一个包文件的配置文件
#Build pathBUILD_PATH="./build/"#Assets path (ipa, mobileprovision)ASSETS_PATH="/assets/"#IPA file name without extensionIPA_NAME="Teacher"#Original App_nameAPP_NAME="11111111111"#Original App_DisapleNameApp_DisapleName="11111111"#Provisionning profile file name without extensionPROFILE_NAME="1111111111111111"#Certificate type : iPhone Distribution /iPhone DeveloperCERTIFICATE_TYPE="iPhone Distribution"#Certificate name in keychainCERTIFICATE_NAME="1111111 11111111 111 1111111 1111 Co., Ltd."#App PrefixAPP_PREFIX="1111111111"#App ID (CFBundleIdentifier)#com.domain.appname#https://developer.apple.com/library/ios/documentation/general/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102070APP_ID="111.1111111.11111111"#Release version (CFBundleShortVersionString)#https://developer.apple.com/library/ios/documentation/general/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-111349APP_BUNDLE_SHORT_VERSION_STRING="1.4.5"#Build version (CFBundleVersion)#https://developer.apple.com/library/ios/documentation/general/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/20001431-102364APP_BUNDLE_VERSION="1.4.5"#App School_codeAPP_SCHOOLCODE="41a400983611e6a0dc00163e032fb9"
打包时候需要的entitlements.template 文件
<?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>#APP_PREFIX#.#APP_ID#</string> <key>aps-environment</key> <string>production</string> <key>com.apple.developer.team-identifier</key> <string>#APP_PREFIX#</string> <key>get-task-allow</key> <false/> <key>keychain-access-groups</key> <array> <string>#APP_PREFIX#.#APP_ID#</string> </array></dict></plist>
这里有一个很大的坑 在打包成功的情况下 ,我集成的极光推送一直收不到推送,通过log日志发现一直报错
通知注册报Code=3000 “未找到应用程序的“aps-environment”的授权字符串” UserInfo={NSLocalizedDescription=未找到应用程序的“aps-environment”的授权字符串}错误
1.通过查资料发现是证书配置的时候boundid和证书匹配,我再一次检查证书,发现没有问题。
2.我有开始检查我打包的语句,是不是那里出现问题,发现其他的语句打包了还是不能获得
3.然后我就在entitlements.template 文件中找问题 对于推送有一个参数aps-environment,我第一次在网上查到后加入了这个参数
aps-environment
development
但是打包后还是出现这个错误,由于我是生产环境 我将参数development 替换成了 production 再次打包搞定。
在网上查了这个文件
代码签名探析
https://objccn.io/issue-17-2/
entitlements 这个文件相当于一个授权文件 在打包的时候讲这个文件中的参数 传给codesign. 由于在xcode8 中我的这是push的时候,会自动生成一个文件,这个文件中显示的aps-environment
为development,但是打包后推送可以收到。
但是为什么是development 而不是 production
我觉得应该是xcode自动会帮你在写入的时候变为production
验证:用这个命令去打包 xcodebuild -workspace /Users/apple/Desktop/Code/XXXXXX/LXTStudentClient/XXXXXX.xcworkspace -scheme XXXXXX
成功后去看log日志
Entitlements:{ "application-identifier" = "XXXXXX.XX.XXXXXX.XXXXX"; "aps-environment" = production; "com.apple.developer.team-identifier" = XXXXXXXX; "get-task-allow" = 0;}
说明打包的时候已经将aps-environment 改为 production
现在打包已经搞定。推送也没有问题了。
- 批量打包-解决推送
- android ant多渠道 批量打包 遇到问题及解决
- openfire批量推送
- openfire批量推送
- XCode 8.3.1 打包ipa 解决不能收到推送消息问题
- Android Framework 批量编译-批量推送 脚本
- android 实现批量打包
- 自动批量打包步骤
- Ant批量多渠道打包
- ant 批量打包
- Android批量打包
- linux 批量 压缩 打包
- shell 批量打包
- ANT批量打包
- android 批量打包apk
- 安卓多平台批量打包
- Gradle批量打包
- Unity3D脚本批量打包
- 比特币交易(Bitcoin Transactions)
- Linux/Windows系统内核性能调优
- [P1215]母亲的牛奶
- python传递参数方式小结
- 我是一个线程
- 批量打包-解决推送
- 跨域问题 XHR实现跨域资源共享(CORS)
- 深度学习(1)LINUX下深度学习环境安装
- 网络-TCP、UDP
- 一个经典的智力题
- iterator()
- 图片旋转问题(指针旋转问题)
- 页面置换算法
- Android双进程守护