事情的起因是这样的…

iOS10即将发布,晚上逛网站,突然发现一篇新闻安全大过天iOS应用将必须支持ATS安全标准

好嘛,这简直不让人玩了
现在开发iOS9的APP都必须在Info.plist里加入App Transport Security Settings -> Allow Arbitrary Loads == YES
否则http请求都不允许你发

对用户来说是好事,对开发者来说就…

先说一下HTTPS为何物
简单来说,HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,是HTTP的安全版
即HTTP下加入SSL层,HTTPS的安全基础是SSL

用户安全了,你们的所有请求都被保护起来了
开发者就头疼了,https证书是收费的,企业级的应用该用上早用上了,个人开发者怎么活呀…

解决方案一:自行颁发证书(速成请直接看方案二)

在Linux/Unix/OSX下,HTTPS的SSL证书可以自行颁发

安装带SSL的nginx

我用yum装的时候nginx是带ssl的,所以请自行百度

然后配置nginx.conf,像我一样稀里糊涂不清楚具体位置可以输入nginx -V找到nginx.conf的位置

大致配置修改如下,修改前建议备份一下老配置

重启nginxsystemctl restart nginx

如果出现ssl模块的问题,则需要重新编译安装nginx,请自行百度

解决方案一的缺陷

现在你可以通过https访问你的网站了,但是你的证书浏览器可不认识
它们一般会向用户发出警告:

嘿,这个网站看起来像个假的,你的信息有可能被泄露,还要继续吗?

OMG!小白用户直接被吓走了好嘛…(此时你一定在想:我一步步照做,你竟然给我看这个?)

解决方案一的改进(这里必须step by step做)

由此可以看见,证书是解决方案一的症结,如何申请让各大浏览器爷爷都认可的证书呢?
我用的是StartSSL

由于每个人情况不同,我这里只讲我用到的所有东西,尽量不遗漏
1. dnspod.cn
2. 腾讯企业邮 添加[email protected]的用户,准备接受验证码
3. 一台电脑(你:这个我有,不要你讲)

先去StartSSL注册个账号,会发送一个验证码给你邮箱,如果收不到找找你的垃圾邮件里有没有
注册好之后,找到Validations Wizard选择Domain Validation (for SSL certificate)
填入你的域名,然后这里需要验证你的邮箱,我选择的是[email protected],这就是一开始让你准备企业邮箱的原因(当然也有别的企业邮箱,据说网易的也不错)
然后邮箱又会收到一个验证码,最后你就验证完了
但是!又是但是,他提示我们这个验证只有90天,之后需要重新验证,这个我还没到90天,我不知道到了之后会有什么样的灾难发生

然后跳到Certificates Wizard选择Web Server SSL/TLS Certificate
在Validated domain(s)中填入你要的域名,比如hello.yourdomain.com
下面的CSR文件,选择Generated by Myself (.cer PEM format certificate)
这里提供了Windows的方法和Linux/Unix的方法
1. Windows用户请直接下载那个exe
2. Linux/Unix输入

最后,Windows下直接记事本打开.csr文件,Linux/Unix下直接cat,把文本黏贴到网页上

最后跳到的网页,会让你click here一定别忘了点
下载下来是一个zip包,打开是4个zip包,找到NginxServer.zip,里面有个hello.yourdomain.com_bundle.crt文件(还好这次不是zip包了,否则就变俄罗斯套娃了)

利用我们这次得到的hello.yourdomain.com_bundle.crt文件和yourdomain_nopwd.key替换解决方案一里面nginx.conf的2个文件就可以了

解决方法二(其实并没有,耐心点看吧,为了孩子)

As we all know. 苹果在iOS7.1中的Adhoc强制使用https链接,这下公司的小伙伴就不能愉快的通过内网下载安装测试包了

经过一番折腾,终于实现了自签署SSL证书让手机通过浏览器在线安装ipa

  • 1. 环境

    开发环境:Mac OS X 10.9.4+Xcode6Beta5

    服务器:CentOS 6.5 x64+apache2

  • 2. 客户端准备部署文件

    a)先去developer.apple.com申请证书和描述文件(adhoc,过程略去不表)
    b)将工程打包成ipa,如Demo.ipa,准备一个Icon.png和一个[email protected]
    c)建立Demo.plist文件


    d)上传Demo.ipa,Demo.plist,Icon.png,[email protected]到/var/www/html/ipa目录下备用
  • 3.服务端配置

    a)安装openssl


    b)生成证书

    c)配置apache

    d)将生成的my-ca.crt拷贝到/var/www/html/ipa目录下备用
  • 4. Let’s Go!

    a)在iOS设备上打开safari访问,https://www.your-domain.com/ipa/my-ca.crt,信任并安装
    b)在iOS设备上打开safari访问,itms-services://?action=download-manifest&url=https://www.your-domain.com/ipa/Demo.plist

  • 5. 还有什么?

    a)安装设备的udid需要在描述文件里
    b)做一个网页,引导用户先安装crt,再点击itms-service


     

