├── README.md ├── ios_resign_from_app_to_ipa ├── ios_resign_with_app ├── ios_resign_with_archive └── ios_resign_with_ipa /README.md: -------------------------------------------------------------------------------- 1 | # iOS App的重签名 2 | 3 | 对iOS App进行重签名的脚本命令,包括Xcode Build后的App、Archive包、IPA包以及从AppStore下载的IPA包等。 4 | 5 | ## Requirement 6 | 7 | Xcode command line tool 8 | 9 | ## Usage 10 | 11 | 12 | ### 1.Xcode Build的App重签名 13 | 14 | 脚本文件: ios_resign_with_app 15 | 16 | Usage: 17 | ``` 18 | $ ios_resign_with_app $source_app_file $Developer_code_sign $mobileprovision $target_app_related_path 19 | ``` 20 | 21 | Example: 22 | ``` 23 | $ ios_resign_with_app Testerhome.app "iPhone Developer: XXX XXXX (XXXXXXX)" embedded.mobileprovision Testerhome-resigned.app 24 | ``` 25 | 26 | ### 2.Xcode Archive的Archive包重签名 27 | 28 | 脚本文件: ios_resign_with_archive 29 | 30 | Usage: 31 | ``` 32 | $ ./ios_resign_with_archive $source_archive_file $Developer_code_sign $mobileprovision $target_archive 33 | ``` 34 | 35 | Example: 36 | ``` 37 | $ ./ios_resign_with_archive demo.xcarchive "iPhone Developer: XXX XXXX (XXXXXXX)" embedded.mobileprovision demo-resigned.xcarchive 38 | ``` 39 | 40 | 41 | ### 3.Xcode 导出的IPA包的重签名 42 | 43 | 脚本文件: ios_resign_with_ipa 44 | 45 | Usage: 46 | ``` 47 | $ ios_resign_with_ipa $source_ipa_file $Developer_code_sign $mobileprovision $target_app_related_path 48 | ``` 49 | 50 | Example: 51 | ``` 52 | $ ios_resign_with_ipa Testerhome.ipa "iPhone Developer: hengjie chen (XXXXXXXX)" embedded.mobileprovision Testerhome-resigned.ipa 53 | ``` 54 | 55 | ### 4.AppStore下载的IPA包的重签名 56 | 57 | 脚本文件: ios_resign_from_app_to_ipa 58 | 59 | Assume folder app-extracted is the folder that created by running `unzip app.ipa -d app-extracted` 60 | ``` 61 | $ ls app-extracted 62 | META-INF Payload iTunesArtwork iTunesMetadata.plist 63 | ``` 64 | 65 | Then it should be use like below: 66 | ``` 67 | $ ios_resign_from_app_to_ipa app-extracted $Developer_code_sign $mobileprovision $target_ipa_related_path 68 | ``` 69 | 70 | example: 71 | ``` 72 | $ ios_resign_from_app_to_ipa app-extracted "iPhone Developer: hengjie chen (XXXXXXXX)" embedded.mobileprovision Testerhome-resigned.ipa 73 | ``` -------------------------------------------------------------------------------- /ios_resign_from_app_to_ipa: -------------------------------------------------------------------------------- 1 | # !/bin/bash 2 | # from http://www.xgiovio.com/blog-photos-videos-other/blog/resign-your-ios-ipa-frameworks-and-plugins-included/ 3 | 4 | SOURCEAPPFOLDER="$1" 5 | DEVELOPER="$2" 6 | MOBILEPROV="$3" 7 | TARGET="$4" # target ipa name(relative path) 8 | # ENTITLEMENTS="$5" 9 | 10 | # unzip -qo "$SOURCEAPPFOLDER" -d extracted 11 | 12 | # APPLICATION=$(ls extracted/Payload/) 13 | 14 | cp -r "$SOURCEAPPFOLDER" extracted 15 | 16 | APPLICATION=$(ls extracted/Payload/) 17 | 18 | cp "$MOBILEPROV" "extracted/Payload/$APPLICATION/embedded.mobileprovision" 19 | 20 | echo "Resigning with certificate: $DEVELOPER" >&2 21 | find -d extracted \( -name "*.app" -o -name "*.appex" -o -name "*.framework" -o -name "*.dylib" \) > directories.txt 22 | security cms -D -i "extracted/Payload/$APPLICATION/embedded.mobileprovision" > t_entitlements_full.plist 23 | /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' t_entitlements_full.plist > t_entitlements.plist 24 | #/usr/libexec/PlistBuddy -c 'Print:application-identifier' t_entitlements.plist > t_entitlements_application-identifier #save developer application-identifier to file 25 | #/usr/libexec/PlistBuddy -c 'Print:com.apple.developer.team-identifier' t_entitlements.plist > t_entitlements_com.apple.developer.team-identifier #save com.apple.developer.team-identifier application-identifier to file 26 | while IFS='' read -r line || [[ -n "$line" ]]; do 27 | #/usr/bin/codesign -d --entitlements :- "$line" > t_entitlements_original.plist #save original entitlements from the app 28 | #/usr/libexec/PlistBuddy -x -c 'Import application-identifier t_entitlements_application-identifier' t_entitlements_original.plist #overwrite application-identifier 29 | #/usr/libexec/PlistBuddy -x -c 'Import com.apple.developer.team-identifier t_entitlements_com.apple.developer.team-identifier' t_entitlements_original.plist #overwrite com.apple.developer.team-identifier 30 | /usr/bin/codesign --continue -f -s "$DEVELOPER" --entitlements "t_entitlements.plist" "$line" 31 | done < directories.txt 32 | 33 | echo "Creating the Signed IPA" 34 | xcrun -sdk iphoneos PackageApplication -v extracted/Payload/$APPLICATION -o `pwd`/"$TARGET" 35 | echo "Created ipa $TARGET" 36 | 37 | rm -rf "extracted" 38 | rm directories.txt 39 | rm t_entitlements.plist 40 | rm t_entitlements_full.plist 41 | #rm t_entitlements_original.plist 42 | #rm t_entitlements_application-identifier 43 | #rm t_entitlements_com.apple.developer.team-identifier 44 | -------------------------------------------------------------------------------- /ios_resign_with_app: -------------------------------------------------------------------------------- 1 | # !/bin/bash 2 | # from http://www.xgiovio.com/blog-photos-videos-other/blog/resign-your-ios-ipa-frameworks-and-plugins-included/ 3 | 4 | #获取参数,包括源APP,开发者证书,描述文件,目的APP 5 | SOURCE_APP="$1" 6 | DEVELOP_CER="$2" 7 | DEVELOP_MOBILEPROV="$3" 8 | DESTINATION_APP="$4" 9 | 10 | #APP做备份 11 | TEMP_APP="tmp.app" 12 | cp -r "$SOURCE_APP" "$TEMP_APP" 13 | 14 | #拷贝描述文件 15 | MOBILEPROV_NAME="embedded.mobileprovision" 16 | cp "$DEVELOP_MOBILEPROV" "$TEMP_APP/$MOBILEPROV_NAME" 17 | 18 | #扫描APP里所有需要重签名的组件,包括app/appex/framework/dylib 19 | RESIGN_FILES="resign_file.txt" 20 | echo "Resigning with certificate: $DEVELOP_CER" >&2 21 | find -d $TEMP_APP \( -name "*.app" -o -name "*.appex" -o -name "*.framework" -o -name "*.dylib" \) > "$RESIGN_FILES" 22 | 23 | #获取描述文件里的授权机制(entitlements.plist) 24 | RESIGN_ENTITLEMWNTS_FULL="entitlements_full.plist" 25 | RESIGN_ENTITLEMWNTS="entitlements.plist" 26 | security cms -D -i "$TEMP_APP/$MOBILEPROV_NAME" > "$RESIGN_ENTITLEMWNTS_FULL" 27 | /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' "$RESIGN_ENTITLEMWNTS_FULL" > "$RESIGN_ENTITLEMWNTS" 28 | 29 | #签名 30 | while IFS='' read -r line || [[ -n "$line" ]]; do 31 | echo "$line" 32 | /usr/bin/codesign --continue -f -s "$DEVELOP_CER" --entitlements "$RESIGN_ENTITLEMWNTS" "$line" 33 | done < "$RESIGN_FILES" 34 | 35 | echo "Creating the Signed APP" 36 | rm -rf "$DESTINATION_APP" 37 | mv "$TEMP_APP" "$DESTINATION_APP" 38 | echo "Created app: $DESTINATION_APP" 39 | 40 | #删除签名过程中生成的文件 41 | rm "$RESIGN_FILES" 42 | rm "$RESIGN_ENTITLEMWNTS" 43 | rm "$RESIGN_ENTITLEMWNTS_FULL" 44 | -------------------------------------------------------------------------------- /ios_resign_with_archive: -------------------------------------------------------------------------------- 1 | # !/bin/bash 2 | # from http://www.xgiovio.com/blog-photos-videos-other/blog/resign-your-ios-ipa-frameworks-and-plugins-included/ 3 | 4 | #获取参数,包括源Archive,开发者证书,描述文件,目的APP 5 | SOURCE_ARCHIVE="$1" 6 | DEVELOP_CER="$2" 7 | DEVELOP_MOBILEPROV="$3" 8 | DESTINATION_ARCHIVE="$4" 9 | 10 | #APP做备份 11 | TEMP_ARCHIVE="tmp.xcarchive" 12 | cp -r "$SOURCE_ARCHIVE" "$TEMP_ARCHIVE" 13 | 14 | #拷贝描述文件 15 | MOBILEPROV_NAME="embedded.mobileprovision" 16 | 17 | #计算Archive包里App的路径 18 | APP_NAME=$(ls $TEMP_ARCHIVE/Products/Applications/) 19 | echo "$APP_NAME" 20 | SOURCE_APP="$TEMP_ARCHIVE/Products/Applications/$APP_NAME" 21 | 22 | #拷贝描述文件 23 | cp "$DEVELOP_MOBILEPROV" "$SOURCE_APP/$MOBILEPROV_NAME" 24 | 25 | #扫描APP里所有需要重签名的组件,包括app/appex/framework/dylib 26 | RESIGN_FILES="resign_file.txt" 27 | echo "Resigning with certificate: $DEVELOP_CER" >&2 28 | find -d $TEMP_ARCHIVE \( -name "*.app" -o -name "*.appex" -o -name "*.framework" -o -name "*.dylib" \) > "$RESIGN_FILES" 29 | 30 | #获取描述文件里的授权机制(entitlements.plist) 31 | RESIGN_ENTITLEMWNTS_FULL="entitlements_full.plist" 32 | RESIGN_ENTITLEMWNTS="entitlements.plist" 33 | security cms -D -i "$SOURCE_APP/$MOBILEPROV_NAME" > "$RESIGN_ENTITLEMWNTS_FULL" 34 | /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' "$RESIGN_ENTITLEMWNTS_FULL" > "$RESIGN_ENTITLEMWNTS" 35 | 36 | #签名 37 | while IFS='' read -r line || [[ -n "$line" ]]; do 38 | echo "$line" 39 | /usr/bin/codesign --continue -f -s "$DEVELOP_CER" --entitlements "$RESIGN_ENTITLEMWNTS" "$line" 40 | #/usr/bin/codesign --continue -f -s "$DEVELOP_CER" "$line" 41 | done < "$RESIGN_FILES" 42 | 43 | echo "Creating the Signed Archive" 44 | rm -rf "$DESTINATION_ARCHIVE" 45 | mv "$TEMP_ARCHIVE" "$DESTINATION_ARCHIVE" 46 | echo "Created Archive: $DESTINATION_ARCHIVE" 47 | 48 | #删除签名过程中生成的文件 49 | rm "$RESIGN_FILES" 50 | rm "$RESIGN_ENTITLEMWNTS" 51 | rm "$RESIGN_ENTITLEMWNTS_FULL" 52 | -------------------------------------------------------------------------------- /ios_resign_with_ipa: -------------------------------------------------------------------------------- 1 | # !/bin/bash 2 | # from http://www.xgiovio.com/blog-photos-videos-other/blog/resign-your-ios-ipa-frameworks-and-plugins-included/ 3 | 4 | #获取参数,包括源IPA,开发者证书,描述文件,目的IPA 5 | SOURCE_IPA="$1" 6 | DEVELOP_CER="$2" 7 | DEVELOP_MOBILEPROV="$3" 8 | DESTINATION_IPA="$4" 9 | 10 | #IPA解压 11 | TEMP_DIR="extracted" 12 | mkdir "$TEMP_DIR" 13 | unzip -qo "$SOURCE_IPA" -d "$TEMP_DIR" 14 | 15 | #拷贝描述文件 16 | MOBILEPROV_NAME="embedded.mobileprovision" 17 | APPLICATION=$(ls $TEMP_DIR/Payload/) 18 | cp "$MOBILEPROV" "$TEMP_DIR/Payload/$APPLICATION/$MOBILEPROV_NAME" 19 | 20 | #扫描IPA里所有需要重签名的组件,包括app/appex/framework/dylib 21 | RESIGN_FILES="resign_file.txt" 22 | echo "Resigning with certificate: $DEVELOP_CER" >&2 23 | find -d $TEMP_DIR \( -name "*.app" -o -name "*.appex" -o -name "*.framework" -o -name "*.dylib" \) > "$RESIGN_FILES" 24 | 25 | #获取描述文件里的授权机制(entitlements.plist) 26 | RESIGN_ENTITLEMWNTS_FULL="entitlements_full.plist" 27 | RESIGN_ENTITLEMWNTS="entitlements.plist" 28 | security cms -D -i "$TEMP_DIR/Payload/$APPLICATION/$MOBILEPROV_NAME" > "$RESIGN_ENTITLEMWNTS_FULL" 29 | /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' "$RESIGN_ENTITLEMWNTS_FULL" > "$RESIGN_ENTITLEMWNTS" 30 | 31 | #签名 32 | while IFS='' read -r line || [[ -n "$line" ]]; do 33 | echo "$line" 34 | /usr/bin/codesign --continue -f -s "$DEVELOP_CER" --entitlements "$RESIGN_ENTITLEMWNTS" "$line" 35 | done < "$RESIGN_FILES" 36 | 37 | #压缩为IPA 38 | echo "Creating the Signed IPA" 39 | cd $TEMP_DIR 40 | zip -qry ../$TEMP_DIR.ipa * 41 | cd .. 42 | mv $TEMP_DIR.ipa "$DESTINATION_IPA" 43 | 44 | rm -rf "$TEMP_DIR" 45 | rm "$RESIGN_FILES" 46 | rm "$RESIGN_ENTITLEMWNTS" 47 | rm "$RESIGN_ENTITLEMWNTS_FULL" 48 | 49 | 50 | --------------------------------------------------------------------------------