苹果发布证书配置

创建APP对应的Distribution Certification(发布证书 ),Distribution Provisioning Profile( 发布授权文件 ),ID,流程如下:

一、 登录开发者证书中心

官网:https://developer.apple.com/account/ios/certificate

二、创建发布证书

点击右上角+号按钮,进入如下页面。可以看到有两种类型的证书,一种是开发证书(Development),另一种发布证书(Production)。我们需要发布一个APP,所以选择发布证书中的 App Store and Ad Hot。

阅读更多

申请苹果开发者账号

步骤

  1. 创建苹果账号;
  2. 申请成为苹果开发者;

一、创建苹果账号

1.1 Apple ID 官网

官网 :https://support.apple.com/zh-cn/apple-id

1.2 选择 “创建和开始使用”

阅读更多

Code Signing

  1. iOS使用脚本打包程序
  2. iOS批量自动打包和部署(Ⅲ):重新签名和自动部署
  3. iOS Code Signing 学习笔记
  4. 代码签名探析
  5. 小团队的自动化发布-Fastlane带来的全自动化发布
  6. iOS App 签名的原理

阅读更多

Hide iPad shortcuts bar

在适配 iPad 的时候遇上一个问题,iPad 键盘会默认显示 shortcuts bar(快键键栏),而APP中自定义键盘并不需要显示。那么如何隐藏iOS9系统默认的 shortcuts bar 呢?

在 Apple 官方文档中关于 UITextInputAssistantItem 有这样一段描述:

A UITextInputAssistantItem object manages bar button items displayed in the shortcuts bar above the keyboard on iPad. Use this object to add app-specific actions to the shortcuts bar. The center of the shortcuts bar displays typing suggestions for the user. You can install custom bar button items that lead or trail the typing suggestions.

Note:Custom items can be added to the shortcuts bar on iPad only. On iPhone, the contents of the UITextInputAssistantItem object are ignored.

最终的解决思路还是源于接下来的这一段话:

To hide shortcuts altogether, set the leadingBarButtonGroups and trailingBarButtonGroups properties to nil. Doing so hides only the shortcuts and does not hide the typing suggestions. To hide typing suggestions, you must also set the autocorrectionType property of the responder that displays the keyboard to no.

阅读更多

CAShapeLayer简介

CAShapeLayer是一个通过矢量图形而不是bitmap来绘制的图层子类。你指定诸如颜色和线宽等属性,用CGPath来定义想要绘制的图形,最后CAShapeLayer就自动渲染出来了。当然,你也可以用Core Graphics直接向原始的CALyer的内容中绘制一个路径,相比直下,使用CAShapeLayer有以下一些优点:

  • 渲染快速。CAShapeLayer使用了硬件加速,绘制同一图形会比用Core Graphics快很多;
  • 高效使用内存。一个CAShapeLayer不需要像普通CALayer一样创建一个寄宿图形,所以无论有多大,都不会占用太多的内存;
  • 不会被图层边界剪裁掉。一个CAShapeLayer可以在边界之外绘制。你的图层路径不会像在使用Core Graphics的普通CALayer一样被剪裁掉;
  • 不会出现像素化。当你给CAShapeLayer做3D变换时,它不像一个有寄宿图的普通图层一样变得像素化

阅读更多

CAGradientLayer简介

Core Animation的专有图层,CAGradientLayer非常方便就可以生成两种或更多颜色的平滑渐变,并且绘制过程使用了硬件加速

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@interface CAGradientLayer : CALayer
/* The array of CGColorRef objects defining the color of each gradient
* stop. Defaults to nil. Animatable. */
@property(nullable, copy) NSArray *colors;
/* An optional array of NSNumber objects defining the location of each
* gradient stop as a value in the range [0,1]. The values must be
* monotonically increasing. If a nil array is given, the stops are
* assumed to spread uniformly across the [0,1] range. When rendered,
* the colors are mapped to the output colorspace before being
* interpolated. Defaults to nil. Animatable. */
@property(nullable, copy) NSArray<NSNumber *> *locations;
/* The start and end points of the gradient when drawn into the layer's
* coordinate space. The start point corresponds to the first gradient
* stop, the end point to the last gradient stop. Both points are
* defined in a unit coordinate space that is then mapped to the
* layer's bounds rectangle when drawn. (I.e. [0,0] is the bottom-left
* corner of the layer, [1,1] is the top-right corner.) The default values
* are [.5,0] and [.5,1] respectively. Both are animatable. */
@property CGPoint startPoint;
@property CGPoint endPoint;
/* The kind of gradient that will be drawn. Currently the only allowed
* value is `axial' (the default value). */
@property(copy) NSString *type;

