重簽名的流程:
1.干掉插件Plugins文件夾里面的內(nèi)容!
2.Watch 直接干掉!
3.對 Frameworks 進(jìn)行簽名!
4.給可執(zhí)行文件執(zhí)行權(quán)限! chmod +x WeChat
5.拷貝描述文件
6.修改info.plist 的Bundle ID!
7.生成plist的權(quán)限文件
8.簽名整個APP!
$codesign -fs "iPhone Developer: WenHan Li (6ZBE4C573L)"? --no-strict --entitlements=en.plist WeChat.app
9.打包其實(shí)就是一個zip
$zip -ry WeChat.ipa Payload
查看描述文件信息:$security cms -D -i 描述文件路徑
查看APP的簽名信息
$codesign -vv -d APP路徑
查看本機(jī)所有證書
$security find-identity -v -p codesigning
查看可執(zhí)行文件的加密信息!
$otool -l WeChat | grep crypt
簽名
$codesign -fs "證書" 需要簽名的文件
自動化重簽名的腳本:
# ${SRCROOT} 為工程文件所在的目錄 TEMP_PATH="${SRCROOT}/Temp"?
#資源文件夾,放三方APP的 ASSETS_PATH="${SRCROOT}/APP"?
#ipa包路徑 TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
?#新建Temp文件夾
?rm -rf "$TEMP_PATH"
?mkdir -p "$TEMP_PATH"?
# --------------------------------------?
# 1. 解壓IPA 到Temp下 unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
?# 拿到解壓的臨時APP的路徑 TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
?# 這里顯示打印一下 TEMP_APP_PATH變量 echo "TEMP_APP_PATH: $TEMP_APP_PATH"
# 2. 把解壓出來的.app拷貝進(jìn)去
?#BUILT_PRODUCTS_DIR 工程生成的APP包路徑
?#TARGET_NAME target名稱 TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"?
echo "TARGET_APP_PATH: $TARGET_APP_PATH"
?rm -rf "$TARGET_APP_PATH"?
mkdir -p "$TARGET_APP_PATH"
?cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH/"
# 3. 為了是重簽過程簡化,移走extension和watchAPP. 此外個人免費(fèi)的證書沒辦法簽extension?
?rm -rf "$TARGET_APP_PATH/PlugIns"?
rm -rf "$TARGET_APP_PATH/Watch"
?# 4. 更新 Info.plist 里的BundleId?
#? 設(shè)置 "Set :KEY Value" "目標(biāo)文件路徑.plist"
?/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
?# 5.給可執(zhí)行文件上權(quán)限
?#添加ipa二進(jìn)制的執(zhí)行權(quán)限,否則xcode會告知無法運(yùn)行?
#這個操作是要找到第三方app包里的可執(zhí)行文件名稱辐真,因為info.plist的 'Executable file' key對應(yīng)的是可執(zhí)行文件的名稱?
#我們grep 一下,然后取最后一行, 然后以cut 命令分割取视,取出想要的關(guān)鍵信息盏缤。存到APP_BINARY變量里
?APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
?#這個為二進(jìn)制文件加上可執(zhí)行權(quán)限 +X?
chmod +x "$TARGET_APP_PATH/$APP_BINARY"
?# 6. 重簽第三方app Frameworks下已存在的動態(tài)庫 TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"?
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];?
then?
#遍歷出所有動態(tài)庫的路徑
?for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*?
do?
#簽名
?/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"?
done?
fi
#7. 注入我們編寫的動態(tài)庫?
?# 需要注入的動態(tài)庫的路徑 ?
INJECT_FRAMEWORK_RELATIVE_PATH="動態(tài)庫的可執(zhí)行文件路徑"?
## 通過工具實(shí)現(xiàn)注入?
yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"?