一 各種打包方法簡介:
- Xcode 打包:
XCode -- > Product --> Archive 常規(guī)打包方式,需要提前配置好簽名信息.
2.提取工程目錄Products下的.app文件進行包裝打包:
3.使用命令行工具xcodebuild進行打包.
4.python編寫自動化打包腳本,運行腳本實現一鍵打包部署.
二 Xcode 打包:
略.... 你懂得
三 .app文件進行包裝打包:
具體步驟如下:
1. XCode -- >Build
2.新建文件夾,命名Payload.
3.提取Products下的.app文件,放進Payload文件夾中,然后把Payload進行壓縮得到Payload.zip.
4.將Payload.zip名字改為: 工程名.zip
5.工程名.zip的后綴名改為工程名.ipa
上圖:
四. xcodebuild命令行打包:
具體操作如下:
- cd到工程目錄下
$ xcodebuild clean -workspace xxxx.xcworkspace -scheme xxxx -configuration Release
1.將其中`xxxx`替換成你的工程名.
2. `Release`是編譯模式,分為`Release`和`Debug`,根據需要自行配置.
- $
xcodebuild archive -workspace xxxx.xcworkspace -scheme xxxx -configuration Release -archivePath /Users/pactepacterara/Desktops/xxxx
1.xxxx是工程名
2./Users/pactepacterara/Desktops/是archive文件的輸出路徑,我這里默認放桌面,可自行配置,后面跟項目名.
- $
xcodebuild -exportArchive -archivePath /Users/pactepacterara/Desktop/xxxx.xcarchive -exportPath /Users/pactepacterara/Desktop -exportOptionsPlist /Users/pactepacterara/Desktop/ExportOptions.plist
1. /Users/pactepacterara/Desktop/ExportOptions.plist這是ExportOptions.plist文件的路徑.
2. ExportOptions.plist文件需要你使用Xcode先手動構建一次篙程,然后將ExportOptions.plist文件放到指定路徑,我是放桌面.
執(zhí)行上述操作,即可完成打包.
五. python自動化打包
編寫python文件,使用Xcode就可以
直接上代碼:
#!/usr/bin/env python
#coding=utf-8
#環(huán)境: UAT&SIT
import os
import requests
import webbrowser
import subprocess
import time
import smtplib
# 路徑信息
project_name = 'AutoPackageDemo' # 項目名稱
project_path = '/Users/pactepacterara/iOS' # 項目路徑
export_directory = '/Users/pactepacterara/Desktop' # 輸出的路徑
exporrt_folder = 'auto_archive' # 輸出的文件夾
# 蒲公英app地址、USER_KEY、API_KEY,具體見蒲公英官網: 賬戶設置-->API信息
ipa_download_url = 'https://www.pgyer.com/manager/dashboard/app/xxxxxxxxxxxxxxxx'
USER_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
API_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
class AutoArchive(object):
def __init__(self):
pass
def clean(self):
print("\n\n===========開始clean操作===========")
start = time.time()
clean_opt = 'xcodebuild clean -workspace %s/%s.xcworkspace -scheme %s -configuration Release' % (project_path, project_name, project_name)
clean_opt_run = subprocess.Popen(clean_opt, shell=True)
clean_opt_run.wait()
end = time.time()
# clean 結果
clean_result_code = clean_opt_run.returncode
if clean_result_code != 0:
print("===========clean失敗,用時:%.2f秒===========" % (end - start))
else:
print("===========clean成功,用時:%.2f秒===========" % (end - start))
self.archive()
def archive(self):
print("\n\n===========開始archive操作===========")
subprocess.call(['rm', '-rf', '%s/%s' % (export_directory, exporrt_folder)])
time.sleep(1)
subprocess.call(['mkdir', '-p', '%s/%s' % (export_directory, exporrt_folder)])
time.sleep(1)
start = time.time()
archive_opt = 'xcodebuild archive -workspace %s/%s.xcworkspace -scheme %s -configuration Release -archivePath %s/%s' %(project_path, project_name, project_name, export_directory, exporrt_folder)
archive_opt_run = subprocess.Popen(archive_opt, shell=True)
archive_opt_run.wait()
end = time.time()
# archive 結果
archive_result_code = archive_opt_run.returncode
if archive_result_code != 0:
print("===========archive失敗,用時:%.2f秒===========" % (end - start))
else:
print("===========archive成功,用時:%.2f秒===========" % (end - start))
# 導出IPA
self.export()
def export(self):
print("\n\n===========開始export操作===========")
start = time.time()
export_opt = 'xcodebuild -exportArchive -archivePath %s/%s.xcarchive -exportPath %s/%s -exportOptionsPlist %s/ExportOptions.plist' % ( export_directory,exporrt_folder,export_directory, exporrt_folder,export_directory)
export_opt_run = subprocess.Popen(export_opt, shell=True)
export_opt_run.wait()
end = time.time()
# ipa導出結果
export_result_code = export_opt_run.returncode
if export_result_code != 0:
print("===========導出IPA失敗,用時:%.2f秒===========" % (end - start))
else:
print("===========導出IPA成功,用時:%.2f秒===========" % (end - start))
# 刪除archive.xcarchive文件
subprocess.call(['rm', '-rf', '%s/%s.xcarchive' % (export_directory, exporrt_folder)])
self.upload('%s/%s/ZBank.ipa' % (export_directory, exporrt_folder))
def upload(self, ipa_path):
print("\n\n===========開始上傳蒲公英操作===========")
if ipa_path:
# 蒲公英操作API
# https://www.pgyer.com/doc/api
url = 'http://www.pgyer.com/apiv1/app/upload'
data = {
'uKey': USER_KEY,
'_api_key': API_KEY,
'installType': '2',
'password':pwd,
'updateDescription': description
}
files = {'file': open(ipa_path, 'rb')}
r = requests.post(url, data=data, files=files)
if r.status_code == 200:
self.open_browser(self)
else:
print("\n\n===========沒有找到對應的ipa===========")
return
@staticmethod
# 上傳成功,通過瀏覽器打開蒲公英網站
def open_browser(self):
webbrowser.open(ipa_download_url, new=1, autoraise=True)
if __name__ == '__main__':
description = input("請輸入更新的日志描述:")
pwd=input("請輸入蒲公英安裝密碼:")
archive = AutoArchive()
archive.clean()
終端執(zhí)行命令:
$ python /Users/pactepacterara/Desktop/HuiAotuArchievePackage_生產.py
注意事項:
1.問題場景:
當現有描述文件發(fā)生改變,比如在開發(fā)者中心維護了新的測試設備,更新-->下載--> 安裝描述文件以后,繼續(xù)使用先前配置好的python進行打包時,發(fā)現新注冊的測試設備并沒有添加到描述中,自然也就無法正確安裝,對ipa文件進行解包發(fā)現描述文件中確實不包含新注冊的設備.
2.解決辦法:更新描述文件后,重新使用xcode成功打包一次后,在使用python打包
3.原因:從蘋果開發(fā)者中心網站下載的描述文件并非原封不動的打進我們的app包里面的,而是經過了xcode的二次包裝,其中簽名時生成一個,導出ipa時生成一個.
當我們選擇先清空xcode本地安裝的描述文件,再安裝最新的描述文件,再運行python自動打包腳本時,會在導出ipa步驟時報錯,具體報錯為找不到對應的描述文件.