python脚本打包iOS(企业/测试)
2019-04-22 本文已影响0人
倪大头
记录两个打包脚本,找不到最初出处了,侵删。
企业包:
cd到项目根目录执行脚本
PRODUCT_NAME是需要打包的项目文件名
TARGET_NAMEARRAY是需要打包的所有target名,一般和PRODUCT_NAME相同,这里用数组为了一次打包多个target
import subprocess
import os
import shutil
import requests
import webbrowser
import smtplib
from email.mime.text import MIMEText
#项目名称
PRODUCT_NAME = "jiebao"
#target数组
TARGET_NAMEARRAY = ['fanshendai','yuebangqianbao','dianfengheika','baomihua','xiaoxiongyoujie','zhuxiaodai',]
#版本号
APP_VERSION = "1.0"
#打出的xx.ipa包根目录
EXPECT_OPTION_PATH = "~/Desktop/iOSArchive/"
RELEASE_TYPE = "Release"
EXPECT_OPTION_FILE_NAME = "ExportOptions.plist"
# 导出包配置文件
EXPORT_SETTING_FILE = EXPECT_OPTION_PATH + EXPECT_OPTION_FILE_NAME
#fir.im params 上传包参数,可在官网文档查看
Fir_token = "5df4d1a7************bb699955d"
Fir_aPPId = ""
#输出构建包路径
# print (BUILD_PATH)
#导出包全部路径
# print (EXPORT_SETTING_FILE)
#邮件内容配置
newVersionMsg = "-发件人:倪大头\n"
email_title = "ipa上传完毕"
PRODUCT_DISPlayName = email_title + newVersionMsg
#发件人账户
email_sender='12345@126.com'
email_password = '12345'
#收件人邮箱
email_receivers = ["54321@qq.com"]
#打包
def buildWorkspace():
for TARGET_NAME in TARGET_NAMEARRAY:
# 导出包路径
IPA_EXPORTPATH = EXPECT_OPTION_PATH + TARGET_NAME + APP_VERSION + "/"
BUILD_PATH = IPA_EXPORTPATH + PRODUCT_NAME + ".xcarchive"
archiveCmd = 'xcodebuild -archivePath %s -workspace %s.xcworkspace -sdk iphoneos -scheme %s archive' % (
BUILD_PATH, PRODUCT_NAME, TARGET_NAME)
process = subprocess.Popen(archiveCmd, shell=True)
process.wait()
archiveReturnCode = process.returncode
if archiveReturnCode != 0:
print("\n************archive faild ********************")
else:
print("\n******************** archive success ********************")
exportIpa(BUILD_PATH, IPA_EXPORTPATH, TARGET_NAME)
#导出包
def exportIpa(buildPath, ipaExportPath, targetName):
exportCmd = 'xcodebuild -exportArchive -archivePath %s -exportPath %s -exportOptionsPlist %s -allowProvisioningUpdates' %(buildPath,ipaExportPath,EXPORT_SETTING_FILE)
process = subprocess.Popen(exportCmd,shell=True)
process.wait()
archiveReturnCode = process.returncode
if archiveReturnCode !=0:
print ("\n******************** exportIpa faild ********************")
else:
print ("\n******************** exportIpa success ********************")
# 不想上传fir就注销这句
# AliasIpaToFirI(ipaExportPath, targetName)
#检验包
def AliasIpaToFirI(ipaPath,targetName):
aliasCmd = 'fir p %s/%s.ipa' %(ipaPath,targetName)
process = subprocess.Popen(aliasCmd, shell=True)
process.wait()
aliasReturnCode = process.returncode
if aliasReturnCode != 0:
print ("alias faild")
else:
print ("alias success")
loginToFirIm(ipaPath,targetName)
# login fir account
def loginToFirIm(ipaPath,targetName):
loginCmd = 'fir login -T %s' % (Fir_token)
process = subprocess.Popen(loginCmd, shell=True)
process.wait()
loginReturnCode = process.returncode
if loginReturnCode != 0:
print ("login faild")
else:
print ("login success")
publishToFirIm(ipaPath,targetName)
# publish
def publishToFirIm(ipaPath,targetName):
publishCmd = 'fir publish %s/%s.ipa' %(ipaPath,targetName)
process = subprocess.Popen(publishCmd, shell=True)
process.wait()
publishReturnCode = process.returncode
if publishReturnCode != 0:
print ("publish faild")
else:
print ("publish success")
# des = input("Please input new version description:")
des = '妥了'
send_qq_email(PRODUCT_DISPlayName,des)
# send email
def send_qq_email(title,content):
try:
msg = MIMEText(str(content))
msg["Subject"] = title
msg["From"] = email_sender
msg["To"] = ";".join(email_receivers)
s = smtplib.SMTP_SSL("smtp.126.com", 465)
s.login(email_sender, email_password)
s.sendmail(email_sender, email_receivers, msg.as_string())
s.quit()
print ("\n*************** email send successfully! *********************\n")
return True
except smtplib.SMTPException:
print ("\n*************** email send failure! *********************\n")
return False
def main():
buildWorkspace()
if __name__ == '__main__':
main()
测试包:
appFileFullPath是项目.app文件路径,可以直接从xcode项目根目录里找到Products文件夹下的.app文件,直接拖动到python脚本里
import os
import requests
import webbrowser
import subprocess
'''
使用注意事项:该脚本基于python3.6
1、将工程的编译设备选成 Gemeric iOS Device
2、command + B编译
3、执行脚本文件
'''
appFileFullPath = '/Users/username/Library/Developer/Xcode/DerivedData/jiebao-boudtyjbdlohvjcdujnksmgdrycc/Build/Products/Debug-iphoneos/myApp.app'
PayLoadPath = '/Users/username/Desktop/Payload'
packBagPath = '/Users/username/Desktop/ProgramBag'
openUrlPath = 'https://www.pgyer.com/manager/dashboard/app/d9248d***********20a8ebe0b8e'
# 上传蒲公英
USER_KEY = "9e6e9092eb6*******856f0c9b1d84"
API_KEY = "37fbf33484********0d744bce6c5b1"
# 上传蒲公英
def uploadIPA(IPAPath):
if (IPAPath == ''):
print("\n*************** 没有找到对应上传的IPA包 *********************\n")
return
else:
print("\n***************开始上传到蒲公英*********************\n")
url = 'http://www.pgyer.com/apiv1/app/upload'
data = {
'uKey': USER_KEY,
'_api_key': API_KEY,
'installType': '2',
'password': '',
'updateDescription': ""
}
files = {'file': open(IPAPath, 'rb')}
r = requests.post(url, data=data, files=files)
def openDownloadUrl():
webbrowser.open(openUrlPath, new=1, autoraise=True)
print("\n*************** 更新成功 *********************\n")
# 编译打包流程
def bulidIPA():
# 删除之前打包的ProgramBag文件夹
subprocess.call(["rm", "-rf", packBagPath])
# 创建PayLoad文件夹
mkdir(PayLoadPath)
# 将app拷贝到PayLoadPath路径下
subprocess.call(["cp", "-r", appFileFullPath, PayLoadPath])
# 在桌面上创建packBagPath的文件夹
subprocess.call(["mkdir", "-p", packBagPath])
# 将PayLoadPath文件夹拷贝到packBagPath文件夹下
subprocess.call(["cp", "-r", PayLoadPath, packBagPath])
# 删除桌面的PayLoadPath文件夹
subprocess.call(["rm", "-rf", PayLoadPath])
# 切换到当前目录
os.chdir(packBagPath)
# 压缩packBagPath文件夹下的PayLoadPath文件夹夹
subprocess.call(["zip", "-r", "./Payload.zip", "."])
print("\n*************** 打包成功 *********************\n")
# 将zip文件改名为ipa
subprocess.call(["mv", "payload.zip", "Payload.ipa"])
# 删除payLoad文件夹
subprocess.call(["rm", "-rf", "./Payload"])
# 创建PayLoad文件夹
def mkdir(PayLoadPath):
isExists = os.path.exists(PayLoadPath)
if not isExists:
os.makedirs(PayLoadPath)
print(PayLoadPath + '创建成功')
return True
else:
print(PayLoadPath + '目录已经存在')
return False
if __name__ == '__main__':
des = input("请输入更新的日志描述:")
bulidIPA()
uploadIPA('%s/Payload.ipa' % packBagPath)
openDownloadUrl()