兰小妞滴Blog


  • 首页

  • 分类

  • 归档

  • 标签

iOS --推送证书的创建及过期处理

发表于 Jul 17 2018

无论是iPhone还是android,我们用到的所有的应用基本上都是有推送通知服务的,这是应用很好的推广方式。上一章我们简单讲了下苹果的安全验证机制就可说明,苹果对这些跟用户相关的信息的把控是很严格的,push也不例外,苹果的推送需要发到苹果的服务器上中转一下,也就是我们大家熟知的苹果的推送通知服务:APNs(Apple Push Notification service),例如友盟,极光之类的推送服务都是向APNs推送消息,APNs再将消息推送给设备的,并不像安卓那样直接找到设备发送消息;苹果需要验证是否含有证书,有证书才能发送;现在我们就看看推送证书如何创建:

  • 1、首先登录自己的开发账号,进入iOS Certificates证书中心,点击Certificates 下的All,这时点击右上角的“+”号增加证书,如下图:
  • 2、进入证书类型选择页面,这里主要有创建开发证书、发布证书、推送开发证书、推送生产证书几个类型,我的账号下的发布证书已建满,所以呈灰色,但推送证书(带Push)正常,一般推送的开发和生产证书都需要,开发证书供开发时候用,生产证书发布时用,两种后面的步骤一致,所有在这就不重复介绍,只选择一种,选择好证书类型,点击下面的Continue按钮:
  • 3、选择需要创建推送证书的应用的APP ID,点击continue:
  • 4、进入Create a CSR file 页面,直接Continue:
  • 5、这时会让你选择CSR file,但是CSR file我们暂时还未创建,所以我们得先创建CSR file,再进行下一步:
  • 6、在Mac电脑上打开钥匙串访问:
  • 7、点击菜单中的钥匙串访问—>证书助理—>从证书颁发机构请求证书…,进入证书助理页面,选择存储到磁盘,电子邮件随便填,点击继续:
  • 8、这时就创建好了CSR file文件了,桌面出现如下图标:
  • 9、接下来回到第五步,选择刚创建好的CSR file,点击continue:
  • 10、这时证书已经创建好了,回到iOS Certificates证书中心页面,我们就可以看到我们创建的证书,后面还有到期时间:
  • 11、我们已经创建好证书了,接下来就是安装证书了,点击Download下载,双击证书,注意一定要双击,开发、生产证书都是一样的,这样推送证书就安装好了,可以去钥匙串看到:
  • 12、我们已经创建了证书也已经安装好了证书,但是我们集成的一些第三方平台,如极光推送,还需要我们上传证书到它们平台,但它们要的证书并不是我们之前创建的,而是需要.p12文件的证书,这就需要我们从钥匙串导出.p12格式,生产、开发都需要,操作如下:
  • 13、一般情况下,将上面到处的证书上传到第三方平台就可以,上传成功后会提示已验证,这时就可以集成SDK,发送PUSH了。
    有人注意到推送证书有时间期限的,是的,是有有效期,有时我们应用突然接不到消息了,有可能就是证书过期了,有效期一般为1年左右,那有效期快过了怎么处理呢?
    解决方案:

1、删除MAC上钥匙串访问中对应的推送证书
2、去开发者中心删掉过期推送证书,重新按着上面的步骤重新来一遍
3、在第三方平台上重新上传新的.p12证书

已上线的应用也是一样,删掉证书不会影响推送,只要对应的APP ID是一样的!

链接:https://www.jianshu.com/p/ca8df77ee18e

阅读全文 »

Xcode无线真机调试

发表于 May 7 2018

一般情况下Xcode调试肯定是数据线链接真机比较稳妥,但是作为一枚好说话的客户端测开,有时真有一种把客户端RD宠成baby的节奏。每天上班都会发现数据线不翼而飞,RD总有一种吃数据线的本领,导致经常遇到没有数据线调试的尴尬场景;And偶尔回家没事想自己研究点东西的时候,就经常需要运行个demo什么的到手机上,又几乎从来不会带转接头这种东西回家。。。。。所以只能尝试无线真机调试,所以才有了此文,比较简单,作为笔记记录一下。

