批量打包-解决推送

1.由于业务需要,我们需要将一个ipa打包为很多除了icon和名字不一样的App,利用企业账号分发下去,遇到很多坑。
我利用的是网上教程利用一个母包然后修改母包再次打包生成新的ipa文件

准备工作 1. 要打包的证书文件
2.ipa母包文件
3.子包的配置文件
脚本文件

#!/bin/bash          resign.sh

for 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}

    fi
done
exit 0

每一个包文件的配置文件

#Build path
BUILD_PATH="./build/"

#Assets path (ipa, mobileprovision)
ASSETS_PATH="/assets/"

#IPA file name without extension
IPA_NAME="Teacher"

#Original App_name
APP_NAME="11111111111"

#Original App_DisapleName
App_DisapleName="11111111"

#Provisionning profile file name without extension
PROFILE_NAME="1111111111111111"

#Certificate type : iPhone Distribution /iPhone Developer
CERTIFICATE_TYPE="iPhone Distribution"

#Certificate name in keychain
CERTIFICATE_NAME="1111111 11111111 111 1111111 1111 Co., Ltd."

#App Prefix
APP_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-102070
APP_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-111349
APP_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-102364
APP_BUNDLE_VERSION="1.4.5"

#App School_code
APP_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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值