iOS使用腳本批量打渠道包

jopen 9年前發布 | 41K 次閱讀 IOS iOS開發 移動開發

最近我們接到了新的需求,需要打出類似xx001-xx100共100個這樣的ipa渠道包,不需要簽名。(這批ipa包后續會用企業證書簽名,不會影響AppStore的)
這些包所有的功能、內容都是一樣的,區別在于不同的包在統計、連接我們服務器時會提供一個不同的字符串標示。
如果按照常規的打包方式,我們需要不斷的修改工程中的值,然后一個個打包。。。這種毫無技術含量的活怎么能忍受!


簡單思考之后可以想到,我們可以通過使用shell腳本來實現批量打包,渠道信息可以保存在應用的info.plist里面。

批量處理思路:
1. 通過改變某個設置或變量,引起工程中info.plist中某個值改變
2. 使用xcodebuild命令進行打包等處理

細分的話其實又可以有幾種做法:
1.使用多個target
這種的優點是可以更深度的定制信息,參見唐巧的文章:http://blog.devtang.com/blog/2013/10/17/the-tech-detail-of-ape-client-1/
缺點是對于我們這種簡單需求來說,操作略繁瑣,代價較高。
腳本和下面的2類似,只是變量是target而已。

2.使用多個buildSetting
不同的build active architecture 設置不同的User-Defined值
第一版腳本由我的同事提供,采用的就是這種方式,比上面那種方式稍微簡單了點
思路和步驟如下:
1. 在Xcode的build設置中,通過拷貝release生成多個build active architecture,分別以渠道名命名
2. User-Defined屬性下增加名為Channel的key,針對不同的build設置不同的渠道值
3. info.plist中增加Channel鍵,值引用User-Defined下的設置${Channel}
(由于方案不夠完美,該腳本就不在此貼出了)


當我看到這種方案的時候其實還是不滿足的,因為需要改動工程配置等相關信息,還是很麻煩。

對于我們來說,打出來的包其實只有info.plist中一個預設的值不一樣而已,其實可以不需要那么多的target或者那么多的buildsetting,只需要在打包時,用腳本改一下info.plist中對應的鍵值即可。
查找資料發現,命令修改plist值已經有內置的工具PlistBuddy,不過這工具使用時需要使用其絕對路徑才能引用到,路徑為/usr/libexec/PlistBuddy,工具的更多功能有興趣的可以自己搜一下。
調整后,腳本為:

channels=( 渠道1 渠道2 渠道3 )
for i in ${channels[@]}
do
    xcodebuild -project ./你的工程.xcodeproj -scheme 你的scheme名稱 -configuration Release archive -archivePath ./$i
    /usr/libexec/PlistBuddy -c "Set :Channel ""$i" ./$i.xcarchive/Products/Applications/*.app/info.plist
    rm -Rf ./$i.ipa
    xcodebuild -exportArchive —exportFormat ipa -archivePath ./archive.xcarchive -exportPath ./$i.ipa -exportWithOriginalSigningIdentity
    rm -Rf ./$i.xcarchive
done

好了,完事具備,可以批量打包了

打包沒有問題,嗯,不過好像很費時間啊。。。

回過頭來我們再分析下打包流程:
1. 使用xcodebuild命令根據工程生成xcarchive文件
2. 使用xcarchive文件導出ipa,此過程中可以簽名

對于一次打包過程來說,期間生成了xx.xcarchive文件,這個文件此時還沒有進行任何的簽名之類的操作,其實我們可以直接修改這個 xcarchive包中對應app文件內的plist,然后再導出成ipa,這樣就可以共用一個xcarchive文件,節省下了N多次打包出該文件的時間。
好了調整一下得到我們的最終版:

xcodebuild -project ./你的工程.xcodeproj -scheme 你的scheme名稱 -configuration Release archive -archivePath ./archive
channels=( 渠道1 渠道2 渠道3 )
for i in ${channels[@]}
do
    /usr/libexec/PlistBuddy -c "Set :Channel ""$i" ./archive.xcarchive/Products/Applications/*.app/info.plist
    rm -Rf ./$i.ipa
    xcodebuild -exportArchive —exportFormat ipa -archivePath ./archive.xcarchive -exportPath ./$i.ipa -exportWithOriginalSigningIdentity
done
rm -Rf ./archive.xcarchive

需要注意的是
1. 項目的info.plist文件中要提前設置一個Channel的鍵,值寫上默認渠道。
2. 工程中相應的證書等還是要配置好,否則可能打包失敗
3. 本文中打出來的ipa都是未簽名的,需要簽名的話自行搜索下,比較簡單

將這腳本保存為archive文件,丟在工程目錄下,使用方式:
打開終端,執行兩行命令

cd 你的工程目錄
./archive

好了,打完收工,這樣你在工程中,使用

NSString* channel = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"Channel"];

拿到的就是渠道信息了。

來自:http://blog.csdn.net/u010124617/article/details/46547523

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!