环境依赖

无线调试是WWDC2017的新功能,iOS11以上,Xcode9这是刚性要求。

  • 至少Mac OSX 10.12.6
  • iOS 11
  • Xcode 9

使用无线进行设备链接

  • 手机连接上Xcode,打开Xcode菜单:Windows->Device and Simulators。找到连接上的设备,把Connect via network选项打勾。
  • 此时,拔掉数据线,在Xcode选择打包设备时即可发现刚刚被拔掉数据线的设备。但是设备链接出显示该设备处于“Disconnected”状态,且一直loading。
  • 回到刚刚的设备列表中,选中手机右键,在出来的选项卡中选择一个“Connect via IP Address”项。选择之后输入手机的局域网ip地址。
  • 连接完成后可以看到在连接的手机右边有一个地球连接标志,长这样
  • 完成后可以看到在连接的手机邮编出现一个地球连接标记,如下图所示:

    完成上述操作后就能脱离数据线的束缚了,后续在编译选择设备时,可直接选择该设备进行编译。

备注

楼主第一次成功后,想重新连接截图记录一下,所以删了想重来,就死也连接不上了,各种找资料无果,最后是重启了Mac搞定的,遇到同样问题的小伙伴可以尝试重启。

阅读全文 »

如何发布一个iOS全新APP--从证书管理到Jenkins任务上的archive打包上传

发表于 May 2 2018

楼主之前在的公司是有专门的EP部门管理iOS客户端的证书、打包、上传什么的一堆逻辑,这块东西基本上对楼主来说是黑盒的。去年跳槽到新的公司后,发现这边的部门间都是独立管理自己的所有事情,不存在一个类似于全公司的EP的部门存在,而且楼主去的是个新成立的部门,就遇到了几乎是从0到1的全新APP的上架问题,头疼的搞了差不多一周多,最终是整了一套完整的证书与打包机制,但是当时一直没有搞懂里面的一些校验机制与推送机制,所以一直没敢出文记录,直到前几天收到PUSH证书快到期的提示,被迫硬着头皮搞了一遍PUSH证书,这才算是大致理解了苹果爸爸这一整套机制,怕自己忘记,所以markdown一下。纯属个人理解,有问题请帮忙指出。

总体介绍

本文会从实用主义的如何对一个已有的工程进行证书与PP描述文件进行配置、对一个已建立好的appid进行PUSH证书的配置以及根据个人的整理与理解,浅谈一下iOS的签名机制。

  • 浅谈iOS签名与校验机制
  • 从无到有创建一个已有项目的开发证书
  • 创建项目对应的推送证书

浅谈iOS签名与校验机制

众所周知,iOS的签名与校验机制是非常复杂又混乱,一个独立的APP从生成打包到发版,其中你会遇到以下各种概念与文件,各种证书、Provisioning Profile、CertificateSigningRequest、p12、p12、APPID等。本文是在阅读了bang大神的博客后,加上自己操作发布了一款app后对这套流程有了一个大致清晰的理解。

前言

在苹果的iOS系统之前,我们所熟悉的操作系统,比如linux、Windows、Mac等,都是可以直接通过下载安装包然后,双击或者其他方式去安装。这样就导致随便在哪下载了一个安装包后都能运行,导致平台很难控制盗版或者是其他恶意的传播。但是苹果对安装在iOS系统上的每个APP都有绝对的掌控权,主要就是通过这一套复杂的数字签名与校验实现的。

数字签名机制

数字签名机制就是通过将摘要算法和非对称加密算法结合到一起实现的。
其中摘要算法是通过将任意长度的文本,通过一个算法(常见的有MD5、SHA等),得到一个固定长度的文本。
对称加密算法是通过同一份秘钥加密和解密数据,而非对称加密算法则是有两份秘钥:公钥和私钥,生成者负责生成私钥与公钥,并保存私钥,公开公钥;公钥是公开的,但不可能通过公钥反推出私钥,或者说极难反推,只能穷举,所以只要密钥足够长度,要通过穷举而得到私钥,几乎是不可能的;通过私钥加密的密文只能通过公钥解密,公钥加密的密文只有通过私钥解密。

