1. 程式人生 > >IOS 打包、安裝、重簽名 .app & .ipa

IOS 打包、安裝、重簽名 .app & .ipa

打包與簽名方法

  • Xcode 工具可以直接打包,不累贅;
  • xcrun 命令打包:
    1,清理:
    /usr/bin/xcodebuild -target targetName clean
    2,編譯:
    /usr/bin/xcodebuild -target targetName
    3,第三步打包:
    /usr/bin/xcrun -sdk iphoneos PackageApplication -v path/xxx.app -o ./xxx.ipa
    說明:
    xcodebuild負責將工程原始檔編譯成xxx.app
    xcrun負責給xxx.app(簽名並)打包成xxx.ipa
    關於xcrun,直接打包的引數就是 xcrun -sdk iphoneos PackageApplication -v 源app路徑 -o 輸出的ipa路徑,以上兩個命令必需在xxx.xcodeproj所在的目錄執行。

    下面兩個命令都可以為應用簽名:

xcodebuild -target targetName CODE_SIGN_IDENTITY="iPhone Distribution:XXXXXX"
xcrun -sdk iphoneos PackageApplication -v 源app路徑 -o 輸出的ipa路徑 --sign "iPhone Distribution:XXXXXX"

證書與描述檔案放在build.xcconfig時配置執行:
xcodebuild -configuration Debug clean build -xcconfig path/build.xcconfig

CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist
CODE_SIGN_IDENTITY = iPhone Developer:xxxx
CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Developer: xxx
PROVISIONING_PROFIEL =xxx.mobileprovision
PROVISIONING_PROFIEL[sdk=iphoneos*]=xxx.mobileprovision
SYMROOT =/Users/iosTest/xxx
OBJROOT =/Users/iosTest/xxx

常見error:

.app/ResourceRules.plist: cannot read resources
Click on your project > Targets > Select your target > Build Settings >Code Signing Resource Rules Path
and add :
$(SDKROOT)/ResourceRules.plist

#sh:
echo 'CODE_SIGN_RESOURCE_RULES_PATH=$(SDKROOT)/ResourceRules.plist' >> ./build.xcconfig

安裝 .ipa||.app 方法

  • Xcode 、iTunes、助手等工具不累贅
  • ideviceinstaller:
    $ideviceinstaller -u 076dbbea77c1 -i xx.app/ || XX.ipa
  • fruitstrap(appium包支援):
    fruitstrap install –id userid –bundle “/Users/shop.app”

.ipa 重簽名方法

  1. ORIGINAL_FILE=”$1” 待簽名的ipa包
  2. CERTIFICATE=”$2” 證書名稱
  3. MOBILEPROVISION=”$3” 對應的描述檔案
  4. BUNDLE_ID=”$4” app的BundleID, 如果你的描述檔案允許你修改任意BundleID那麼可以任意填寫,否則就老老實實的把原BundleID寫上吧
  5. PASSWD=”$5” 當前使用者所對於的密碼
# !/bin/bash 
# 
# Sample: 
#  sh resign.sh  80000.ipa "iPhone Developer: Jsz autotest (xxoo)" Dev_xxoo_iphone.mobileprovision "com.xxoo.iphone" "7766"
# 
ORIGINAL_FILE="$1"
CERTIFICATE="$2"
MOBILEPROVISION="$3" 
BUNDLE_ID="$4" 
PASSWD="$5"

function unzip_IPA() 
{ 
 ipa="$ORIGINAL_FILE" 
 unzip -o "$ipa" 
} 

function create_EntitlementsPlist() 
{   
 /usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i ${MOBILEPROVISION}) > entitlements.plist  
 SN_CODE=$(/usr/libexec/PlistBuddy -c "Print :com.apple.developer.team-identifier" entitlements.plist) 
 /usr/libexec/PlistBuddy -c "Set :application-identifier ${SN_CODE}.${BUNDLE_ID}" entitlements.plist 
} 

function set_BundleID() 
{ 
 /usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $BUNDLE_ID" Payload/*.app/Info.plist 
} 

function del_OldCodeSign() 
{ 
 rm -r Payload/*.app/_CodeSignature/ 
} 

function copy_EmbeddedProvision() 
{ 
 cp $MOBILEPROVISION Payload/*.app/embedded.mobileprovision 
} 
function reSignFrameworks()
{
 echo "Resigning with certificate: $CERTIFICATE" >&2
find  −name"∗.app"−o−name"∗.appex"−o−name"∗.framework"−o−name"∗.dylib" > directories.txt

 while IFS='' read -r line || [[ -n "$line" ]]; do
/usr/bin/codesign --continue -f -s "$CERTIFICATE" --no-strict "t_entitlements.plist"  "$line"
done < directories.txt
}
function reSign() 
{ 
 codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/ 
} 

function rezip_IPA() 
{ 
 original_IPA=`basename "$ORIGINAL_FILE"` 
 re_IPA=`echo ${original_IPA/.ipa/-resigned.ipa}` 
 zip -qr "$re_IPA" Payload/ 
} 

security unlock-keychain -p "$PASSWD" ~/Library/Keychains/login.keychain 

unzip_IPA 
create_EntitlementsPlist 
set_BundleID 
del_OldCodeSign 
copy_EmbeddedProvision
reSignFrameworks 
reSign 
rezip_IPA