iOS自动化--Spaceship使用实践
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,方法/类查询都很方便。特别实用
iOS自动化--Spaceship使用实践的更多相关文章
- 基于facebook-wda的iOS自动化操作实践记录
[本文出自天外归云的博客园] 原理 对于iOS自动化操作,主要靠WebDriverAgent来完成.在Mac电脑上连接真机iPhone,运行WebDriverAgentRunner会在Mac端启动WD ...
- Mac Jenkins+fastlane 简单几步实现iOS自动化打包发布 + jenkins节点设置
最近在使用jenkins 实现ios自动化打包发布蒲公英过程实践遇到了一些坑,特意记录下来方便有需要的人. 进入正题: 一.安装Jenkins 1.Mac上安装Jenkins 遇到到坑 因为 Jenk ...
- 初识ios自动化(一)
Appium进行自动化测试有两个好处: 1. Appium在不同平台中使用了标准的自动化APIs,所以在跨平台时,不需要重新编译或者修改自己的应用. 2. Appium支持Selenium WebDr ...
- Cobbler自动化部署最佳实践
第1章 Cobbler自动化部署最佳实践 运维自动化在生产环境中占据着举足轻重的地位,尤其是面对几百台,几千台甚至几万台的服务器时,仅仅是安装操作系统,如果不通过自动化来完成,根本是不可想象的. 面对 ...
- iOS自动化环境搭建——macaca
macaca-java for ios 自动化环境搭建 基础原理解析:https://testerhome.com/topics/6608 一.环境搭建 1.安装eclipse; -----Java开 ...
- 基于Armitage的MSF自动化集成攻击实践
基于Armitage的MSF自动化集成攻击实践 目录 0x01 实践环境 0x02 预备知识 0x03 Armitage基础配置 0x04 Nmap:Armitage下信息搜集与漏洞扫描 0x05 A ...
- 一招让 IOS 自动化化快的飞起
前言 最近在做IOS自动化测试,IOS的Appium环境都配置OK,Demo脚本运行没有问题,多开执行没有问题,IOS安卓统一平台调度集成没有问题,可以进行自动化测试.课时真正执行用例时发现个严重问题 ...
- iOS应用开发最佳实践
<iOS应用开发最佳实践> 基本信息 作者: 王浩 出版社:电子工业出版社 ISBN:9787121207679 上架时间:2013-7-22 出版日期:2013 年8月 开本:16 ...
- Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发
Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发 直接入正题: Screen Shot 2015-09-18 at 16.56.20.png Mac上安装Jekins jekins下 ...
随机推荐
- HashMap、HashTable、ConcurrentHashMap、TreeMap、LinkedHashMap、WeakHashMap区别
1. HashMap 标准链地址法实现(下图).数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时 ...
- having函数,case when与order by
having:用于筛选分组后的各组数据.聚合函数,和group by一起使用(where不能和聚合函数使用)group by放在order by前使用,放在之后报错SELECT user_id fro ...
- python 实现屏幕录制
用python实现屏幕录制 PIL 即pollow 的安装命令如下: pip install pillow 其中cv2的安装是下面这条命令 pip install opencv-python 代码实现 ...
- IIS下设置跨域访问问题--Access-Control-Allow-Origin 站点跨域请求的问题
背景: 最近 开发中遇到新需求,把公司的OA系统迁移一套到小程序上面去 有些功能的信息是在小程序 查看 但是文件是在pc端上传的 例如:领导在外出办公 使用小程序查看xxxx.pdf文件 这个时候就 ...
- oracle高水位降低法
1.什么是高水位?(high water mark 简称:HWM) 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词)都有一个在段内存放数据的 ...
- 2019长安大学ACM校赛网络同步赛 L XOR (规律,数位DP)
链接:https://ac.nowcoder.com/acm/contest/897/L 来源:牛客网 XOR 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6 ...
- 2017年全国卷3的21题与2018年全国卷3的21题命题背景是同一个函数$y=\frac{2x}{\ln(x+1)}$(再次瞎谈)
2017年四川高考数学(全国卷3)理科21题第1问 已知函数\(f(x)=x-1-a\ln x\) (1)若\(f(x)\geqslant 0\),求\(a\)的值\(.\) 该不等式等价于$a\ln ...
- 为什么“或命题"真假的判断是有真则真?
我:为什么"或命题"真假的判断是有真则真? 长沙刘老师:难道不是吗? 我:是经验,约定,还是严格证明? L神:为什么不自己看书? 我:想严格推理证明 L神: L神:我学过的教材里是 ...
- 负载均衡(三)Nginx的安装配置
linux系统为Centos 64位 一.安装 [root@cuiqq local]# mkdir /usr/local/nginx [root@cuiqq local]# cd /usr/local ...
- Python之面向对象之初识面向对象
初始面向对象 一.面向过程:面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点:极大地降低了写成学的复 ...