一、說明
首先要明確肥矢,無論是越獄真機(jī)調(diào)試還是越獄 ipa 打包端衰,都是需要進(jìn)行代碼簽名的,唯一的區(qū)別是使用蘋果簽發(fā)的證書或者自簽名證書進(jìn)行代碼簽名橄抹。
可配置 Xcode 支持無證書編譯靴迫,但是如果不簽名,就算是越獄機(jī)器也會提示:無法安裝此App楼誓,因?yàn)闊o法驗(yàn)證其完整性玉锌。
- 真機(jī)調(diào)試流程:
- 用 Xcode 進(jìn)行無證書編譯;
- 編譯完成疟羹,用自簽名證書進(jìn)行代碼簽名主守;
- Xcode 連接越獄真機(jī)調(diào)試;
- 越獄 ipa 打包(企業(yè)簽)流程:
- 用 Xcode 進(jìn)行無證書編譯榄融;
- 編譯完成参淫,用自簽名證書對
.xcarchive
進(jìn)行代碼簽名; - 把
.xcarchive
打包成ipa
文件愧杯;
二涎才、準(zhǔn)備
- 越獄成功的蘋果手機(jī)或者iPad等設(shè)備;
- 越獄設(shè)備必須安裝
AppSync
插件力九,該插件繞過 iOS 系統(tǒng)的簽名驗(yàn)證耍铜,使自簽名 app 可以正常運(yùn)行; - 使用
鑰匙串訪問
創(chuàng)建自簽名證書跌前; - 環(huán)境:macOS14.6.1 + Xcode16.2
三棕兼、Xcode 無證書編譯
1. Xcode 配置
修改以下配置文件,版本不同路徑有區(qū)別抵乓。使用 Xcode 修改伴挚,注意權(quán)限問題靶衍。
vi /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.2.sdk/SDKSettings.plist
DefaultProperties.ENTITLEMENTS_REQUIRED = NO
DefaultProperties.CODE_SIGNING_REQUIRED = NO
vi /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Info.plist
DefaultProperties.CODE_SIGN_CONTEXT_CLASS = XCCodeSignContext
2. Xcode 工程編譯設(shè)置
選主 TARGERT 點(diǎn)擊 Build Settings
,點(diǎn)左上“+”號:Add User-Defined Setting
CODE_SIGNING_ALLOWED = NO
可在自動編譯 C# 源碼添加:
proj.AddBuildProperty("Unity-iPhone", "CODE_SIGNING_ALLOWED", "NO");
四茎芋、越獄真機(jī)調(diào)試
1. Xcdoe 設(shè)置
主 TARGERT 添加 Build Phases/Run Script
颅眶,給 app 和 framework 進(jìn)行簽名:
if [ "${CODE_SIGNING_ALLOWED}" == "NO" ]; then
cd "${PROJECT_DIR}/../iOSBuild"
sh XcodeSigning.sh "${PRODUCT_BUNDLE_IDENTIFIER}" "${PROVISIONING_PROFILE}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
sh XcodeSigning.sh "${PRODUCT_BUNDLE_IDENTIFIER}" "${PROVISIONING_PROFILE}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Frameworks/UnityFramework.framework/"
fi
可在自動編譯 C# 源碼添加:
proj.AddShellScriptBuildPhase("Unity-iPhone", "Run Script", "", "<同以上腳本>");
XcodeSigning.sh
腳本貼在最后。
2. 調(diào)試
連上越獄真機(jī)败徊,即可正常編譯調(diào)試帚呼。
五、越獄 ipa 打包
1. 編譯
先編譯出 .xcarchive
包皱蹦;
2. 打包
使用腳本進(jìn)行打包煤杀,BuildIPA.sh
腳本貼在最后。
sh BuildIPA.sh <path_to>.xcarchive/Products/Applications/<your_app>.app/
3. 重簽
腳本支持重簽沪哺,可改成從 .mobileprovision
文件中讀取生成 entitlements.plist
文件:
/usr/libexec/PlistBuddy -x -c "print:Entitlements" /dev/stdin <<< $(security cms -D -i "${PROVISION}") > entitlements.plist
六沈自、附:腳本
XcodeSigning.sh
#!/bin/bash
APP_ID="$1"
APP_CERT="$2"
APP_TARGET="$3"
TEAM_ID="$4"
if [ "$TEAM_ID" == "" ]; then
TEAM_ID="team"
fi
if [ "$APP_ID" == "" ] || [ "$APP_CERT" == "" ] || [ "$APP_TARGET" == "" ] || [ "$TEAM_ID" == "" ]; then
echo "Usage: $(basename $0) APP_ID APP_CERT APP_TARGET [TEAM_ID]"
echo " $(basename $0) "'"${PRODUCT_BUNDLE_IDENTIFIER}" "${PROVISIONING_PROFILE}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"'
exit 1
fi
echo "Gen entitlements plist file..."
ENT_PLIST="$(mktemp)"
cat > $ENT_PLIST <<EOF
<?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>${TEAM_ID}.${APP_ID}</string>
<key>aps-environment</key>
<string>production</string>
<key>com.apple.developer.associated-domains</key>
<string>*</string>
<key>com.apple.developer.team-identifier</key>
<string>${TEAM_ID}</string>
<key>com.apple.security.application-groups</key>
<array>
<string>group.${APP_ID}.appshortcallid</string>
<string>group.${APP_ID}.appcallid</string>
</array>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>${TEAM_ID}.*</string>
<string>com.apple.token</string>
</array>
</dict>
</plist>
EOF
echo "Code signing..."
set -x
codesign -f -s "$APP_CERT" --entitlements $ENT_PLIST "${APP_TARGET}" || exit $?
BuildIPA.sh
#!/bin/bash
APP_ID="com.team.app"
APP_CERT="test"
TEAM_ID="team"
if [ "$1" == "" ]; then
echo "Usage: $(basename $0) <path_to>.xcarchive/Products/Applications/<your_app>.app/"
exit 1
fi
APP_PATH=${1/.app\//.app}
APP_NAME=$(basename "$APP_PATH")
APP_NAME="${APP_NAME%.*}"
APP_TARGET="Payload/${APP_NAME}.app"
echo "App name: ${APP_NAME}"
echo "Copy app files..."
rm -rf Payload || exit $?
mkdir -p Payload || exit $?
rsync -a "$APP_PATH" Payload || exit $?
# signing
sh XcodeSigning.sh "$APP_ID" "$APP_CERT" "$APP_TARGET" "$TEAM_ID" || exit $?
sh XcodeSigning.sh "$APP_ID" "$APP_CERT" "$APP_TARGET/Frameworks/UnityFramework.framework" "$TEAM_ID" || exit $?
echo "Packaging..."
zip -rq "${APP_NAME}.ipa" Payload || exit $?
echo "Done: ${APP_NAME}.ipa"