1. 程式人生 > >iOS 制作自動打包腳本 Xcode8.3.2

iOS 制作自動打包腳本 Xcode8.3.2

pri deb round odin 環境 user targe 網上 public

本文包含以下內容:

前言

1.shell腳本的編寫

2.xcodebuild命令

3.完整的可用示例

參考資料


前言

  做iOS開發,打包APP是比較頻繁的事情,每次都手動去配置一堆東西確實是比較乏味。

另外,我目前負責維護的APP在發布時,不同的Mode設置不同的AppIcon和BundleID,

所以要是可以簡單執行一個腳本就完成打包的各種配置,那就輕松了!

  於是乎,我就在網上學習了一下實現自動打包的方法,但是好多都是老版本的教程。

所以我打算參考別人的教程,然後自己也研究研究,再把研究的結果和大家分享一下。

不喜勿噴哈,但是如果有好的建議,也歡迎大家提出!

Okay,follow me !


1.shell腳本的編寫

這段時間我學了學Go語言,也買了個阿裏雲服務器來搗鼓,

然後就很自然地學了一些Linux指令和shell腳本編寫相關的知識。

突然發現,我們做iOS開發的也最好去學學後端語言、Linux指令和shell腳本編寫

為什麽呢?

a) 學後端你會想辦法去學習數據庫優化,寫出更高效的SQL語句;

b) 學後端你會考慮到安全問題,寫出穩健性更強的代碼;

c) 學後端你會去學很多極其實用的Linux命令,這樣有助於你更好地使用你的macbook,因為很多命令在macbook上也是可以用的;

d) 學後端你可能還得學習寫shell腳本來完成一些繁雜的工作,而學會shell腳本的編寫將讓你受益終生

e) shell腳本強大、易學、易用;

這裏附上一個Shell腳本學習網站,強大、易學、易用,請相信我!??


2.使用xcodebuild命令進行打包

打開終端,輸入 man xcodebuild ,回車:

技術分享

這裏有說明用法,如果英語讀起來吃力,可以復制到谷歌翻譯:

技術分享

大意就是你可以使用xcodebuild命令來build project或者workspace,如果使用了Cocoapods,build的就一定是workspace了。

可以使用-list, -showBuildSettings, -showsdks, -usage, and -version這些命令來查看一些相關的信息。只是看看而已,對於打包不會產生什麽影響。

註意:以下示例shell腳本代碼中的變量都需要自定義並賦值

【清理build工作目錄】項目根目錄執行:

clean -configuration ${development_mode} || exit

【打包】項目根目錄執行:

    xcodebuild     archive -workspace ${project_path}/${project_name}.xcworkspace     -scheme ${scheme_name}     -configuration ${development_mode}     -archivePath ${build_path}/${project_name}.xcarchive  || exit

archive 指明操作是打包;

-workspace 指明需要打包的是一個workspace而不是project,

  如果是打包project,這裏的路徑和問價明就更改為對應的project即可;

-scheme 一般和項目同名;

-configuration 指明打包模式是Debug還是Release;

-archivePath 指明打包操作的路徑;

|| exit 指明如果操作失敗則退出當前shell;

【導出安裝包】項目根目錄執行:

xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive     -configuration ${development_mode}     -exportPath ${exportFilePath}     -exportOptionsPlist ${exportOptionsPlistPath} || exit

有一些配置項和上面的 xcodebuild archive 是相同的,所以需要兩個命令的參數匹配

-exportPath 指明.ipa文件到處的路徑;

-exportOptionsPlist 指明 exportOptions.plist 文件的位置,這個文件是-exportArchive必需的參數;

實測exportOptions.plist文件裏可以什麽都不配置,

只要Xcode的project或者workspace裏設置好了對應參數就好!

exportOptions.plist文件內容:

<?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/>
</plist>

如果通過Xcode打開這個exportOptions.plist文件,你也可以為其配置以下內容(資料來源):

method: (String) The method of distribution, which can be set as any of the following:
    app-store
    enterprise
    ad-hoc
    development
teamID: (String) The development program team identifier.
uploadSymbols: (Boolean) Option to include symbols in the generated ipa file.
uploadBitcode: (Boolean) Option to include Bitcode.


3.完整的可用示例(加入了-quiet參數,只輸出錯誤和警告信息):

#! /bin/bash
# created by Ficow Shen

