关注码农话题
做一个实实在在的内行人

作为iOS开发者,你知道iOS10新增了哪些?

作为一名iOS开发者,密切关注苹果的最新动态是一名iOS开发者必备技能。关于iOS10中的新特性介绍的也比较多,今天小编推荐董铂然博客中关于iOS10新增Api的功能介绍。干货多多,不容错过!

iOS技术:作为iOS开发者,你知道iOS10新增了哪些?

本文主要是一些对iOS新功能的探索,之前发现博客里关于iOS新功能的分析大多是过于概括,每个功能几句话,无法了解到具体的功能。

所以本次的探索是基于Api层面,着重看一些具体用法所做的笔记,本来想分别画个类图来着,后来还是觉得太耗时而放弃。

如果不想把苹果iOSSDK里的.h文件都摆出来详细读,那看这篇笔记应该是个不错的选择。

本文以文档的目录为基础,提到的功能模块有:

Proactive Suggestions

Integrating with the Messages App

User Notifications

Speech Recognition

Wide Color

Adapting to the True Tone Display

App Search Enhancements

Widget Enhancements

Security and Privacy Enhancements

还没有详细探索的模块是

SiriKit

CallKit (工作职能和这里联系不多,还不care这里)

Apple Pay Enhancements (工作职能和这里联系不多,还不care这里)

SiriKit

SiriKit的功能非常强大,支持音频、视频、消息发送接收、搜索照片、预订行程、管理锻炼等等。

在用到此服务时,siri会发送Intent对象,里面包括用户的请求和各种数据,可以对这个intent处理选择适当的响应。

