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
现在打包已经搞定。推送也没有问题了。