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,方法/类查询都很方便。特别实用