前言
最近这两天,微博、朋友圈里面被WWDC的内容刷屏,讲的都是关于watch OS
、tv OS
、mac OS
以及iOS
上面的一些更新,当然目前的我比较关心的是iOS
方面的改变。也是奇怪,别人都出iOS10的系统了,我还在这写iOS9的新特性,好吧,写此篇文章是为了总结一下,以便于以后查看。
HTTPS
摘要:为了增强数据访问安全,iOS9默认会把所有的
http
请求都改为https
请求,iOS9.x-SDK编译时,默认会让所有从NSURLConnection
、CFURL
、NSURLSession
发出的http
请求统一采用TLS1.2协议
。服务器因此需要更新,以解析相关数据。如果不更新,可以通过在info.plist中声明,倒退回不安全的网络请求。而这一做法,官方文档称为ATS
,全称为App Transport Security
,是iOS9的一个新特性。一个符合
ATS
的https
,应该符合如下条件:Transport Layer Security
协议版本要求TLS1.2以上;- 服务的
Ciphers
配置要求支持Forward Secrecy
等; - 证书签名算法符合ATS要求等。
如果我们服务器不更新,我们访问的还是
http
链接,我们该怎么办呢?我们在工程的info.plist文件中添加如下图所示的代码即可:
Bitcode
未来,Watch应用必须包含bitcode,iOS不强制,Mac OS不支持。但是最坑的一点是:Xcode7及以上版本会默认开启bitcode。
什么是bitcode?
官方文档的定义是这样的:
Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the App Store. Including bitcode will allow Apple to re-optimize your app binary in the future without the need to submit a new version of your app to the store.
翻译过来就是:
bitcode 是被编译程序的一种中间形式的代码。包含 bitcode 配置的程序将会在 App Store 上被编译和链接。 bitcode 允许苹果在后期重新优化我们程序的二进制文件,而不需要我们重新提交一个新的版本到 App Store 上。
在Xcode简介中是这样描述的:
Bitcode. When you archive for submission to the App Store, Xcode will compile your app into an intermediate representation. The App Store will then compile the bitcode down into the 64 or 32 bit executables as necessary.
翻译过来就是:
当我们提交程序到 App Store上时, Xcode 会将程序编译为一个中间表现形式( bitcode )。然后 App store 会再将这个 bitcode 编译为可执行的64位或32位程序。
如果你的应用准备启用Bitcode编译机制,就需要注意以下的几点:
- Xcode 7默认开启 Bitcode ,如果应用开启 Bitcode,那么其集成的其他第三方库也需要是 Bitcode 编译的包才能真正进行 Bitcode 编译;
- 开启 Bitcode 编译后,编译产生的 .app 体积会变大(中间代码,不是用户下载的包),且 .dSYM 文件不能用来崩溃日志的符号化(用户下载的包是 Apple 服务重新编译产生的,有产生新的符号文件);
- 通过 Archive 方式上传 AppStore 的包,可以在Xcode的Organizer工具中下载对应安装包的新的符号文件。
URL Scheme引入白名单
iOS9中,如果使用
canOpenURL:
方法,该方法涉及到的URL Scheme
必须在info.plist中将它们列为白名单,否则不能使用。key叫做LSApplicationQueriesSchemes
,键值内容是:<key>LSApplicationQueriesSchemes</key> <array> <string>urlscheme</string> <string>urlscheme2</string> <string>urlscheme3</string> <string>urlscheme4</string> </array>
常见URL Scheme白名单。
<key>LSApplicationQueriesSchemes</key> <array> <!-- 微信 URL Scheme 白名单--> <string>wechat</string> <string>weixin</string> <!-- 新浪微博 URL Scheme 白名单--> <string>sinaweibohd</string> <string>sinaweibo</string> <string>sinaweibosso</string> <string>weibosdk</string> <string>weibosdk2.5</string> <!-- QQ、Qzone URL Scheme 白名单--> <string>mqqapi</string> <string>mqq</string> <string>mqqOpensdkSSoLogin</string> <string>mqqconnect</string> <string>mqqopensdkdataline</string> <string>mqqopensdkgrouptribeshare</string> <string>mqqopensdkfriend</string> <string>mqqopensdkapi</string> <string>mqqopensdkapiV2</string> <string>mqqopensdkapiV3</string> <string>mqzoneopensdk</string> <string>wtloginmqq</string> <string>wtloginmqq2</string> <string>mqqwpa</string> <string>mqzone</string> <string>mqzonev2</string> <string>mqzoneshare</string> <string>wtloginqzone</string> <string>mqzonewx</string> <string>mqzoneopensdkapiV2</string> <string>mqzoneopensdkapi19</string> <string>mqzoneopensdkapi</string> <string>mqzoneopensdk</string> <!-- 支付宝 URL Scheme 白名单--> <string>alipay</string> <string>alipayshare</string> </array>
注意:白名单上限是50个
属性值nil
不知道大家有没有注意到,自从Xcode7开始,官方文档的类里面一些属性就多了一些类似nonnull
、nullable
、null_resettable
这样的字眼。
nonnull:表示该属性的
setter
和getter
方法都不能为nil
@property (nonatomic, strong, nonnull) NSArray *names;
也可以这样写:
@property (nonatomic, strong) NSArray * __nonnull names;
代表着
names
数组的getter
方法和setter
方法都不能为nil
。nullable:表示该属性的
setter
和getter
方法都能为nil
。(注意:默认都是nullable
)@property (nonatomic, strong, nullable) NSArray *names;
也可以这样写:
@property (nonatomic, strong) NSArray * __nullable names;
代表着
names
数组的getter
和setter
方法都能为nil
。null_resettable:
setter
方法可以为nil
,getter
方法不能为nil
。(**控制器的view就是使用这个修饰 **)@property (nonatomic, strong, null_resettable) NSArray *array;
注意:以下写法是错误的:
@property (nonatomic, strong) NSArray * __null_resettable array;
总结:
- 只能修饰对象类型,不能修饰基本类型;
- 既可以修饰属性,又可以修饰方法的参数和返回值;
NS_ASSUME_NONNULL_BEGIN
和NS_ASSUME_NONNULL_END
之间的属性都是添加了nonnull
修饰的。
泛型
举个🌰吧:我们定义一个可变数组,然后可以随便往数组里面添加NSString
,NSNumber
,NSObject
对象。这样的话当我们取数组元素的时候返回的是id
类型,这时候如果我们想要取长度的话,使用点语法是没有提示的。(因为id类型不可以使用点语法),这个时候,我们可以使用泛型来修饰我们定义的可变数组。
@property (nonatomic, strong) NSMutableArray<NSString *> *names;
这样子之后,我们只能往该数组里面添加字符串类型的元素了。此时我们获取元素的时候就能明确地知道是字符串类型的。
举一反三
我们定义字典也可以使用泛型
// 代表着字典的key为NSString类型,value为NSNumber类型
@property (nonatomic, strong) NSDictionary<NSString *, NSNumber *> *books;
自定义泛型
例子:定义一个ScottBag
类,一个ScottBook
类,如果我们给ScottBag
类添加如下两个方法:
@interface ScottBag : NSObject
- (void)add:(id)param;
- (id)get:(NSInteger *)index;
那么我们可以用ScottBag
类生成的对象去add
任意对象。
如果我们给ScottBag
类添加自定义泛型:
@interface ScottBag<ObjectType> : NSObject
- (void)add:(ObjectType)param;
- (ObjectType)get:(NSInteger *)index;
那么我们可以用以下方式只能向ScottBag
类生成的对象中添加规定的类型对象,如下,我们就规定ScottBag
类生成的对象只能添加ScottBook
类型的对象:
ScottBag<ScottBook *> *bag = [[ScottBag alloc] init];
// <#(ScottBook *)#>表示ScottBook类型的对象
[bag add:<#(ScottBook *)#>];
StoryBoard Refrence
我们都知道以前如果我们要使用StoryBoard来做项目的话,要么就是所有的控制器都放在一个StoryBoard中,通过连线的方式进行通信,要么就是通过代码来读取不同StoryBoard种的控制器来通信。
为了解决这一问题,在iOS9中引入了StoryBoard Refrence
这个概念,Storyboard Reference
允许你从segue
中引用其他storyboard
中的viewController
。这意味中你可以保持不同功能模块化,同时Storyboard
的体积变小并易与管理。不仅容易理解了,和团队一起工作时,合并(工作成果)也变的简单了。
Search API
这个在实际开发中并没有使用到,不过大家可以自己学习。—>传送门
UIStackView
这个在开发中暂时没有用到,在这里记录一下学习的资料。—>传送门
3D touch
引言
在iPhone6s问世之后,很多果粉都争先要体验3D Touch给用户带来的额外维度上的交互,这个设计之所以叫做3D Touch,其原理上是增加了一个压力的感触,通过区分轻按和重按来进行不同的用户交互。
实践
3D Touch是一个很新颖的设计,可是苹果文档也给我们说了
With Xcode 7.0 you must develop on a device that supports 3D Touch. Simulator in Xcode 7.0 does not support 3D Touch.
WTF,是不是看到这里心都凉了一半,是的,Xcode7是支持3D Touch开发的,可是模拟器并不支持这个手势。由于我没有6s测试机,因此就不做深入了。
最后更新: 2023年12月02日 18:27:22
本文链接: http://example.com/post/387a5c0e.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!