Spaceship
### 腳本操作 證書,app,provision等一些列apple develop后台操作,快速高效。
github地址
spaceship開發文檔
文檔有列出常用的api調用demo,包括證書,appid,provision等操作。想看更具體詳細的結構文檔,參考Ryby類庫查詢
Spaceship使用
-
安裝
1.安裝fastlane sudo gem install -n /usr/local/bin fastlane 2.啟動spaceship(后台運行) fastlane spaceship 3.安裝pry(虛擬環境 類似於irb,python等環境) sudo gem install -n /usr/local/bin pry
-
登錄二次驗證
1.執行 fastlane Spaceship 2.一堆輸出完了,讓你輸入賬號密碼,以及二次驗證碼。 3.進入到pry環境輸入demo腳本 注意: 操作完成之后,會在本地生成一個session保存,網上說會保存一個月,也就是一個月內登錄不需要再二次驗證了。但是,我這邊發現也就幾天就失效了
-
pry環境測試腳本
開發文檔有很多demo了,見上面開發文檔鏈接,直接在pry環境中可進行測試
-
實操腳本編寫
我們的目標是 生成appid,provision,並且自動安裝。
1.創建app,添加app權限,創建provision,下載provision。
require "spaceship" class DevelopPortalHandle def initialize(appid) @appid = appid list = appid.split(".") appidLastName = list.last @appName = appidLastName @provisionName = appidLastName end def login() Spaceship::Portal.login("賬號","密碼") Spaceship.client.team_id = "這里輸入TeamId" end def createApp() puts "createApp #{@appid} appName = #{@appName} " app = Spaceship::Portal.app.find(@appid) puts "app = #{app} class = #{app.class}" if !app then #生成appid,創建新的app app = Spaceship::Portal.app.create!(bundle_id: @appid, name: @appName) puts "createApp #{app}" end end #appstore or inHouse def createDistributionProvision(provisioningClass) cert = Spaceship::Portal.certificate.production.all.last provisionNameDis = @provisionName + '_dis' profile = provisioningClass.create!(bundle_id: @appid,certificate:cert,name:@provisionName) return profile end #appstore or inHouse def downloadDistributionProvision(provisioningClass) #查找有沒有provision文件 filtered_profiles = provisioningClass.find_by_bundle_id(bundle_id: @appid) profile = nil if 0 < filtered_profiles.length then profile = filtered_profiles[0] elsif 0 == filtered_profiles.length then profile = createProvision(provisioningClass) end #沒有找到就創建,找到就下載 provisionNameDis = @provisionName + '_dis' provisionFileName = provisionNameDis + '.mobileprovision' File.write(provisionFileName, profile.download) return provisionFileName end def createDevelopProvision() dev_certs = Spaceship::Portal.certificate.development.all all_devices = Spaceship::Portal.device.all provisionNameDev = @provisionName + '_dev' profile = Spaceship::Portal.provisioning_profile.development.create!(bundle_id: @appid,certificate: dev_certs,name: provisionNameDev,devices:all_devices) return profile end def downloadDevelopProvision() #查找有沒有provision文件 filtered_profiles = Spaceship::Portal.provisioning_profile.development.find_by_bundle_id(bundle_id: @appid) profile = nil if 0 < filtered_profiles.length then profile = filtered_profiles[0] elsif 0 == filtered_profiles.length then profile = createDevelopProvision() end #沒有找到就創建,找到就下載 provisionNameDev = @provisionName + '_dev' provisionFileName = provisionNameDev + '.mobileprovision' File.write(provisionFileName, profile.download) return provisionFileName end def addServices(appServiceObj) app = Spaceship::Portal.app.find(@appid) app.update_service(appServiceObj) end end #創建、下載develop的provision文件 appid = ARGV[0] handle = DevelopPortalHandle.new(appid) handle.login() handle.createApp() handle.addServices(Spaceship::Portal.app_service.push_notification.on) handle.addServices(Spaceship::Portal.app_service.vpn_configuration.on) provisionPath = handle.downloadDevelopProvision()
2.安裝provision文件
這部分代碼我使用py寫的,原理先說一下,安裝provison文件實際上就是, 1.把profile文件名稱改成本身的內容中的uuid作為名稱,uuid.mobileprovision 2.把文件移動到~/Library/MobileDevice/Provisioning\ Profiles目錄下 以下是我python寫的代碼。 #!/usr/bin/env python #coding:utf-8 import getopt import os import sys import plistlib def provisionInstall(provisionPath,uuid): #將provision文件改成uuid命名,並且放入到Provisioning Profiles所在目錄下 systemProvisionPath = '~/Library/MobileDevice/Provisioning\ Profiles/%s.mobileprovision' % uuid dir = os.path.dirname(provisionPath) uuidProvision = '%s/%s.mobileprovision' % (dir,uuid) cpCMD = 'cp -a %s %s' % (provisionPath,uuidProvision) cpUUIDProvision = 'cp -a %s %s' % (uuidProvision,systemProvisionPath) os.system(cpCMD) os.system(cpUUIDProvision) pass #讀provision文件,獲取teamName和uuid def readProvision(provisionFilePath): #返回teamName 和 UUID #轉換provision為xml transCMD = 'security cms -D -i %s > test.plist' % provisionFilePath os.system(transCMD) #test.plist文件路徑 dir = os.path.dirname(provisionFilePath) plistPath = dir + '/test.plist' #讀plist文件中內容 plist = '' maj, min, _, _, _ = sys.version_info if maj < 3: plist = plistlib.readPlist(plistPath) else: with open(plistPath,'rb') as fp: plist = plistlib.load(fp,fmt=None, use_builtin_types=False) teamNeme = plist['TeamName'] uuid = plist['UUID'] return teamNeme,uuid pass
Ruby類庫查詢
很重要,在上面的網站可以搜索關鍵字,比如xcodeproj,spaceship。左邊就會有Class List,方法/類查詢都很方便。特別實用