阅读全文 »

使用appium进行iOS真机自动化测试之环境入门

发表于 May 2 2018

之前刚接触客户端测试的时候,appium还是1.5,xcode还是7,那时的苹果还支持UIAutomation框架,当时的UI自动化case写的也是很顺利,后来xcode升级后,楼主试用过beta版本的1.6的appium维护之前的case,当时还没有对应的最新版的客户端,所以当时获取界面元素,楼主还是很low逼的使用打印页面的方式。后来跳槽后,新的环境并没有UI自动化这种东西,所以一直就废弃了,不过有个比较头疼的问题一直存在,核心埋点问题,埋点的异常会导致各种大盘数据的抖动,为了保证核心埋点的稳定,打算重新搞一搞appium,利用UI自动化去校验核心埋点。在重新配置appium环境的时候默默的表示还是遇到了很多坑的,所以就记录一下,给同行的tester们一点启示。

总体介绍

本文会介绍包括xcode7以及最新的xcode9的对应的appium的使用小记,不过之前版本的很多疑问点已经没有印象了,所以会着重记录新版本的appium与xcode的使用心得。之前在运行过程中,一直对WD编译成功后的一个server地址感兴趣,就在网上找的过一篇博客,博主主要从appium原理层面分析的一下appium,虽然不是非常深刻,但个人觉得值得大家读一读:Appium 从入门到原理
本文主要分为如下几个部分:

  • 新版的appium以及相关依赖的安装
  • WebDriverAgent的安装与运行
  • Appium-Desktop安装与运行
  • DesiredCapabilities参数设置
  • 遇到的问题点记录

新版appium以及相关依赖安装

安装必备的依赖

  • libimobiledevice
    appium iOS真机调试依赖一个重要的第三方开源包:libimobiledevice,它同iTools一样,都是可以替代iTunes,进行iOS设备管理的工具,使用Homebrew可以轻松获取并安装:

    1
    brew install libimobiledevice
  • ios-deploy
    ios-deploy是一个使用命令行安装ios app到连接的设备的工具,原理是根据os x命令行工程调用系统底层函数,获取连接的设备、查询/安装/卸载app。类似的工具有Fruitstrap,ideviceinstaller、node-ios-device等. 可以使用npm直接安装

    1
    npm install -g ios-deploy
  • appium安装
    appium本质上就是一个Nodejs应用,我们可以使用npm直接进行安装,安装完毕后就可以直接命令行启动了。

    1
    npm install -g appium

本地已有老版本appium时,使用上面的命令可直接更新至最新版本,或者指定版本:

  • appium-doctor
    appium-doctor是用来检测安装环境是否正常的命令,同样使用npm直接安装
    1
    npm install appium-doctor -g

安装成功后,使用该命令可以检测安装环境:appium-doctor --ios

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜ automaster-ios git:(UGC) appium-doctor --ios
info AppiumDoctor Appium Doctor v.1.4.3
info AppiumDoctor ### Diagnostic starting ###
info AppiumDoctor ✔ The Node.js binary was found at: /usr/local/bin/node
info AppiumDoctor ✔ Node version is 8.0.0
info AppiumDoctor ✔ Xcode is installed at: /Applications/Xcode.app/Contents/Developer
info AppiumDoctor ✔ Xcode Command Line Tools are installed.
info AppiumDoctor ✔ DevToolsSecurity is enabled.
info AppiumDoctor ✔ The Authorization DB is set up properly.
info AppiumDoctor ✔ Carthage was found at: /usr/local/bin/carthage
info AppiumDoctor ✔ HOME is set to: /Users/didi
info AppiumDoctor ### Diagnostic completed, no fix needed. ###
info AppiumDoctor
info AppiumDoctor Everything looks good, bye!
info AppiumDoctor