阅读更多

二维码美化

一、二维码定位点

原理:二维码一共有40个尺寸。官方称作 版本:Version。Version 1 是21 x 21的矩阵,Version 2 是 25 x 25的矩阵,Version 3 是29的尺寸,每增加一个version,就会增加 4 的尺寸,公式是:(V-1)x4 + 21(V是版本号) 最高 Version 40,(40-1)x4+21 = 177,所以最高是177 x 177 的正方形。。

而三个角的探测点长度相对来说是固定的,探测点在任何尺寸的二维码中,单边长度都是8个模块(包含外围的一条白边)。根据这些,我们就可以计算出探测点在像素矩阵中的具体位置了。

阅读更多

Linux配置Api-blueprint

一、登录远程服务器

root账户登录远程服务器,serverIP就是你服务器的IP地址

1
ssh root@serverIP

之后会提示输入账户密码,输入即可。

二、配置node.js环境

2.1 安装 node.js

可以移步另一篇文章,Linux安装Node.js,一步一步走就OK啦。

2.2 修改源地址为淘宝 NPM 镜像

修改源地址镜像,提高下载速度

1
$ npm config set registry http://registry.npm.taobao.org/

2.3 配置 node.js 的 gyp 模块,后面安装 aglio 的时候会用到

1
$ npm install -g node-gyp

阅读更多

编写Api-blueprint文档

一、新建Api-blueprint文档

1.1 下载文档编辑工具Atom

打开官网下载 Atom

1.2 安装Atom插件

安装Api-blueprint文档预览插件,可以实时检查

  1. language-api-blueprint:语法高亮
  2. api-blueprint-preview:实时预览

安装方法:依次点击 Atom -> Preferences -> Install 在搜索框中输入 language-api-blueprint 选择 Packages 进行搜索,把红色框框内的两个插件分别点击 Install,如下图所示就算安装完成。

插件下载安装完成后,点击 language-api-blueprintSettings,然后勾选:

  1. Show Indent Guide:显示缩进,因为 API BluePrint 对缩进要求比较高,这个开着比较好,方便排错;
  2. Show Invisibles:显示空格,Tab键,以及换行符;

1.3 新建文档

打开 Atom,Command + N 新建一个标签页,然后保存为api.md。语法高亮,实时预览效果如下:

二、编写 API 文档

  1. 官方文档
  2. 官方例子

我们主要会用到这几个部分:

  • Metadata section 元数据
  • API name & overview section API 名称和说明
  • Resource group section 资源分组
  • Schema section
  • Action section 动作(POST、GET)
  • Request section 请求
  • Response section 响应
  • URI parameters section 请求URL参数
  • Headers section 请求头
  • Body section 请求数据

2.1 Metadata 元数据

Example

1
FORMAT: 1A

你需要使用一个元数据(metadata),来明确指定API Blueprint的版本。比如在上述文件中我们使用的版本号是1A。

2.2 API name & overview section

API 名字以及简单的描述

Example

1
2
3
# Basic ACME Blog API
Welcome to the **ACME Blog** API. This API provides access to the **ACME
Blog** service.

2.3 Resource group section

可以把接口按功能模块进行分类,Group 后面跟类名

Example

1
# Group 员工管理

阅读更多

Linux下安装apache部署静态html

1. 下载源码,本文以2.2.31为例