相关文章:http://jianyu996.blog.163.com/blog/static/1121145552012102293653906/

初学iOS开发,目前尝试用xib来构建UI

构建时有2种常用的方式:initWithNibName和loadNibNamed

我最初接触到的,是自定义一个复杂的UITableViewCell

然后在setData里做一些替换UI文字和图片的工作

于是乎,下一个ViewController我也这么做

报错 发现[[NSBundle mainBundle] loadNibNamed:@”MyViewController” owner:self options:nil][0]是一个UIView对象

没关系,UIViewController不是还提供了initWithNibName:bundle:方法么,于是乎

编译通过,但是奇怪的是,initWithNibName:bundle:里的自定义代码没有生效,发现xib里映射的对象全是nil

经过搜索查证,发现应该把自定义代码放在viewDidLoad里面

其实Xcode在生成文件模版的时候也提示开发者了

init的时候Custom initialization

viewDidLoad才是Do any additional setup after loading the view

 

转自http://wangwenhao.net/2011/10/26/the-property-in-ios-develop/

大家都知道@property和@synthesize可以自动生成某个类成员变量的存取方法,但可能对property中的一些属性不是很了解,网上的一些介绍有的不是很正确,感觉会误导新手,于是准备详细介绍一下property中的详细属性。

先介绍一下默认的情况:

readwrite:这个属性是默认的情况,会自动为你生成存取器

assign:这个属性一般用来处理基础类型,比如int、float等等,如果你声明的属性是基础类型的话,assign是默认的,你可以不加这个属性

对于assign来说,他的存取器代码是这样的:

natomic:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。

然后说一下其他的情况:

readonly:只生成getter不会有setter方法

copy:这个会自动生成你赋值对象的克隆,相当于在内存中新生成了该对象的副本,这样一来,改变赋值对象就不会改变你声明的这个成员变量了

retain:会自动retain赋值对象,具体实现如下:

 

可见首先要判断一下当前myField是否就是新赋值来的对象,如果不是要将自己release掉,之后才会进行赋值及retain。

nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。

 

工程上线后,总会有几个崩溃,有的是操作问题,有的是程序bug,下面就是如何通过崩溃日志找到程序bug的过程

  1. 先弄到设备上APP的crash日志
    参照(这篇日志),我的日志是从报错平台上得到的,这步跳过
  2. 打开报错日志(这里只保留了有用信息,不过你拿得到报错机器的话…直接看8.)
  3. 分析
    gcld开头的应该就是引起崩溃的地方,不过完全看不懂
    a) 创建一个crash文件夹
    b) 把报错日志重命名成app.crash 放进crash文件夹
    c) 问开发要xcarchive,从xcarchive里找到app.app和app.app.dSYM 放进crash文件夹
    d) 复制/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash 放进crash文件夹
    e) 打开Terminal

    f) 我们看到了"got symbolicator for /Users/superyyl/Desktop/crash/app.app/app, base address 4000"这种日志
  4. 打开gcld-kuaiyong-symbol.crash文件
    发现Thread 0的地方已经变样子了

  5. 找到C代码​
    打开LuaCocos2d.cpp,找到21969行,看到C代码

  6. 根据日志判断崩溃原因
    错误类型是SIGSEGV,从signal.h文件中得知
    ​​

  7. 分析用户的行为日志
    such as:最近收发的数据包,最近调用的接口,进入的场景名
    来跟踪lua代码可能出错的地方

  8. 既然拿得到设备…
    a) 找开发要到当时版本的xcarchive,导入到xcode中
    b) 连接设备
    c) 从xcode里的Organizer-Devices里找到Device Logs
    d) 找到崩溃的日志,左键单击
    e) 开始的2秒,崩溃日志还是内存地址,但是2秒解析过后,就能找到具体行了

  9. 最后
    这个方法能找到大部分的报错原因,但有时候拿到crash并非完全有效,比如你可能拿到大量例子中的"___lldb_unnamed_function6269"就无从下手

附录1:

Apple Hardware Model

附录2: 

signal.h defines