阅读全文 »

基于XCUITest进行的iOSMonkey测试

发表于 Nov 3 2017 | 分类于 客户端测试

本文主要用于介绍由于iOS与Xcode升级,之前很多iOS端的QA同学赖以生存UIAutomation框架被无情废弃,如何基于 XCUITesting进行monkey测试 ——SwiftMonkey。其实从Xcode升级到现在也有一年多了,这个工具现在网上的介绍也开始纷呈起来,但是还是打算记录一下自己的使用过程,主要是有些地方,在网上看到的很多资料都有问题后来自己混编了Swift源码,才搞清楚,所以希望本文还是能给摸索而来的tester们一点启示。
源码的GitHub地址: https://github.com/zalando/SwiftMonkey

总体介绍

先大概介绍一个monkey测试,简单说就是模拟一个monkey(淘气的猴子)的一种针对APP的随机测试,基本在功能验证bug收敛阶段引入,主要用于测试APP的稳定性,一般常见的crash闪退以及卡死问题都会影响APP的稳定性。
本文会在之前自学iOS时写的半废弃状态的练手APP天气预报作为demo做monkeyTest,首次使用可以直接拉代码实验,代码地址:git@github.com:gysxl/WeatherRequest.git
总体来说,在你的项目中添加monkey测试,主要分为以下几步:

  • 添加monkey工具源码
  • 新建并配置UI testing target
  • 编写测试代码
  • run monkey并分析BUG日志
  • 锦上添花添加手势记录

添加monkey工具源码

前言已经提到过,本文所用到的主要是一个基于 XCUITesting 框架的 monkey 工具 —— https://github.com/zalando/SwiftMonkey ,所以首先肯定要将人家的源码down下来,PS:能翻墙最好翻个墙,干啥都能快一些,也不会遇到什么乱七八糟的错误。
下载下来后,需要把目录中的SwiftMonkey与SwiftMonkeyPaws文件复制到你的项目目录中,参考我下图的文件结构:

然后把这两个项目的.xcodeproj拖到你的项目中,如下所示:

以上代码拖入的工作就完成了,这个是比较直观的拖入操作,其实也可以通过pod集成的方式直接导入,直接通过修改pod库文件,修改部分如下(具体的根据自己的项目来调整,不过表示我还没尝试这种方法,只是先普及一下):

1
2
3
4
5
6
7
target "App" do //App为自己的工程名
pod "SwiftMonkeyPaws", "~> 1.0"
end
target "Tests" do //Test为text对应的Target名
pod "SwiftMonkey", "~> 1.0"
end

然后通过 pod install 的方式集成

新建并配置UI testing target

现在项目中添加一个新的target,依次选择file——>new——>target,最后选择iOS UI testing Bundle:

点击next后就配置一些target的信息,这里需要注意的是,由于这个工具是用swift写的,所以需要选择的语言是Swift,其他的参考下面的配置然后根据个人的项目修改就可:

配置相关的target信息:


需要注意的是,由于工具是用Swift编写的,所以需要在项目中的build setting中勾选上Swift的标准库,否则不能集成工具库,而且新建的target需要注册成功,勾选你的证书什么的注册一下就好。如下图所示:


以上就配置完成了!

阅读全文 »

iOS页面传值(Objective-C)

发表于 Jun 13 2017 | 分类于 ObjectiveC

UITableView 基本使用方法总结

发表于 May 25 2017 | 分类于 ObjectiveC

前言:本篇小白入门介绍是紧接着上一篇继续的,在写天气预报的练手项目时,需要画个简单的table用来选择查看城市天气详情的东东,于是简单的研究了一下iOS关于UITableView的实现,还是老规矩,废话不说,先上UITableView的实现demo:

标注一下demo源码位置iOS Objective-C使用UITableView实现可上下滑动table功能

简单介绍

简单来说,table view就是在单个列里面显示一组列表项,UITableView继承于用户可滑动表格的UIScrollView,但是需要注意的是UITableView的只允许上下滑动。每个cell中可包含的内容可以自定义,若是你只想展示单个的文本或者其他信息,则对你来说UITableView的实现就相当简单了。具体操作如下:

构造需要展示的数据信息

关于数据信息,最好在页面加载tableView之前就构造完成,我一般会写在整个页面的viewLoad方法中,具体代码如下(使用iOS自带的NSTimeZone去作为展示信息):

  • 声明全局变量

    1
    @property (nonatomic) NSArray *timeZoneNames; //作为传参变量
  • 构造展示信息,并赋值给全局变量

    1
    2
    NSArray *timeZones = [NSTimeZone knownTimeZoneNames];
    self.timeZoneNames = [timeZones sortedArrayUsingSelector:@selector(localizedStandardCompare:)];

实现tableView的一些基本方法

  • 返回 tableview 有多少个section的方法

    首先需要简单介绍cell与section的意义。UITableView的每一条数据对应的单元格叫做一个cell,也是UITableView的一个对象。并且我们可以分区展示UITableView,这样每个区就称为一个section,section中的每一行都从0开始编号。楼主在网上盗了一张非常清晰明了的图片,如下:

    介绍完毕,上干货!!!!

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 这个方法就是 oc 提供的用于返回tableview有多少个section的方法。设置如下:

    1
    2
    3
    4
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
    return 1;
    }

    ps:如果不实现该方法的话,默认返回一个section

  • 返回section中有多少个元素,也就是有几个cell

    - (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section这个方法主要用于返回每个section中有几个cell
    具体设置如下:

    1
    2
    3
    4
    5
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    // return [self.array count];
    return self.timeZoneNames.count;//用来统计需要显示的timeZoneNames的个数
    }

tableview的cell的个性化定制

阅读全文 »

iOS:objective-c实现定位当前城市

发表于 May 25 2017 | 分类于 ObjectiveC

前言:刚开始入门iOS时,看了几天的理论知识后,就开始着手写一个简单的天气预报程序练手。过程中就遇到了首页需要根据定位出的城市获取天气的问题,于是搜索了一下获取定位相关的知识,整理如下.
根据个人学习是的习惯,觉得网上大神的解答最好能有个简单的demo可供参考最好,所以本人写了个简单的获取定位的demo:

标注一下demo源码位置iOS Objective-C获取定位城市demo

导入头文件并请求授权

  • 导入头文件

    1
    #import <CoreLocation/CoreLocation.h>
  • 修改info.plist

修改info.plist文件,添加获取定位行为以及配置选项。如下图:

可以只添加需要时使用:Privacy - Location When In Use Usage Description

创建位置管理者CLLocationManager,并添加到属性

1
2
@property (nonatomic,strong) CLLocationManager *locationManager;

判断是否开启了定位服务

  • 在程序启动时需要先判断是否开启了定位

    1
    2
    3
    4
    if ([CLLocationManager locationServicesEnabled]) { // 判断是否打开了位置服务
    self.locationManager = [[CLLocationManager alloc] init];//初始化定位器
    [self.locationManager startUpdatingLocation]; // 启动定位器
    }
  • 设置定位器的其他属性
    在初始化定位器后,需要设置其delegate以及其他属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ([CLLocationManager locationServicesEnabled]){
    self.locationManager = [[CLLocationManager alloc] init];//初始化定位器
    self.locationManager.delegate = self; //设置代理
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;//设置精确度
    self.locationManager.distanceFilter = 100;//表明每隔100米更新一次定位信息
    [self.locationManager requestWhenInUseAuthorization];//使用的是requestWhenInUseAuthorization方法
    self.currentCity = [[NSString alloc] init];
    [self.locationManager startUpdatingLocation];//启动定位器
    }

监听定位信息

阅读全文 »

android客户端手动测试代码覆盖率统计

发表于 May 25 2017 | 分类于 客户端测试

本文主要介绍如何通过内置打桩的方式收集app手工测试的代码覆盖率,以便于更直观的发现测试用例的不足

总体介绍