1
2
$ cd /usr/local/src
$ wget http://apache.fayea.com//httpd/httpd-2.2.31.tar.gz

2. 解压源码

1
$ tar -zvxf httpd-2.2.31.tar.gz

3. 编译安装

1
2
3
4
5
$ cd httpd-2.2.31
$ mkdir -p /usr/local/apache2 //不用切换目录,直接执行
$ ./configure --prefix=/usr/local/apache2 --enable-modules=so --enable-rewrite
$ make //一系列的执行,耐心等着就是的
$ make install //还是耐心等着

4.启动和关闭apache

4.1 启动

1
$ /usr/local/apache2/bin/apachectl -k start // 启动 apahce

如果这里提示什么servername什么的,你还的配置httpd.conf文件,查找httpd.conf文件:

1
$ find / -name httpd.conf

编辑查找到的第一个文件,在以注释ServerName开头的模块下面添加:ServerName localhost:80

退出编辑,用浏览器查看 http://localhost, 得到 it works ,说明 apache 已经配置成功了。

阅读更多

将 Npm 的源替换成淘宝的源

撞墙的时候,我们可以使用国内的源(比如 淘宝 NPM 镜像)去替换官方的源以加快下载包的速度。

一、修改源地址为淘宝 NPM 镜像

1
$ npm config set registry http://registry.npm.taobao.org/

二、修改源地址为官方源

不过呢,我们在发布自己的包的时候却需要将源修改回官方的 https://registry.npmjs.org/ 源。

1
$ npm config set registry https://registry.npmjs.org/

阅读更多

Linux安装Node.js

1. 下载源码,需要在https://nodejs.org/en/download/下载Nodejs版本,本文以v0.12.2为例:

1
2
cd /usr/local/src/
wget http://nodejs.org/dist/v0.12.2/node-v0.12.2.tar.gz

2. 解压源码

1
tar zxvf node-v0.12.2.tar.gz

阅读更多

解决UIView转成UIImage模糊失真问题

阅读更多

UITableView Tips

1. UITableView分割线距左边的间距

需求:如何让分割线距左边的间隙为0

阅读更多

Fastlane自动化构建工具

fastlane是一套自动化打包的工具集,用于 iOS 和 Android 的自动化打包和发布等工作。

一、fastlane

相关文档:

1.1 安装fastlane

1
$ sudo gem install fastlane --verbose

:如果想了解各个组件的具体功能,可以查看另一篇文章:Fastlane自动化组件

1.2 安装Xcode命令行工具

1
$ xcode-select --install

阅读更多

使用Api-blueprint文档创建mock server

API Blueprint是一套API描述标准,和Markdown一样,属于一种标记语言,可以把标记文稿转换成漂亮的接口文档。还可以创建 mock server ,进行本地调试。

一、语法

只要用 markdown 写过东西, 基本很快就能掌握API Blueprint Language 语法。

  • 官方 例子 ,一共也就 10 多个,耐心看完,心里就大概有数了;
  • 语法规范
  • 官方 解释器 ,有了这个解析器,就可以很容易的扩展自己的相关工具了(比如代码生成等)

二、Mock server

两者都可以根据 api-blueprint 的文档创建一个本地的 mock server 。使用它们可以避免前后端开发在时间差上的无谓等待。

阅读更多

适配iOS10以及Xcode8

一、隐私权限访问问题

iOS10,苹果加强了对隐私数据的保护,要对隐私数据权限做一个适配。iOS10调用相机,访问通讯录,访问相册等都要在 info.plist 中加入权限访问描述,不然之前你们的项目涉及到这些权限的地方就会直接crash掉。

阅读更多

IQKeyboardManager

一、IQKeyboardManager]的集成

1
pod 'IQKeyboardManager'

Github地址

引用

1
#import <IQKeyboardManager.h>

二、简单使用

2.1 全局设置

