Spaceship
CLI in the form of a certificate, app, provision and some other apple develop a background operation, fast and efficient.
github address
spaceship development documents
文档有列出常用的api调用demo,包括证书,appid,provision等操作。想看更具体详细的结构文档,参考Ryby类库查询
Spaceship use
installation
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
Login secondary verification
1.执行 fastlane Spaceship 2.一堆输出完了,让你输入账号密码,以及二次验证码。 3.进入到pry环境输入demo脚本 注意: 操作完成之后,会在本地生成一个session保存,网上说会保存一个月,暂时没验证。也就是一个月内登录不需要再二次验证了。
pry environmental testing scripts
开发文档有很多demo了,见上面开发文档链接,直接在pry环境中可进行测试
Practical operation of script writing
Our goal is to generate appid, provision, and installed automatically.
1. Create app, add app permissions, create provision, download 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. Install the provision file
这部分代码我使用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 def readP12Password(txtPath): with open(txtPath,'r') as fp: str = fp.readline() str = str.strip() return str pass
Ruby libraries inquiry
很重要,在上面的网站可以搜索关键字,比如xcodeproj,spaceship。左边就会有Class List,方法/类查询都很方便。特别实用