这个功能主要是看这两个头文件(#import<Intents/Intents.h>、#import <IntentsUI/IntentsUI.h>)所涵盖到的类太多,前期先略过了,之后等iOS10可以推送更新了再做进一步调研。

Proactive Suggestions 系统预先建议

背景就是iOS9的时候系统给予的主动建议会通过:Spolight搜索,Safari搜索,Handoff,或者siri建议。

在iOS10之后新增了,键盘QuickType建议,地图,车载娱乐,应用切换,siri交互,锁屏播放。

比如你正在一个应用里看一个酒店,可以使用mapitem属性保存正在查看的这个酒店的位置,然后你切换旅行或地图App时这个位置可以自动提供使用。

如果你需要这样利用系统来共享一个位置,那你需要指定这个位置的经纬度,地名,电话等属性 来便于siri的直接调起。

文档中还列出了几种场景

1、在输入框(UITextFiled)输入时,可以指定一下这个输入框的类型,以便系统可以分析出用户的语义。

是电话类型就建议一些电话,是地址类型就建议一些地址。

看下头文件(#import <UIKit/UITextInputTraits.h>)可指定的类型 就是这个新增的textContentType字段,里面有很多种类型可选。

iOS技术:作为iOS开发者,你知道iOS10新增了哪些?

2.如果是视频类App可以使用MPPlayableContentManager(#import <MediaPlayer/MPPlayableContentManager.h>)看了下,新增了一个属性nowPlayingIdentifiers,苹果的意思应该是只要你以前是用这个多媒体类播放音乐的我就可以让你在锁屏页面交互,需要配置在这个数组里。

3.如果是出行类app可以使用MKDirectionsRequest。(#import <MapKit/MKDirectionsRequest.h> )这个类里几乎没有新增api,iOS10就新增了一个枚举,而且看上去就是个默认值。

如果要使用此功能,需要配置在info.plist文件里 新增key – value ,MKDirectionsApplicationSupportedModes – MKDirectionsModeRideShare。

User Notifications 用户通知

总体的意思就是支持了很多用户定义的通知,并且可以捕捉到各个通知状态的回调。

以往通知的概念是:大家想接收的都提前做好准备,然后一下全量分发,没收到也不管了,也不关心发送者。

现在用户通知做成了和网络请求有点像 一个先发request再得到response的流程,甚至封装了error,可以在各个状态的方法中做一些额外操作,并且也能取到一些字段,如发送者等。

此功能的头文件入口在#import <UserNotifications/UserNotifications.h>

iOS技术:作为iOS开发者,你知道iOS10新增了哪些?

1.NSString+UserNotifications.h

有一个方法 localizedUserNotificationStringForKey: arguments: (提供该通知被呈现时的本地化字符串),猜测下面的类有很多initWithIdentifier的,他们的indentifier就是这个。

2.UNError.h

有一个属性UNErrorDomain 和一个枚举 UNErrorCode,顾名思义。

3.UNNotification.h

里面有两个属性,date日期 和 request,这个request是上面“8”的类型UNNotificationRequest,点进去看了下比较清晰,有identifier标识,content内容,trigger触发条件, 和带上这三个东西的初始化方法。

其中内容 和 触发条件这两个属性,分别是上面“7” 和 “12”的类型,这个下面再谈。

4.UNNotificationAction.h

这个类突出的是一个通知的动作,有identifier,title,options(枚举,就是通知当前的权限,允许?拒绝?前台时允许?)属性。

然后就是带上这三个东西的初始化方法。 然后比较费解的就是下面有一个子类UNTextInputNotificationAction ,这个子类有两个额外属性, 按钮title,和文本框placeholder, 为什么会是这两个属性?

莫非是点击通知后下拉出的快速回复,有一个输入框和一个按钮。

5.UNNotificationAttachment.h

这个里面就是URL(资源url属性),type(附件类型)。 然后是带上这两个属性的初始化方法。

下面声明了几个字符串常量,暂时还不知道具体用在哪里,typeHint,hiddenKey,clippingRectKey,TimeKey。

6.UNNotificationCategory.h

有indentifier属性,actions(里面是数组),minimalActions(最重要的数组,就是只能给你两个位置显示你显示哪两个,这么个意思),intentIdentifiers属性(应该是和上面的动作数组关联的吧),options(权限相关,无?允许自定义关闭?允许车载系统交互?)。

最后就是把这些都带上的init方法。

猜测这个类之所以取名叫category应该是,在某个地方展示通知的时候会把所有通知一一分类。

然后每个类别的通知可能最多只能让你展示几个,如果不做限制应该会展示全部通知,如果权限设置的是允许自定义关闭那可能就是支持类似一键清除的操作。

7.UNNotificationContent.h

消息的内容,一看就能知道应该是一个类似于Entity的东西,里面装有大量的属性:

attachments(可选的附件集合),badge(小红点数量),body,categoryIndentifier,launchImageName(从消息里点开的应用程序应该能看到启动图对吧),subtitle,threadIdentifier(与request关联),title,userInfo,sound这个是“11”的类型。

应该是同时来时的声音,点开“11”看一下 ,就俩方法,defaultSound,soundNamed: 自定义声音,都在~/Library/Sounds 目录下。

恩再回到刚才那个content类里面有个子类UNMutableNotificationContent,属性和父类相同,只不过是子类的属性都可以修改了,父类的那些属性都是readonly的。

8.UNNotificationRequest.h 上面第3条说过了

9.UNNotificationResponse.h

有action,也有request,那也就有response,这里面有两个属性,notification,actionIdentifier 响应里就这俩破玩意。

然后有个子类UNTextInputNotificationResponse, 这里面就一个属性userText ,看命名很好猜,应该就是前面说的那个有输入框里输入的内容。

10.UNNotificationSettings.h

这个类里就是一些设置了,有一个枚举说的是有没有权限,一个枚举说的是不支持?禁用?启用?。

然后下面一大波属性,小红点设置,声音设置,弹窗设置等等 都是这个枚举类型, 最后还有个alertStyle属性(枚举,None?Banner?alert?)。

11.sound前面第7条说过了

12.UNNotificationTrigger.h

有一个属性 repeats(是否重复发通知)。

下面有四个子类,push通知触发, 时间通知触发,日历通知触发,地区通知触发, 时间的有timeInterval属性, 日历的有dateComponents属性。

然后时间和日历的子类都有nextTriggerDate 方法。

13.UNUserNotificationCenter.h

这里面东西多到吐了,同学你记得NSNotificationCenter么? 需要提一点的就是以前的通知中心有个方法[NSNotificationCenter defaultCenter], 这里是[UNUserNotificationCenter currentNotificationCenter], 提醒一下到时候别说敲不出来。

方法大多是一些remove,add,get等操作, 还有2个代理方法:通知将要发出去时调用,收到通知的response后调用。

14.UNNotificationServiceExtension.h

里面有两个方法,收到通知的请求后调用, 系统将要销毁时调用。

通知里面有UI相关的类 #import <UserNotificationsUI/UserNotificationsUI.h>

这个类里面就一个文件, 而且方法比较单一,就是收到通知调用,和收到通知的响应调用。

其他方法也就是mediaPlay 和 mediaPause 。

和一些多媒体播放的按钮frame,color等, 这里面的作用难道仅仅就是通知来了后播放的音乐暂时暂停下,响一声通知,再播放?

具体WWDC2016上说的锁屏页面的通知样式处理的api是在下面的部件增强章节中。

Integrating with the Messages App 与系统短信 app交互

对消息额支持很大,可以模拟发消息收消息,发邮件等,提供了UI界面。

也提供了一些额外扩展的api,如表情包区域。WWDC2016上说的各种消息内的新操作在头文件中都能找到Api。

此功能的头文件入口在#import <Messages/Messages.h>

iOS技术:作为iOS开发者,你知道iOS10新增了哪些?

1.MSMessagesAppViewController.h

这个类应该就是苹果自己的消息界面,你可以继承他写你自己自定义的界面。

属性有:activeConversation 指的是当前的会话对象,是上面“2”这个类型,具体详细可以看下面的第“2”点、还有个是presentationStyle(外观样式,枚举类型,紧缩?扩张?)。

接下来就是方法了:requestPresentationStyle(请求消息过渡到指定的样式),dismiss消除方法。

然后就是一波生命周期方法了,每一类都有will和did,会话信息将要(已经)活跃时,将要(已经)解除活跃,将要(已经)选择信息,将要(已经)收到信息,将要(已经)开始发送,将要(已经)取消发送,将要(已经)开始过渡。

2.MSConversation.h

属性有localParticipantIdentifier(当前会话参与者生成的标识,他说只有删了App才会变 姑且理解成id是不会变的),remoteParticipantIdentifiers(远端的标识符数组),selectedMessage(选中的信息),以及4个对象方法 插入一条信息,插入一个标签,插入一段文本,插入一个附件。

这四个方法都有成功的回调。

3.MSSession.h

这个类里面是空的,解释说是用session来处理消息序列间的关系。可能就是占个位,以后估计会添加东西。

这个MSSession是后面很多参数的类型,应该就是区分消息类似于标识符的作用。

4.MSMessage.h

初始化方法是initWithSession ,没错就是上面那个MSSession。

除了初始化方法剩下的就全是属性了:session,senderParticipantIdentifier(发送者的标识符),layout布局这个是“5”这个类型,URL,shouldExpire(选yes会自动消失,用户手动选择为这条消息续命),accessibilityLabel(残疾人模式支持),error。

5.MSMessageLayout.h

这个是抽象类,里面是空的,就是个布局文件,继承自NSObject。

6.MSMessageTemplateLayout.h

继承上面那个类,看名字是模板布局后面应该会用的挺多的,里面的属性有,标题,子标题,尾部标题,尾部子标题,图片,多媒体URL,图片标题,图片子标题。

7.MSSticker.h

应该是消息上的表情包。 里面就有两个属性imageFileURL ,localizedDescription 图片和局部描述。

然后是带上这两个属性的初始化方法 initWithContentsOfFileURL: localizedDescription: 。

8.MSStickerView.h

这个类就是一个view,里面包着一个sticker,也就是包裹着上面那个装饰品的view。

提供了带上sticker的初始化方法,一个常规属性animationDuration,和三个方法startAnimating,stopAnimating,isAnimating。

9.MSStickerBrowserViewDataSource.h

细思极恐,这个类不就是wwdc2016上说的那个可以在消息下面添加自定义表情的地方么。

符合datasource的风格,里面就两个方法,numberOfStickersInStickerBrowserView: (返回一个总数),stickerBrowserView:stickerAtIndex:(返回这个索引下的内容)。

10.MSStickerBrowserView.h

上面那个是datasource,那这个就是用了上面数据源的view呗。

除了初始化方法,有两个属性 stickerSize(枚举,小,中,大),dataSource(就是上面的“9”),还有个人reloadData方法。

11.MSStickerBrowserViewController.h

上面是个view, 这个就是承载上面那个view的viewcontroller。肯定得有这个属性stickerBrowserView 和初始化方法。

这个message模块还有UI相关的api #import <MessageUI/MessageUI.h>

就是两个VC ,MFMailComposeViewController,MFMessageComposeViewController。

这两个都是继承自UINavigationController. 觉得这两个就是发邮件的编辑页面,和发消息的编辑页面。

发邮件的页面里有 canSendMail (Bool方法),set主题,set发件人,set收件人,set内容,set附件。

然后有一个代理,和代理方法,猜也能猜到 就是成功失败回调。

mailComposeController:didFinishWithResult: error: 。 那另一个消息和这差不多了就不说了。

Speech Recognition 语音识别转文字

这个类里面的Api和方法调用都非常清晰,感觉使用起来会非常方便。

真的为科大讯飞捏把汗了,科大讯飞的app(录音宝)我看过,都还没有说一段语音能直接转文字的功能,他们是直接把声音文件上传,然后24小时候再发给你转换后的结果…而且一上来就要收费。

苹果的这个功能已经做到了系统原生支持,真的厉害。

此功能的头文件入口在#import <Speech/Speech.h>

iOS技术:作为iOS开发者,你知道iOS10新增了哪些?

1.SFSpeechRecognitionResult.h

这个类里有三个属性:bestTranscription 就是最优的转化结果咯,是上面的“7”这个类型的。

然后再看下这个SFTranscription.h ,果然不出所料 有两个属性 一个是字符串类型formattedString 一个是数组类型的segments ,恩 前者就是转化后的字符串,后者是分割后的一个个小结果集合。

然后这个分割的一个个小结果呢又是上面“6”这个类型。

那再看一下“6” 里面的属性就是 substring, 时间戳,duration,准确性,备选答案数组,这些很清晰的东西了。

2.SFSpeechRecognitionRequest.h

这个类里东西有点多,属性taskHint,是上面“4”这个类型,点开一看就是一个枚举,用来区分你这个语音识别的请求是哪一类的 查找?确认?听写?无法识别?

接下来是两个BOOL类型的,shouldReportPartialResults(是否语音局部的一块一块也要处理?默认选false就是一句话全说完了再上传吧)。

detectMultipleUtterances(假如你说了10秒钟,只有后5秒匹配到了结果,那你前面删了还是保留?默认不删),然后是分析到的关键字数组,和标识符什么的。

然后这个request有两个子类,一个是从本地URL读取 一个声音文件去识别, 一个是默认做法用话筒和AVFoundation库接收到声音去识别,然后有几个拼接声音的API。

3.SFSpeechRecognitionTask.h

从名字就能看出来这是语音识别最重要的一个类了,里面的属性有:state这是一个枚举,说明当前状态是进行中?已完成?被取消?等等。

接下来是三个常见的 isFinishing ,isCancelled ,error 。

接下来是 isPowerAvailable (是否开启说话声音大小的监测?),peakPower(最大声音),averagePower(平均声音)。

属性就这些了,接下来就是一个协议和一波代理方法:刚刚识别出话语调用,猜测话语时调用,话说完了调用,取消时调用,等等等,你能想到的回调方法苹果应该都有的。

4.上面第2条里面说过了

5.SFSpeechRecognizer.h

和系统的那些相机权限,通讯录权限有点像, 就是现在的状态是什么?同意?拒绝?还是未选择过?

然后提供了方法让用户去选择。

然后有些属性:NSSet类型的supportedLocales(支持地区方言的集合),

available是否可用,locale当前地区 ,defaultTaskHint默认类别,request(就是上面说的请求),队列,代理。

然后有个协议和代理方法:发现用户给与的权限发生改变时调用。

6和7. 上面第1条里说过了

Wide Color 宽域颜色

文档的原话说:大多数的 core字打头的图形框架 还有AVFoundation 都大大提高了对扩展像素和宽色域色彩空间的支持。

通过图形堆栈扩展这种方式比以往支持广色域的显示设备更加容易。现在对UIKit扩展可以在sRGB的色彩空间下工作,性能更好,也可以在更广泛的色域来搭配sRGB颜色。

然后说了几个场景说建议你用sRGB吧,比如依赖于UIkit的clamp component values的应用程序,或是使用较低级别api执行自己图像处理的 都建议用sRGB吧。

然后看了下UIColor类里 到底什么是sRGB? 发现多了两个iOS10新增的api。


入职你的梦想 VS 变现你的技术

IT面试宝典码农市场