在 AppDelegate的 - (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions 方法中调用

1
2
3
- (void)IQKeyboardManager {
[IQKeyboardManager sharedManager].shouldResignOnTouchOutside = YES;
}

2.2 特定页面的显示与隐藏

1
2
3
4
5
6
7
8
9
10
11
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[IQKeyboardManager sharedManager].enable = NO;
[IQKeyboardManager sharedManager].enableAutoToolbar = NO;
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[IQKeyboardManager sharedManager].enable = YES;
[IQKeyboardManager sharedManager].enableAutoToolbar = YES;
}

阅读更多

json数据转为plist文件

实现方式

  1. 将服务端返回的json数据转为字典或者数组;
  2. 使用writeToFile:atomically:方法将 数组/字典 转为plist文件;
1
2
3
4
5
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dicData = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil];
NSString *path = @"/Users/xiao/Desktop/addresss.plist";
NSLog(@"path = %@", path);
[dicData writeToFile:path atomically:YES];

阅读更多

iOS APP检测版本更新

实现机制

自定义iOS APP检测版本更新,用下面链接发送一个网络请求,参数id是所需检测版本更新的APP ID,会返回一串Json数据,包含了APP的全部信息。信息中有个version字段,取到对应的Value和本地的程序版本进行比较,判断是否是最新版本的APP。

1
#define kAPPInfo @"http://itunes.apple.com/lookup?id=需要检测版本更新的APP ID"

阅读更多

iPhone Size

icon 和 launch image是每个APP必不可少的元素,好看的图标和启动图会更加地吸引用户。随着iPhone屏幕尺寸越来越多,为了适配各种机型,开发者需要为APP配置不同尺寸的图片。系统会根据图片尺寸,辨别适配的是哪个机型。

一、iPhone size

手机型号 屏幕尺寸 英寸
iPhone 4,4s 320 * 480 3.5 英寸
iPhone 5,5s 320 * 568 4 英寸
iPhone 6,6s,7 375 * 667 4.7 英寸
iphone 6 plus,6s plus,7 plus 414 * 736 5.5 英寸

阅读更多

Xcode8打包上传ERROR ITMS-90682解决

项目开发完成,准备发布新版本,用Xcode8, 打包上传到APP Store的时候报了 ERROR ITMS-90682: “Invalid Bundle. The asset catalog at ‘$path’ can’t contain 16-bit or P3 assets if the app is targeting iOS releases earlier than iOS 9.3.” 的错误,Google了一下,大致意思就是图片资源里面包含了16bit或者display P3 颜色的图片,天了噜,图片还有限制呀。

搜了一下解决方案,发现也有小伙伴遇到相似的问题,简书上有篇博客,写的挺详细。当然最大的问题还是有区别,还是解决不了。

最终的实现方案:

  1. 可以按照错误提示把最低适配系统版本改成9.3;
  2. 对于我们项目来说,还需要适配 iOS8 系统,原先工程是适配到8.4会报错,后来改成8.2,重新打包上传,错误不再出现;

总结:

在工程里选择 General -> Deployment Info -> Deployment Target,把最低适配版本改成9.3以上或者8.2 都可以解决错误提示,打包上传成功。对于 iOS8 系统,除了8.2以外是否也能解决,没有一一尝试(8.3和8.4会报错),大家可以试试。

阅读更多

添加和配置SSH Key

GitLab是一个自托管的Git项目仓库,可以通过Web页面访问公开或者私人的项目。它拥有与Github类似的功能,能够浏览源代码,管理团队的访问权限,非常容易就可以查看历史记录。对于个人来说,工作中写的一些Demo、封装的控件都可以上传到Gitlab上,既安全又不会丢失,也便于更新和维护。而SSH key呢,则提供了一种与Gitlab的通信方式。通过这种方式,能够在不用输入密码的情况下(输密码也是件头疼的事呢),就可以进行版本控制。

阅读更多

技术博客

记录阅读过程中感觉还不错的技术博客,持续更新

  1. iOS开发UI篇—CAlayer层的属性
  2. Masonry介绍与使用实践(快速上手Autolayout)
  3. ApplePay申请MerchantID及证书配置
  4. UIKit性能调优实战讲解
  5. iOS 高效添加圆角效果实战讲解

