批量打包-解决推送

来源:互联网 发布: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

现在打包已经搞定。推送也没有问题了。

原创粉丝点击