启用SSL已经有段时间了,使用的是 Let’s Encrypt 免费证书,除了需要每季度更新一次维护外,一切正常使用,包括WEB和iOS,因为历史原因Android还没有完全切到HTTPS协议,也正因为漏掉Android这一块无意间避过了中间证书的问题,一直到微信小程序开发过程中发现接口访问报 request fail 错误,由此填坑的过程揭开SSL中间证书的面纱
先来认识一下中间证书
中间证书,其实也叫中间CA(中间证书颁发机构,Intermediate certificate authority, Intermedia CA),对应的是根证书颁发机构(Root certificate authority ,Root CA)。为了验证证书是否可信,必须确保证书的颁发机构在设备的可信 CA 中。SSL的验证机制是由一级一级追溯验证,当前CA不可信则向上层CA验证,直到发现可信或没有可信CA为止,注意有时候Intermedia CA也有可能在设备的可信CA中,这样不用一直追溯到Root CA,即可认证完成。
根证书,必然是一个自签名的证书,“使用者”和“颁发者”都是相同的,所以不会进一步向下检查,如果根 CA 不是可信 CA ,则将不允许建立可信连接,并提示错误。
一般Root CA是要求离线保存的,如果要签发证书也是通过人工方式签发,这样能最大程序保证Root CA的安全,而Intermedia CA则相对宽松,允许在线签发证书的,这样方便高效,安全性灵活,即便通过Root CA签发的Intermedia CA发生意外泄露,也可以通过Root CA进行撤销
中间证书的运行机制
阅读全文…
经过漫长的等待,带着十二分复杂的心情,终于在前天下午收到苹果App Store官方客服的电话,告知我们的应用可以暂时先上线了(是的,是暂时上线,细节一会儿讲),当天晚上搜索关键词排第2位找到了我们的应用。
其实App Store 提交应用网上一堆的教程,这里没必要复述一遍,只因为这期间刨过的坑实在是有点匪夷所思(请原谅我用语有点过 🙂 ),按正常流程注册邓白氏编码、注册App Store开发者账号、提交申请上线再正常不过的了,但是就这3步确实让我领略到了为什么有专业代办注册上线的生意了,如果让我再选一次,我觉得确实有必要找代办,不然浪费的时间和机会确实有点得不偿失,好了下面说说我碰到的坑踩到的雷吧
1.应用内支付(IAP)
如果你的产品需要付费,如果你卖的是虚拟类产品,那就要注意了,很有可能需要强制使用苹果应用内支付,微信支付、支付宝、银联对不起统统不允许,只允许使用苹果应用内支付,而且还强制抽成30%。
关于虚拟类产品这个具体怎么定义有时间再研究研究,说实话这个真有点坑,我们是做在线教育类的产品,同行出现只使用苹果支付的,也出现可以使用微信支付的,仔细研究发现就在线教育产品而言,直播类产品基本上使用微信、支付宝没有问题,而录播类产品基本上都只能使用苹果应用内支付,没有发现同时有直播和录播类产品的APP使用微信、支付宝支付
其实如果仅仅只是接入苹果支付,咬咬牙放弃30%收入也就算了,但是仔细研究发现如果只能接入苹果支付制肘还不少
- 苹果支付产品定价只能按苹果预设方案不能随意定价,比如¥6、¥8、¥20、¥58 …. ,而且每个产品还必须在苹果后台设定好
- 抽成30%,说实话目前国内在线教育类公司盈利的真心凤毛麟角,就算是一般公司估计毛利能到30%都很少,就这点不能不说苹果公司有多黑了
- 苹果支付普及率,本人亲自使用感受,如果绑定好了信用卡再走支付确实很方便,按一下指纹就可以,但是就绑定操作而言相对国内普及使用的微信、支付宝确实有点门坎,事实也确实国内使用苹果支付的不多,特别是某些特定市场用户像我们公司目前主要针对初、高中学生家长,这类人群恐怕苹果支付的普及率更低
就定价方案来说也有折中方案,比如提供预充值功能,让用户使用余额支付。我们临时增加了虚拟课币功能,这样用户往账户充值变换成课币,产品使用课币标价。 阅读全文…
因为服务器在国外,很多软件下载更新速度很慢,像Android Studio 下载 Android SDK,还有Xcode也有类似的问题,如果手上有VPN可以娴熟地F墙还好,不过仔细观察发现使用阿里云服务器下载也很快,这让我想到了一个快速实现的方法,简单到1、2、3就可以迅速提高下载速度,亲自体验家里20M带宽可以跑满。
使用到的必要工具
- 阿里云服务器,国内的就可以如果发现下载速度慢可以试试香港或国外的
- 端口转发工具,我选择SecureCRT
阿里云如果没有现成的服务器,可以租个按时间计算的配置,用完释放花不了几块钱,需要注意的是带宽最好选择按流量计算的,且一定要注意把带宽设置足够大,因为阿里按流量计算虽然理论上带宽可以达到G的水平,但是为了避免用户受到攻击带来流量损失做了一个极限带宽设置,设置100M即可。另外系统选择一个Linux发行版本的就可以了,主要是后面使用到端口转发使用SSH账号,Windows版的方法没有试过,其实原理差不多这里就不做研究了,有兴趣大家可以DIY 阅读全文…
很喜欢使用Git作为版本管理和备份工具,分布式的版本管理,简单而快捷的分支管理…有兴趣的同学可以试试这个文档 猛击这里
本来想自己在Mac上搭一个Git环境,没想到Xcode上竟然整合了git,太方便了。更爽的是Mac可以直接使用SSH公钥,直接使用GitHub提供的SSH管理功能。
我的使用环境:
- Mac OSX 10.7.3
- Xcode Version 4.3.3 (4E3002)
- 第一步先在Mac上生成密钥对
打开终端窗口执行命令 ssh-keygen -t rsa,看提示找到对就密钥文件。
注意提示”Enter passphrase”直接回车忽略,不然以后每次都还要输入密码。其实一路回车就可以
localhost:~ clear$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/clear/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/clear/.ssh/id_rsa.
Your public key has been saved in /Users/clear/.ssh/id_rsa.pub.
The key fingerprint is:
85:89:36:6f:7a:ae:02:28:53:f3:5a:42:58:03:6b:0d clear@localhost
The key's randomart image is:
+--[ RSA 2048]----+
|.E |
| .= . o |
|.+ o + o . |
|o + . o . |
| + o S |
|+ o o o |
|.. = . . |
| . . o |
| .... |
+-----------------+
- 向GitHub账号添加刚刚生成的公钥
直接复制 /Users/clear/.ssh/id_rsa.pub 里面的内容添加到,进入GitHub > account settings > SSH Keys > Add SSH key
这样就可以从Mac通过ssh协议进行直接访问GitHub了
- Xcode给项目添加版本库信息
打开Xcode > File > Source Control > Repositories > Add Remote 输入GitHub版本库访问地址(git@github.com…..)
OK,这样就完成了Xcode的GitHub账号设置了,现在可以使用GitHub作为远程版本库了.
PS:貌似GitHub的https不总是支持write,不知道是不是我设置的原因,反正没成功过,果断放弃,既然Mac直接支持SSH协议为什么不用呢?
Object-C属性定义@property修饰符主要有
- atomic
- nonatomic
- readonly
- readwrite
- assign
- retain
- copy
- getter
- setter
它们之间可以组合使用,多个修饰符用逗号分隔,当然互斥的除外。声明属性时可以不必指定修饰符,没有指定修改符的编辑时使用默认参数。
下面将对各修饰符作祥细介绍:
- atomic 和 nonatomic, 原子还是非原子性操作,前者为默认,表示属 性是原子的,支持多线程并发访问(实际就是 setter 的实现中加入了同步锁),后者是非原 子的,也就是适合在非多线程的环境提升效率(因为 setter 中没有同步锁的代码)。没有特别的多线程要求用 nonatomic 有助于提高性能。
- readonly, readwrite 表示属性的可读写特性
- retain, assign, copy 针对对象使用,根据 setter 方法内部实现时对传入的对象的持有方式。retain 会增加引用计数,强引用类型, assign 是给变量直接赋值,弱引用类型,也是默认值, copy 是把 setter 的参数复制一份再赋给成员变量。注意它们对引用计数产生的影响,如果外部不再使用的话,用了 retain 或 copy 赋值的可以release 掉那个对象。
-
getter=getterName 和 setter=setterName, 显式设置 getter/setter 方法名, 未指定它们时 Objective-C 会为我们生成默认的 setter/getter 方法, 有一定的规则,
比如上面的 NSString* gender 属性生成默认的setter 方法是: -(void) setGender:(NSString *);
getter 方法是: -(NSString *) gender;
想看看 Objective-C 为我们生成什么 getter/setter 方法, 不用点号来隐式调用 setter/getter 方法,而是显式的用 [unmi setGender] 或 [unmi gender], 输入式这两个方法会自动提示出来的。注意这里的 getter 方法名并非是像 Java 的 getGender, 而是和属性名同.
假如你想要自己个性的 getter/setter 方法,比如写成 @property(getter=getGender, setter=setSex:) NSString* gender; 那么相应的就会生成:
setter 方法是: -(void) setSex:(NSString *);
getter 方法是: -(NSString *) getGender;
在 Xcode 中 esc unmi 就能看到相应的 setter/getter 方法名的. 可以只用其中一个了,那另一个保持默认。这两个较少用,用途就是可用来生成自己个性的但要符合某个范围内规范的 setter/getter 方法。像 @property(getter = isOnline) BOOL online; 则会生成 -(BOOL) isOnline; 这样的 getter 方法,而不是 -(BOOL) online; 当然我们也很少且不推荐直接调用 getter/setter 方法,而是用点号的方式,但是有意思的去覆盖 getter/setter 方法时就较象明确了。
那么什么时候用assign、什么时候用retain和copy呢?
推荐做法是NSString用copy,delegate用assign(且一定要用assign,不要问为什么,只管去用就是了,以后你会明白的),非objc数据类型,比如int,float等基本数据类型用assign(默认就是assign),而其它objc类型,比如NSArray,NSDate用retain。
顺便说明一下@property 中的 retain/assign/copy 对应 setter 方法的内部实现:
//retain 时:
-(void) setAddress: (Address *) address {
if(_address){
[_address release];
}
_address = [address retain];
}
//assign 时:
-(void) setAddress: (Address *) address {
self.address = address;
}
//copy 时:
-(void) setAddress: (Address *) address {
if(_address){
[_address release];
}
self.address = [address copyWithZone: zone];// Address 必须实现 NSCoping 协议
}
参考资料
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtPropertyIntrospection.html
http://www.cnblogs.com/zilongshanren/archive/2011/08/03/2125728.html
Objective-C 的属性与合成方法使用详解