1. 程式人生 > >iOS使用指令碼批量打渠道包

iOS使用指令碼批量打渠道包

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

簡單思考之後可以想到,我們可以通過使用shell指令碼來實現批量打包,渠道資訊可以儲存在應用的info.plist裡面。

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

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"];

拿到的就是渠道資訊了。

最後總結下這套方案的優點:
1. 工程配置幾乎不需要改動,只要一次性在info.plist中增加需要的預設鍵值
2. 後續有更多渠道時,只需要更新指令碼即可,對於專案理論上不需要進行任何改動

PS:本方案中修改的是info.plist,其實也可以自定義一個檔案用來修改,方案總體一致,細節可以微調。

希望對大家有幫助。

相關推薦

iOS使用指令碼批量渠道

最近我們接到了新的需求,需要打出類似xx001-xx100共100個這樣的ipa渠道包,不需要簽名。(這批ipa包後續會用企業證書籤名,不會影響AppStore的) 這些包所有的功能、內容都是一樣的,區別在於不同的包在統計、連線我們伺服器時會提供一個不同的字串

iphone-批量渠道shell指令碼

#!/bin/bash #code by xiaodao 2012-06-05 sourceipaname="test.ipa" appname="test.app" targetName="test" version="1_2_0" zipTime=`date +%m

Unity3D研究院之指令碼批量打包渠道研究

static void GenericBuild(string[] scenes, string target_dir, BuildTarget build_target, BuildOptions build_options)

不用再渠道了,用它就可以快速統計多個渠道

使用Shareinstall的免打包渠道統計技術,可以實現只上傳一個APK安裝包,以直接向各個渠道分配渠道連結(二維碼)的方式實現多渠道統計,完全不用再麻煩技術的同事幫忙打包,直接由渠道業務管理的同事操作生成渠道連結即可。 稍微介紹一下,Shareinstall其實是一個APP的推廣輔助

Unity一鍵渠道

忙了好一陣接入安卓sdk,也算積累了一些經驗,在這裡總結一下,如有不足,歡迎大大指出; 專案接了大大小小十多個sdk,我的想法是在android studio打好aar包,和資原始檔還有AndroidManifest.xml儲存成一個壓縮包,用的時候解壓縮到專案的Plugins/Androi

【python】指令碼批量安裝第三方

編寫指令碼py程式 新建批量安裝的檔案 libsinstall.py import os # 新增需要安裝的擴充套件包名稱進去 libs = {"pillow" , "sklearn" , "numpy" , "pandas"} try: for lib in libs:

app上線前加固&&渠道

1.下載騰訊雲樂固 2.配置資訊 值得注意的是:樂固中配置的Android Name必須與AndroidManifest.xml中填寫的一致,且必須為英文 3.匯入應用,自動打包 4.渠道引數(參考) tianjihr;baidu;jiuyao;anzhuo;sanliulin

Android 渠道出來之後安裝失敗

問題: 發現打出來的渠道包在7.0的系統上無法安裝,在安裝頁面提示無效或者安裝失敗之類的 原因: 為了提高Android系統的安全性,Google從Android 7.0開始增加一種新的增強簽名模式,從Android Gradle Plugin 2.2開始,構建系統在打

Ubantu Jenkins打包五 快速渠道

1. 渠道包生成原理 渠道包和普通包的區別: 渠道包與普通包相比,渠道相關的資訊不同,程式碼部分相同。開發和編碼的時候,渠道資訊儘可能的不要採用 硬編碼,最好的方法是將渠道配置資訊寫入AndroidManifest的meta-data,程式中通過讀取AndroidM

教你快速高效接入SDK——打包工具的實現(反編譯資源動態整合渠道)

1、打包工具的輸入,就是需要打包的apk包,也叫母包。遊戲裡面引入sdk抽象層的jar包,呼叫抽象層的介面。完成接入,然後打成apk。 2、打包工具會首先用apktool -d 對母包進行反編譯。反編譯到該渠道對應的臨時工作目錄中 3、重新命名包名。我們知道在AndroidManifet.xml中的pack

ant 批量渠道,第三方項目作為library打包出錯的問題

渠道 data- har 資源 per alt 提示 utf 項目 ant批量打包不解釋了。詳情請看前面其它的blog! 這裏說一下 開發中,非常可能遇到引用第三方的項目作為library情況。這樣的情況下該怎麽打包呢? 第一:改動build.x

python 安卓APK渠道,分分鐘千把個

目前安卓APK打渠道包,主要有3種方式, 一、傳統手動, 一個一個的改渠道號,然後改一個打一個,這種只有當渠道數不多時用,如果渠道有幾百甚至上千個,估計眼睛都會花手都會麻,還不知道何時何月才能完成 二、gradle配置,可以先把所有的渠道都在gradle裡面配置好,然後執行

利用UiAutomator寫一個自動遍歷渠道關鍵功能的指令碼

本人在做自動化測試的過程中,出現了一個需求。原因是,在發出去的渠道包裡面,偶然一次有兩個渠道包微博登入失敗的bug,所以想著利用UiAutomator寫了一個自動遍歷每個渠道包的登入方式的指令碼。經過嘗試第一版終於完成,分享程式碼和思路,供大家參考。 思路:把所有渠道包放在

iOS 給測試人員測試手機APP的四種方法:真機執行(略),ipa,(testFlighe)郵件,蒲公英(一)ipa

APP上線前測試,無外乎 一:用資料線真機除錯(以前需要下載真機除錯證書) 二:打.ipa包給測試人員(上限100人)     2.1 打包APP的.ipa 包給測試人員之前,如果沒有新增裝置的UDID號, 先進入蘋果開發者中心(添加了直接跳到2.6)  2.2點

java 單個上傳檔案, 批量上傳檔案,單個下載,批量成zip壓縮下載檔案(如果不能接受httpsevletrequest請求的檔案可以使用MultipartFile[] files)

package net.wkang.intelligent_audit.hospitalization.utils; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; impor

linux--shell指令碼批量啟動和停止jar

指令碼程式碼all.sh #! /bin/sh # 埠號 PORTS=(8084 8083 8085 8086) # 系統模組 MODULES=(mcht system user act) # 系統模組名稱 MODULE_NAMES=(商戶模組 系統模組 使用者模組 活動

Java操作POI批量匯出多個excle,壓縮

一、前端JS //站內搜尋查詢報表-Excel匯出 function exportRecord(){ var browseUrl=$("#browseUrl").val(); if(browseUrl == null || browseUrl == ""){

IntelliJ IDEA java項目導入jarjar

選項 可能 version make set 最好 tar project 沒有 一、導入 1、java項目在沒有導入該jar包之前,如圖: 2、點擊 File -> Project Structure(快捷鍵 Ctrl + Alt + Shift + s),

iOS app內開safari

blank googl ppa git cnblogs afa http oauth 允許 最近使用google的oauth認證,發現不再允許使用UIWebview進行認證了,必須使用系統遊覽器,使用遊覽器也不一定要在app之間跳轉,ios使用SFSafariViewCon

純手工jar

歸檔文件 jar文件 .exe 執行命令 純手工 xxx 子目錄 nbsp bsp 1、在cmd窗口切換到包名最上層包目錄的父目錄; 2、輸入jar -cvf xxx.jar *.*;(不輸入v也可以) 3、在相應目錄下可以看到jar文件已經生成。 jar 是一個jar