阅读更多

Hexo折腾笔记

Hexo的配置,网上有很多的教程,也曾经在博客中写过,详细的安装过程就不说了。心血来潮,又折腾了一下,更换下样式,简约到极致。

一、主题安装

1.1 主题和渲染器

maupassant主题安装命令:

1
2
3
$ git clone https://github.com/tufu9441/maupassant-hexo.git themes/maupassant
$ npm install hexo-renderer-jade --save #主题安装
$ npm install hexo-renderer-sass --save #渲染器安装

阅读更多

获取iOS设备UDID方法

UDID 是一种 iOS 设备的特殊识别码(Unique Device Identifier),就像我们的身份证一样。有需要安装测试版APP的可以照此方法获取对应设备的UDID,发送给iOS开发者。

一、扫描图中的二维码,用Safari打开浏览器



阅读更多

有关Compile sources的错误解决

今天遇到两个小问题,都是编译错误,花了点时间

一、Xcode error

  1. no input files,文件路径报错;

  2. duplicate symbols for architecture x86_64,重复引用,编译失败;

阅读更多

CocoaPods安装过程中遇到的小问题

一、CocoaPods 简介

每种语言发展到一定阶段,都会出现相应的依赖管理工具,例如 Java 语言的 Maven,nodejs 的 npm。随着 iOS 开发者的增多,业界也出现了iOS 项目依赖管理工具:CocoaPods。开发过程中,基本上需要使用第三方开源库,CocoaPods 的出现为我们节省了大量的时间。

二、CocoaPods 的安装

安装方式异常简单 , Mac 下都自带 ruby,使用 ruby 的 gem 命令即可下载安装:

1
$ sudo gem install cocoapods

可是在这一步却出现了个小插曲,系统提示Error,大致意思就是:目前Ruby的版本太低,必须大于等于2.2.2
Error
现在想起来其实目标很明确,那就把Ruby的版本更新一下就好了呗。当时自己弄得时候还是绕了点弯路,查了很多资料,解决这个Error的方式其实有很多。网上充斥着大量的解决方法,比较简单的方法有两种:

  • 使用OS X 包管理器Homebrew,就能够非常简单地获取到最新版的 Ruby

    1
    $ brew install ruby
  • 升级Ruby环境

    1
    $ sudo gem update --system

Ruby更新了以后,我们就可以正式安装CocoaPods:

1
2
$ sudo gem install cocoapods
$ pod setup

还有一点需要注意的是在执行 pod setup 时,会输出 Setting up CocoaPods master repo ,这个过程的时间会比较久,需要耐心等待,完成以后会提示:Setup completed ,如下图绿色文字所示,CocoaPods就安装完成啦。

阅读更多

低耦合数据埋点实现方案

产品上线后经常会离不开一个词,数据分析。那么如何获取所需数据呢,就引出一个概念:用户行为统计(User Behavior Statistics),俗称数据埋点。在产品流程的关键部位植入统计代码,追踪每次用户行为,页面停留时长等等,通过数据分析,优化产品。

一、常规方案

项目中采用的是友盟统计,以页面统计为例,常规的做法就显得有点儿简单粗暴,就是在所有需要统计的页面 viewDidAppear:viewDidDisappear:中分别埋点,将对应的 pageName 上传给友盟服务器。

beginLogPage

这样做就会发现一个问题,埋点的代码散落在工程中的各个角落,不利于维护和复用。和业务逻辑关系并不是很大的数据统计,却保持着如此高的耦合度。那么我们就会想,怎样才能降低耦合度呢,最好所有的统计代码都在一个 ViewController 里。Biggo,接下来就说说具体实现呗。

阅读更多

NSOperationQueue多任务完成状态监测

需求:当应用需要同时处理多(如:8)个任务时,为了达到最佳性能,我们一般采用异步方式,让应用在Operation正在执行时可以去处理其它事情。也就引出了一个问题,那就是当应用在处理其他事情的时候,如何知道这几(如:8)个任务已经全部完成?

阅读更多