#工程絕對路徑
project_path=$(pwd)

#工程名
project_name=自定義

#打包模式 Debug/Release
development_mode=Debug

#scheme名
scheme_name=自定義

#build文件夾路徑
build_path=${project_path}/build

#plist文件所在路徑
exportOptionsPlistPath=${project_path}/exportOptions.plist

#導出.ipa文件所在路徑
exportFilePath=${project_path}/ipa/${development_mode}


echo *** 正在 清理工程 ***
xcodebuild clean -configuration ${development_mode} -quiet  || exit 
echo *** 清理完成 ***



echo *** 正在 編譯工程 For ${development_mode}
xcodebuild archive -workspace ${project_path}/${project_name}.xcworkspace -scheme ${scheme_name} -configuration ${development_mode} -archivePath ${build_path}/${project_name}.xcarchive -quiet  || exit
echo *** 編譯完成 ***



echo *** 正在 打包 ***
xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive -configuration ${development_mode} -exportPath ${exportFilePath} -exportOptionsPlist ${exportOptionsPlistPath} -quiet || exit

if [ -e $exportFilePath/$scheme_name.ipa ]; then
    echo "*** .ipa文件已導出 ***"
    open $exportFilePath
else
    echo "*** 創建.ipa文件失敗 ***"
fi
echo *** 打包完成 ***

註意:

a.當需要輸入的shell命令過長時,可以用\來進行合理的換行分隔;

b.如果需要打包的是project,則在archieve中將-workspace替換為-project,

  然後將.xcworkspace的路徑替換為.xcodeproj的路徑;

可供參考的建議:

a.在項目根目錄新建一個AutoPack目錄,將所有腳本放置到這個目錄中,

打包完成後的.ipa文件也到處到這個目錄裏,便於統一管理;

    技術分享

b.如果需要替換BundleID,用git先保存項目的當前狀態,然後去修改Bundle Identifier

這時候可以通過git查看修改記錄,然後就知道BundleID的修改該如何寫腳本來執行了;

  技術分享

c.如果需要替換程序圖標,直接刪除Images.xcassets中的AppIcon.appiconset,

然後復制新的進去即可,連同Contents.json文件也一起替換掉

d.可以將一些操作封裝為函數便於重用,可以在某個文件中使用source命令將函數體所在的文件包含進來;


以下是一些可供參考的示例腳本,請註意命令內部的空格分隔!

替換圖標的示例腳本:

#! /bin/bash
# created by Ficow Shen

useDebugIcon(){

    rm -rf 項目根目錄/Images.xcassets/AppIcon.appiconset || exit
    cp -r AutoPack/IconOfDebug/AppIcon.appiconset/ 項目根目錄/Images.xcassets/AppIcon.appiconset || exit

    echo * 已更改AppIcon 為:測試版 圖標
}
useReleaseIcon(){
    
    rm -rf 項目根目錄/Images.xcassets/AppIcon.appiconset || exit
    cp -r AutoPack/IconOfRelease/AppIcon.appiconset/ 項目根目錄/Images.xcassets/AppIcon.appiconset || exit
    
    echo * 已更改AppIcon 為:正式版 圖標
}

echo changeAppIcon.sh 加載完畢!

替換BundleID的示例腳本:

#! /bin/bash
# created by Ficow Shen

useDebugBundleID(){
    cd 項目根目錄.xcodeproj/
    # sed -i 直接修改源文件,‘‘ 備份文件名, s/要被取代的字串/新的字串/g, 需要設置bundleID的文件
    # 假設com.a.a是測試環境使用的,com.b.b是正式環境使用的
    sed -i ‘‘ s/com.a.a/com.b.b/g project.pbxproj || exit
    cd ..
    echo * 已更改bundle ID 為:com.b.b
}
useReleaseBundleID(){
    cd 項目根目錄.xcodeproj/
    sed -i ‘‘ s/com.b.b/com.a.a/g project.pbxproj || exit
    cd ..
    echo * 已更改bundle ID 為:com.a.a
}

echo editBundleID.sh 加載完畢!


參考資料:

iOS自動打包並發布腳本

[iOS]從零開始寫個自動打包IPA腳本

iOS 自動打包

-- 感謝以上文章作者的熱心分享!??


Ficow原創,轉載請註明出處:http://www.cnblogs.com/ficow/p/6823962.html

iOS 制作自動打包腳本 Xcode8.3.2