本文主要是用的是jacoco插件,Jacoco是一个开源的覆盖率工具,Jacoco可以嵌入到Ant 、Maven中,并提供了EclEmma Eclipse插件,也可以使用JavaAgent技术监控Java程序。很多第三方的工具提供了对Jacoco的集成,如sonar、Jenkins等。
官网地址:JaCoCo Java Code Coverage Library
在实际是用过程中,与个人环境相关的由于缺少某些jar包的报错,都可以上述网站中下载对应的jar包并导入。
本文主要以博主在实际工作中遇到的某个app为例,总体分为四个步骤:

  • 打开收集覆盖率开关,并在create函数中添加结果收集文件
  • 在跑完测试case,关闭app时将结果写入收集文件
  • 添加生成测试报告的task
  • 将生成的覆盖文件编译生成报告

打开开关,并生成收集文件

1、 添加包
在源码的app_instance中的build.gradle文件中,添加代码覆盖率需要依赖的编译包

1
2
3
4
5
6
7
8
9
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':framework:cupid')
debugCompile 'com.facebook.stetho:stetho:1.0.1'
debugCompile 'com.facebook.stetho:stetho-urlconnection:1.3.1'
debugCompile 'org.jacoco:org.jacoco.agent:0.7.6.201602180812' //add by sxl for coverage
compile 'com.facebook.stetho:stetho:1.3.1'
}

这里需要注意的是,添加完编译时可以会遇到很多关于jar包依赖的报错,如下文提过的,需要手动下载jacoco相关的jar包放在本地lib库中并导入。
2、 打开debug中统计覆盖率开关
在项目正在运行的build.gradle中加入jacoco插件
apply plugin: "jacoco"
并修改buildType中的debug属性:

1
2
3
4
5
6
7
8
9
10
debug {
minifyEnabled false
debuggable true
testCoverageEnabled true //add by sxl for coverage
minifyEnabled false
signingConfig signingConfigs.release
ndk {
abiFilter "armeabi"
}
}

注意,如果debug中有混淆,需要把混淆去掉。
3、 添加收集文件
app启动时创建覆盖率统计coverage.ec文件
需要在app启动的文件(AppInstanceApplicationCallback.java)中的onCreate函数中添加如下代码:

if (BuildConfig.DEBUG){
    String SDCARD_PATH = Environment.getExternalStorageDirectory().getPath();
    String DEFAULT_COVERAGE_FILE_PATH = SDCARD_PATH + "/coverage.ec";
    File file = new File(DEFAULT_COVERAGE_FILE_PATH);
    if (!file.exists()) {
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

关闭app时,收集统计的数据

阅读全文 »

iOS静态代码扫描工具Fauxpas的使用小记

发表于 May 24 2017 | 分类于 客户端测试

Faux Pas是一个Xcode辅助工具,用以检查Xcode项目,找出常见的错误、隐藏的bug、不良实践以及可维护性问题和风格问题。 拥有可视化界面和命令行两种操作方式。

命令行的使用

基本格式

1
Fauxpas [选项] <命令>

命令列表

check <.xcodeproj文件的路径> : 检查指定的Xcode项目
check-xcode : 检查当前的xcode项目,这个命令必须运行在Xcode项目的run script里,run script中写法示例:

1
2
3
4
5
6
7
[[ ${FAUXPAS_SKIP} == 1 ]] && exit 0
FAUXPAS_PATH="/usr/local/bin/fauxpas"
if [[ -f "${FAUXPAS_PATH}" ]]; then
"${FAUXPAS_PATH}" check-xcode
else
echo "warning: Faux Pas was not found at '${FAUXPAS_PATH}'"
fi

rules <可选规则的名称> : 显示规则的详情

tags <可选标签的名称> : 显示标签的详情

exampleconfig : 输出一个配置文件的例子

validateconfig <配置文件的路径> : 验证该配置文件是否有效

阅读全文 »
12
单晓兰

单晓兰

学习,积累,成长

12 日志
2 分类
17 标签
© 2018 单晓兰
由 Hexo 强力驱动
主题 - NexT.Pisces