iOS的10.0
本文总结了iOS的10,运行于目前推出iOS设备推出的主要开发者相关的功能。
iOS版10引入了新的方法来增加您的应用程序通过帮助系统参与在适当的时候建议你的应用程序给用户。如果你在你的iOS应用9采纳应用的搜索,你给了用户通过Spotlight和Safari浏览器的搜索结果,切换访问活动和内容的应用程序中深,Siri的建议。在iOS中10及更高版本,可以提供关于用户在您的应用程序,它有助于系统推广您的应用额外的地方,如键盘QuickType建议,地图和CarPlay,应用程序切换,Siri的互动,做信息(对于媒体播放应用程序)的锁屏。为加强与系统集成这些机会是由技术,如集合支持NSUserActivity ,定义为Web标记Schema.org,和API的核心焦点,MapKit,UIKit会和媒体播放器框架中界定的。
在iOS中10, NSUserActivity对象包括mapItem财产,它可以让你提供可以在其它环境中使用位置信息。例如,如果你的应用程序显示酒店评论,你可以使用mapItem属性来保存用户正在查看酒店的位置,这样,当用户切换到一个旅行计划应用程序,该酒店的位置,自动可供使用。如果你支持的应用程序搜索,您可以使用新的基于文本的地址组件属性CSSearchableItemAttributeSet,如thoroughfare和postalCode,充分指定用户可能想要去的位置。请注意,当您使用mapItem属性,系统将自动填充contentAttributeSet财产了。
如要与系统中的位置,一定要指定latitude和longitude值,除了值在地址组件属性CSSearchableItemAttributeSet。它也建议您为提供一个值namedLocation属性,因此用户可以查看位置的名称,以及phoneNumbers属性,因此,用户可以使用Siri的启动与位置的调用。
在iOS中9,添加标记在您的网站上的结构化数据,丰富了用户在Spotlight中和Safari搜索结果中看到的内容。在iOS中10,可以使用在规定的位置相关的词汇Schema.org,如的PostalAddress,进一步提升了用户的体验。例如,如果用户浏览您的网站上描述的位置,系统可以当用户切换到地图显示相同的位置。需要注意的是Safari浏览器支持JSON-LD和微观数据编码Schema.org词汇。
UIKit中介绍了textContentType在UITextInputTraits协议,这样您可以指定希望用户在文本区域中输入的内容的语义。当您提供此信息,系统可以在某些情况下会自动选择合适的键盘和键盘的改进和修正与其他应用程序和网站提供的信息,主动整合。例如,如果您使用UITextContentTypeFullStreetAddress告诉您期望用户在文本字段中输入完整地址的系统,该系统可以提示用户最近观看位置的地址。
如果您的应用程序播放媒体并使用MPPlayableContentManager的API,iOS的10帮助您让用户浏览专辑封面,并通过锁屏上你的应用程序播放媒体。
如果您的共享应用程序使用MKDirectionsRequest API,iOS的10可以当用户可能想搭在应用切换显示。注册成为一提供商,指定MKDirectionsModeRideShare的值MKDirectionsApplicationSupportedModes在关键Info.plist文件。如果您的应用程序只支持共享搭,系统提示您的应用程序与开头的文本“送一程来......”; 如果您的应用程序同时支持骑共享和其他路由类型(如汽车或自行车),系统使用文本“获取方向......”。注意, MKMapItem收到对象可能不包括纬度和经度的信息,并需要地址解析。
与消息应用程序集成在iOS中10,你可以创建与消息应用程序进行交互的应用程序扩展,并让用户发送文字,贴纸,媒体文件和交互式信息。您还可以支持交互式信息该更新每个收件人响应消息。您可以创建两种类型的应用程序扩展:包提供了一组用户可以添加自己的消息内容的贴纸。
一个的iMessage
应用程序可以让你提出一个自定义用户界面消息应用程序中,创建一个标签浏览器,包括文本,贴纸,和一个会话中的媒体文件,并创建,发送和更新互动消息。一个的iMessage应用程序还可以帮助用户搜索,你在你的应用程序的相关网站主办,而他们在消息应用程序中的图像。
您可以无需编写任何代码创建一个贴图包:只需拖动图像到Xcode
中贴纸资产目录里面的贴纸包文件夹。
要制定的iMessage应用程序,您使用API的消息框架( Messages.framework )。要了解信息架构,看到消息框架参考。有关创建应用信息的一般信息,请参阅应用程序扩展编程指南。
如果您的应用程序在共享信息提供的图像和您希望用户能够使用聚光灯流行的图像搜索(即“#images”)来搜索这些图片没有留下消息应用程序,首先创建一个应用程序的iMessage。然后按照下列步骤:
添加com.apple.developer.associated-domains关键是你的应用程序的权利。 包括Web域承载你想搜索的图像列表。 对于每个域,指定spotlight-image-search服务。
在加入apple-app-site-association的文件到您的网站。添加字典的spotlight-image-search服务,包括应用ID,这是球队ID或应用程序ID前缀,其次是包ID。您还可以指定最多500个路径和模式应包括由聚焦流行的图像搜索索引(对于网站路径的一些示例,请参阅通用连接实例创建和上传协会的文件)。
允许Applebot拍(了解更多信息,请参阅关于Applebot)。
用户通知
iOS版10引入了用户通知框架( UserNotifications.framework ),支持本地和远程通知的传递和处理。使用此框架中的类来调度根据特定的条件,如时间或地点本地通知的传送。应用程序和附加应用可以使用这个框架来接收和潜在的时候都传递到用户的设备修改本地和远程的通知。
在iOS的10同时推出,用户通知UI框架( UserNotificationsUI.framework )允许您自定义本地和远程通知的外观,当他们出现在用户的设备上。您可以使用此框架来定义接收通知数据,并提供相应的可视化表示的应用程序扩展。扩展也可以响应与这些通知相关的自定义操作。
语音识别
iOS版10引入了支持连续语音识别,并帮助您构建可识别语音并转录成文本应用一个新的API。在使用语音框架(API的Speech.framework ),你可以执行的实时和录制的音频讲话转录。例如,你可以得到一个语音识别器,并使用这样的代码开始简单的语音识别:
让识别= SFSpeechRecognizer()
让请求= SFSpeechURLRecognitionRequest(网址:audioFileURL)
?识别
.recognitionTask(附:请求resultHandler:{(结果,误差)
打印(结果?
.bestTranscription.formattedString)
})
与访问其他类型的受保护的数据,如日历和照片数据,进行语音识别需要用户的许可(有关访问受保护的数据类,详细信息请参阅安全性和保密性增强)。在语音识别的情况下,被要求的权限,因为数据的发送和暂时存储对苹果的服务器,以提高语音识别的精度。要请求用户的权限,则必须添加NSSpeechRecognitionUsageDescription关键看你的应用程序的Info.plist文件。
当你采用在应用语音识别,请务必标明的用户,他们的讲话得到了肯定,他们不应该在这个时间敏感的话语。
颜色
大多数图形框架在整个系统中,包括核芯显卡,核心图片,金属和AVFoundation,都大大提高了扩展范围像素格式和宽色域色彩空间支持。通过在整个图形堆栈扩展这种行为,这是比以往来支持广色的显示设备更容易。此外,标准化的UIKit在一个新的扩展sRGB色彩空间中工作,因此很容易没有显著的性能损失,在其他更广泛的色域的色彩搭配sRGB颜色。
下面是采用您开始使用广色工作的一些最佳实践。
在IOS 10中, UIColor类使用扩展sRGB色彩空间及其初始化不再夹住原料成分值之间的0.0和1.0 。如果你的应用程序依赖于UIKit的夹紧元件值(不管你是创建一个颜色或要求其元件值的颜色),你需要改变你的应用程序的行为,当你对iOS的10联系起来。
执行自定义在绘图时UIView在iPad临(9.7英寸),底层的绘图环境配置有延长的sRGB色彩空间。
如果您的应用程序呈现的自定义图像对象,使用新的UIGraphicsImageRenderer
类控制目标位图是否使用扩展范围或标准范围格式创建。如果您在使用较低级别的API,如核芯显卡或金属宽色域的设备,执行自己的图像处理,你应该使用扩展范围的色彩空间,并且支持16位浮点组件值的像素格式。当颜色值的夹紧是必要的,你应该这样做明确。
核芯显卡,核心图像和金属表现为着色色彩空间之间转换轻松的色彩和图像提供了新的选择。适应真实色调显示真音显示器采用环境光感应器来自动调节屏幕的颜色和亮度以适应当前环境的照明条件。
为确保您的应用程序与真正的音提供的标准色彩偏移效果很好,添加新UIWhitePointAdaptivityStyle关键看你Info.plist文件来描述您的应用程序的主视觉内容。例如:如果你的应用程序是一个照片编辑应用程序,色彩保真度比自动调节到环境白点更为重要。
在这种情况下,你可以使用UIWhitePointAdaptivityStylePhoto风格,以减少系统的应用真音转变的力量。
如果你的应用程序是一个阅读应用,一致性与环境的白点是有帮助的用户。
在这种情况下,你可以使用UIWhitePointAdaptivityStyleReading风格来增加系统应用真音转变的力量。
应用搜索增强
iOS的10和核心焦点框架介绍几种增强应用程序的搜索:
在应用程序内搜索
搜索延续
众包与微分隐私深层链接流行度
验证结果的可视化
新CSSearchQuery类支持在应用程序中使用现有的核心焦点的API,你指数的内容搜索。使用此API,可以不再需要维护自己的独立搜索索引并让您充分利用Spotlight的功能强大的搜索技术和配套规则,允许用户搜索内容,而无需离开您的应用程序,就像他们在邮件,信息和注意事项做。
在iOS中9,使用搜索的API(如核心焦点, NSUserActivity和Web标记)索引的内容您的应用中让用户搜索使用聚光灯和Safari的搜索界面的内容。 在iOS中10,你可以使用新的Core焦点符号,让用户继续在Spotlight中,他们开始搜索,当他们打开您的应用。 要启用此功能,添加CoreSpotlightContinuation关键看你Info.plist文件,给它的价值 a 是 /a ,并更新您的代码来处理类型的活动延续CSQueryContinuationActionType 。 在对用户信息的字典NSUserActivity您在收到对象application:continueUserActivity:restorationHandler:方法包括CSSearchQueryString键,它的值是表示用户的查询字符串。
iOS版10引入了私人差异的方式,以帮助提高在搜索结果中对应用内容的排名。 iOS的差异提交私人散列的一个子集,以苹果的服务器,用户使用你的应用程序和NSUserActivity,包括深层链接的网址,并有自己的对象eligibleForPublicIndexing属性设置为 a 是 /a 提交到iOS。散列值的差隐私让苹果来算与流行的深层链接而没有带有链接的用户访问相关联的频率。
当您测试您的网站的标记和使用App Search API的验证工具深层链接,它现在显示结果的可视化表示,包括支持的标记,如在规定Schema.org。验证工具可以帮助你看到资料说Applebot网络爬虫索引了,如标题,描述,URL和其他支持的元素。您可以访问验证工具在这里: https://search.developer.apple.com/appsearch-validation-tool 。要了解更多关于支持深层链接和添加标记,看到马克网页内容。要了解如何让你的网站的图片消息应用程序中搜索,看到有消息应用程序集成。
窗口小部件的改进
iOS版10引入了锁屏,现在显示部件的新设计。为了确保您的小部件看起来不错在任何背景下,您可以指定widgetPrimaryVibrancyEffect或widgetSecondaryVibrancyEffect酌情(使用这些属性,而不是过时notificationCenterVibrancyEffect属性)。此外,窗口小部件,现在包括显示模式(所代表的概念NCWidgetDisplayMode),它可以让你的描述有多少内容是可用,允许用户选择紧凑型或扩展视图。
苹果付费增强
在iOS中10,用户可以通过苹果的支付从网站上,并通过与Siri的和地图的互动让方便和安全支付。对于开发商而言,iOS的10介绍您可以在iOS和watchOS,支持动态支付网络的能力,以及一个新的沙盒测试环境中运行的代码使用新的API。
iOS版10引入了新的API,帮助您直接将苹果支付到您的网站。当你支持苹果支付你的网站,用户使用Safari在iOS或OS X浏览可以使用他们的卡在他们的iPhone或Apple关注支付苹果支付。要了解更多信息,请参阅ApplePay JS框架参考。
该PassKit框架( PassKit.framework )介绍,让你支持苹果支付地方UIKit中没有可用的API。 具体来说, PKPaymentAuthorizationController和PKPaymentAuthorizationControllerDelegate使所提供的功能PKPaymentAuthorizationViewController及其委托,但不要求的UIKit。 尽管需要在watchOS并在某些意图支持苹果支付新的API,我们建议您采用它在所有的代码,这样可以为用户提供一个单一的代码基础广泛苹果支付的支持。 (要了解更多关于意图和Siri的整合,见诗丽吉 )。
该PassKit框架还增加了功能,让发卡机构从他们的应用程序中出示请柬。 具体来说, PKPaymentButtonTypeInStore按钮类型可以为卡和显示苹果支付按钮presentPaymentPass:方法可以编程显示卡时( presentPaymentPass:方法是在定义PKPassLibrary )。
当一个新的支付网络可用时,您的应用程序可以自动支持新的网络,而不需要你修改和重新编译应用程序。
该availableNetworks方法让你发现可用的用户在运行时设备上的网络。此外, supportedNetworks属性膨胀,因此,它可以采取一些支付提供者的名称作为参数。您的应用程序,然后自动支持的支付服务提供商支持任何网络。要了解更多信息,请参阅https://developer.apple.com/apple-pay/。
iOS版10引入了新的测试环境可以直接让你提供测试卡在设备上。测试环境恢复加密测试付款数据。要使用此环境下,请按照下列步骤操作:
在创建iTunes Connect中测试iCloud帐户。
登录到您的设备上该帐户。
设置所需的区域进行检测。
使用在列出的测试卡https://developer.apple.com/apple-pay/
。
注意:当您切换的iCloud帐户,环境自动切换。你还是必须使用实际卡在生产环境中测试付款。
安全性和保密性增强
iOS版10引入了一些修改和补充,可以帮助您提高代码的安全性和维护用户数据的私密性。要了解更多关于这些项目,请参见https://developer.apple.com/security/ 。
新NSAllowsArbitraryLoadsInWebContent
为你的关键Info.plist文件为您提供了一个便捷的方式允许任意的Web页面加载,同时保留ATS保护您的应用程序的其他工作。
该SecKey API包括非对称密钥生成改进。使用SecKey API,而不是过时公共数据安全架构(CDSA)的API。
该RC4对称加密套件现在默认为所有的SSL / TLS连接禁用和安全传输API中不再支持SSLv3的。我们建议你停止尽快使用SHA-1和3DES加密算法。
该UIPasteboard类支持剪贴板功能,该功能允许用户复制和设备之间的粘贴,包括API,你可以用它来限制一个纸板到特定设备并设置过期时间标记在此之后,纸板被清除。此外,一个名为pasteboards不再执着,相反,你应该使用共享的容器和“查找”纸板(即,由确定的纸板UIPasteboardNameFind常数)不可用。
你必须通过在您合适的目的字符串键静态声明你的应用程序的用途受保护数据类Info.plist
文件。例如,您必须包括NSCalendarsUsageDescription键进入用户的日历数据。如果不包括相关的目的字符串键,您的应用程序时,它试图访问数据的退出。
CallKit
该CallKit框架( CallKit.framework )允许的VoIP应用程序与iPhone用户界面集成和给用户带来了很好的经验。使用这个框架让用户查看并回答锁屏上的传入的VoIP呼叫和管理联系人从VoIP的电话应用的收藏夹和最近通话的意见要求。
CallKit还引入了应用程序扩展,使呼叫阻塞和来电识别。您可以创建一个应用程序扩展,可以用一个姓名或电话号码相关联告诉系统,当一些应该被阻止。
新闻发布商增强
新闻发布商可以很容易地使用苹果的新闻格式提供设计精美的新闻,杂志和网络内容到苹果的新闻。
任何人都可以报名参加,从各大杂志或新闻机构独立出版商和博客。要开始使用或了解更多关于最近的更新,请访问https://newsresources.apple.com。
视频用户帐户
iOS版10引入了视频用户的帐户框架( VideoSubscriberAccount.framework ),以帮助支持流式身份验证或认证视频点播(也称为电视无处不在)与有线电视或卫星电视提供商进行身份验证的应用程序。使用本框架的API可以帮助您支持单一登录体验中,用户登录一次解锁所有他们的订阅支持流媒体视频应用程序的访问。
应用扩展
iOS的10介绍了,您可以创建一个应用程序扩展了一些新的扩展点,如:
电话号码簿
意图
意图UI
消息
通知内容
通知服务
贴纸包
此外,iOS的10包括第三方键盘附加应用以下增强功能:
您可以通过自动检测文档的输入语言documentInputMode
的财产UITextDocumentProxy类,并改变你的键盘扩展,与该语言保持一致(如果支持)。当检测输入的语言以这种方式,你可以做每个语言的键盘是什么内置在消息交换等。
新handleInputModeListFromView:withEvent:方法让键盘延长显示系统的键盘选取器菜单(也就是全球重要的菜单)。键盘延长应地位,在相同的位置,每个方向系统全球重要的全球重要。另外,如果你需要提供自定义的按键,使键盘设置,例如,你应该把这个键在同一位置作为系统键盘听写关键。要了解更多关于一般创建应用信息,请参阅应用程序扩展编程指南。
额外的框架变化
除了上述的大的变化,的iOS 10包括许多其他的改进。
AVFoundation
该AVFoundation框架( AVFoundation.framework )包括以下增强功能:
新AVCapturePhotoOutput
类提供了所有的摄影工作流程,统一的管道,使更复杂的控制和整个捕获过程的监控和包括新功能,如Live照片和RAW格式拍摄。 你应该过渡到AVCapturePhotoOutput而不是AVCaptureStillImageOutput ,这是iOS的10废弃了。
摄像头的捕获管道现在可以捕捉在硬件支持广色域色彩格式。
默认情况下, AVCaptureSession自动配置为宽色捕获时适合您的采集工作流程的详细信息,请参阅iOS设备兼容性参考。
您不再需要执行不同的行为为AVPlayerItem
,取决于内容是否是电影文件或HLS内容。在iOS上10后链接的应用程序,您只需设置rate财产和AVFoundation确定当足够多的内容已经没有缓冲拖延玩。
该AVPlayerLooper
类可以更容易地循环播放过程中的媒体内容的特定部分。
使用AVAssetDownloadURLSession和AVAssetDownloadURLSession类下载资产,包括HLS流,到设备,然后再播放。 当与FairPlay的流一起使用,可以下载一个加密HLS流和在稍后的时间进行安全播放流。
AVKit该AVKit框架( AVKit.framework )包括updatesNowPlayingInfoCenter属性,指示当正在播放信息中心应更新。
核心数据
核心数据框架(CoreData.framework )包括以下增强功能:
NSPersistentStoreCoordinator
而今保持SQLite的存储连接池。 根NSManagedObjectContext对象(那些没有父母MOCS)透明地支持并发抓取和断层没有序列反目成仇。
NSManagedObjectContext对象与WAL SQLite的商店journal_mode支持一个名为查询世代的新功能。这让建设部在某个时间点被固定到一个版本的数据库,并执行所有未来的抓取和断层针对版本的数据库。固定MOCS移动到最近的事务与任何保存和查询几代人没有生存过程中的续航时间。
新NSPersistentContainer类提供了一个高层次的集成点维持引用您的您的应用程序NSPersistentStoreCoordinator , NSManagedObjectModel和其他配置资源。
核心数据现在有Xcode的更紧密集成,并自动生成和更新您的NSManagedObject子类。
NSManagedObject包括一些额外的便利方法,使它更容易获取和创 建子类。 NSManagedObject具有1的子类:与实体1的关系现在支持entity 。
核心数据引入了提供更好的雨燕整合,包括参数化的几个API调整NSFetchRequest对象。
核心映像
核心映像框架(CoreImage.framework )包括多项增强功能。
RAW图像文件的支持是现在使用的
A8 A9或CPU iOS设备。 核心图像解码可以通过几个第三方摄像头,以及所支持iOS设备的iSight摄像头产生的图像产生RAW图像(了解更多信息,请参阅AVFoundation )。 为了处理RAW图像,使用filterWithImageData:options:或filterWithImageURL:options:创建一个CIFilter对象,调整RAW处理选项,在列出的键 a target="_self" RAW图像选项 /a 和读取从过滤器的处理过的图象outputImage属性。
现在,您可以通过插入定制加工成芯图像过滤图
theimageWithExtent:processorDescription:argumentDigest:inputFormat:outputFormat:options:roiCallback:processor: method.这种方法补充说,核心图像处理显示或输出的图像时,过滤器之间调用在回调块; 块,您可以访问像素缓冲区或包含处理后的图像的当前状态,金属质感和应用自己的图像处理算法。
当使用定制处理器模块或写入滤波器内核,您可以处理比核心映像上下文的工作色彩空间之外的色彩空间的图像。
使用the imageByColorMatchingWorkingSpaceToColorSpace: and imageByColorMatchingColorSpaceToWorkingSpace: methods转换进入和离开你的颜色空间的处理之前和之后。
性能呈现显著改善UIImage
由核心图片图像(例如由使用所创建的备份对象initWithCIImage:在初始化) UIImageView对象。此外,核心映像支持UIImage这是贴上了宽色域色彩配置文件对象呈现在一个UIImageView使用广色域色彩(在能够iOS设备)对象。
核心绘图内核代码现在可以请求特定的输出像素格式。
核心影像引入了五个新的过滤器:
CINinePartTiled
CINinePartStretched
CIHueSaturationValueGradient
CIEdgePreserveUpsampleFilter
CIClamp
核心运动
核心运动框架( CoreMotion.framework)包括计步器的事件,它使应用程序,当用户暂停和运行的同时继续接受快速实时通知。在支持的设备,应用程序可以使用CMPedometer API来注册在前台或后台运行,同时接收实况计步器事件。
基础
Foundation框架(Foundation.framework)包含许多增强功能,例如:
新NSDateInterval
类定义,计算时间间隔的持续时间和确定的日期是否在其内,以及比较日期的时间间隔和检查,看看他们是否相交编程接口。
该NSLocale
类定义了许多,你可以用它来获取有关语言环境,以及如何可以显示信息的新属性。
新NSMeasurement
类可以帮助你转换测量成不同的单元,并计算两个测量之间的和或差。新NSMeasurementFormatter类有助于显示的单位数量,当用户创建的本地化测量交涉。
新NSUnit
类和具体NSDimension子帮你代表度量具体单位。
的
GameKit
该框架的GameKit( GameKit.framework )包括以下更改和增强功能:
游戏中心应用程序已被删除。
如果你的游戏实现的GameKit功能外,还必须实现接口的行为需要用户看到这些功能。例如,如果你的游戏支持排行榜,它可以呈现出GKGameCenterViewController对象或直接从游戏中心读取数据来实现自定义用户界面。
一个新的帐户类型,由实施GKCloudPlayer
类,支持iCloud的,唯一的游戏帐户。
游戏中心提供了在游戏中心管理数据的持久化存储新的广义解。
一个游戏会话( GKGameSession )有球员谁是会议的与会者名单。你的游戏的实现定义何时以及如何从玩家之间的服务器或交换数据的参与者存储或检索数据。游戏会话通常可以替代现有的基于回合制的比赛,实时匹配和持久保存的游戏,并且还使参与者之间的互动等机型。
GameplayKit
该GameplayKit框架( GameplayKit.framework )包括以下更改和增强功能:
程序噪声的产生可以用来生成丰富的游戏世界,创建复杂的自然的纹理和增加真实感相机移动。
空间划分让这样在游戏世界中的数据可以有效地搜索到你的分区游戏世界的数据。
一种新的蒙特卡罗策略( GKMonteCarloStrategist
)帮助那里的可能的移动计算无遗很难模拟你的游戏。
新的决策树API
可以增强你的游戏建设AI,当你采用决策树学习的基础上记录的玩家行动的数据挖掘一概而论行为。要了解更多信息,请参阅GKDecisionTree和GKDecisionNode。
该GKAgent3D
和GKGraphNode3D课程介绍给现有代理和路径调查行为3D支持。
新GKMeshGraph
类提供了更高的性能的替代GKObstacleGraph,让您在数学上少完美路径的成本生产出更自然的输出。
新GKScene
和GKSKNodeComponent类,在SpriteKit和Xcode的编辑变化相结合,使整合GameplayKit与SpriteKit比以往更容易。
HealthKit
该HealthKit框架( HealthKit.framework )包括以下更改和增强功能:
新HKCDADocument
类,它代表一个CDA文档(即,遵循临床文档架构标准的文档)。
新HKWorkoutConfiguration
类,它可以让你指定activityType和locationType的锻炼。
新HKWheelchairUseObject
特征的对象类型和相关HKHealthStore方法wheelchairUseWithError:
新的元数据键指示天气类型,如HKWeatherConditionClear
和HKWeatherConditionCloudy,和锻炼类型,如HKWorkoutActivityTypeFlexibility和HKWorkoutActivityTypeWheelchairRunPace。
HomeKit
在IOS 10,iPad的可经配置以提供远程访问配件,运行自动化触发器,并启用共享用户权限。此外,HomeKit框架( HomeKit.framework )增加了对摄像头和门铃配件及引入了许多新的API,帮助你:
查看和IP照相机附件配置文件进行交互,显示实时数据流和快照,并控制相机的设置,扬声器和麦克风进入新的服务和特性对于主服务,链接服务和有效值,以提供有关附件更多上下文和配置您也可以添加和使用苹果配件设置工作流程建立配件。
要了解更多信息,请参阅HomeKit框架参考。
金属
在iOS系统10,金属包含多项新功能和增强功能,如:
支持曲面细分,从而使3D
应用程序和游戏通过有效地描述复杂的几何形状的GPU来渲染更细致的场景。
功能专业化,这使得很容易地创建高度优化功能的集合,以处理在一个场景中的所有物质和光的组合。
资源堆和记忆渲染目标,这甚至授予资源分配的更细粒度的控制,进一步优化基于金属的应用程序的性能。
ModelIO
该ModelIO框架( ModelIO.framework )包括以下增强功能:
现在支持美元的文件格式。
新MDLMaterialPropertyGraph类可以更容易地支持模型运行程序的变化。
该MDLVoxelArray
类为符号距离字段的支持。
您可以通过实现增加辅助光探头放置
MDLLightProbeIrradianceDataSource协议。
相片
该照片框架( Photos.framework)使得Live照片编辑功能在使用照片框架API来访问用户的照片库和照片编辑应用程序扩展的照片和摄像头应用程序使用的应用程序。具体来说,新PHLivePhotoEditingContext类可用来编辑视频和静止现场照片的照片内容,与基于核心图像增强一个易于使用的API。此外,还可以利用新的核心图像处理器功能的优势,使用等图像处理技术来进行编辑。要了解更多信息,请参阅CIImageProcessorInput和CIImageProcessorOutput。
ReplayKit
该ReplayKit框架( ReplayKit.framework )包括以下增强功能:
ReplayKit
支持广播服务,使得用户可以广播通过第三方网站记录介质。
您可以通过实现此功能的支持RPScreenRecorder
RPBroadcastActivityViewController
和RPBroadcastController类。
参加ReplayKit广播,第三方广播服务需要实现对应用程序扩展。广播UI扩展提供了一个用户界面,允许用户登录到服务,并设立了直播。广播上传扩展接收影片剪辑,并将它们发送到服务。
SceneKit
该SceneKit框架( SceneKit.framework )包括多项增强功能。
一种新的基于物理渲染(PBR)系统允许您利用在3D图形研究的最新创建具有简单的资产创作更真实的结果。特别:使用新的SCNLightingModelPhysicallyBased
着色模型选择加入PBR底纹材料。 PBR材料只需要三个基本属性- diffuse , metalness和roughness -to产生了广泛的逼真的阴影效果。 (在normal , ambientOcclusion和selfIllumination材料特性也仍然有用PBR材料,但你现在可以忽略大量用于传统材料的其他属性。)
PBR
遮光效果最佳环境为基础的照明,这导致即使漫反射表面拿起场景的颜色在他们周围。使用lightingEnvironment属性来全球基于图像的照明在Xcode场景编辑器分配到整个场景,并把光探头捡起物体场景内的局部照明的贡献。
PBR
的场景内容的作者往往更喜欢基于物理方面的工作,所以你现在可以定义使用强度(流明)照明和颜色温度(开氏度),并导入规范使用真实世界的灯具IESProfileURL财产。
与新的HDR
功能和效果的添加更加逼真SCNCamera类。与HDR渲染,SceneKit捕捉范围更广,在一个场景的亮度和对比度,那么您可以定制,能够适应那个场景的范围较窄设备的显示器的色调映射。启用曝光调整时,例如,在游戏中玩家从一个黑暗的区域移动到阳光下创建自动的效果。或使用晕影,色镶边和色彩分级添加一个电影化的外观到您的游戏。
虽然线性的,更多的色彩精确渲染是PBR
阴影和HDR拍照功能的基础上,即使是传统的渲染会产生更好的效果。默认情况下,SceneKit现在执行线性(不伽玛调整)色彩空间的所有颜色的计算,并使用包括宽彩色显示器设备的P3色域。此功能是用于链接针对iOS的SDK 10所有的应用程序自动启用,并具有内容设计和资产管理的几个后果:
SceneKit
颜色相匹配的所有颜色。在以前的版本中,将SceneKit只读从指定为材质颜色的颜色值NSColor或的UIColor对象,忽略颜色配置文件信息,并假设sRGB色彩空间。
SceneKit
解释线性RGB空间着色器修改或定制的金属或OpenGL着色器代码中指定的颜色分量的值。
SceneKit
读取并调整在纹理图像的颜色配置文件信息。纹理设计了线性亮度斜坡,并使用在Xcode资产目录,以确保您的图像使用正确的颜色配置文件。
如果需要,您可以禁用线性空间与渲染
SCNDisableLinearSpaceRendering在应用的关键Info.plist的文件,并与广色SCNDisableWideGamut键。
几何现在可以从场景文件加载或使用任意多边形基元(编程定义SCNGeometryPrimitiveTypePolygon)。SceneKit自动三角测量多边形网格进行渲染,反而使得更精确的曲面细分利用底层多边形网格(了解更多信息,请参阅subdivisionLevel属性)。
SpriteKit
该SpriteKit框架(SpriteKit.framework)包括以下增强功能:
一个新的tilemap的解决方案支持方形,六角形,和等距tilemaps这可以很容易地创建2D,2.5D和横向卷轴游戏。Xcode的编辑器提供了组织你的砖和创建tilemap的全面支持。欲了解更多信息,请参阅SKTileMapNode,SKTileGroup,SKTileGroupRule和SKTileSet类。
新SKWarpGeometry
类用于拉伸或扭曲如何SKSpriteNode或SKEffectNode对象呈现。经纱是由一组控制点指定。新SKAction类型可用于不同的经线效果之间进行动画。
自定义着色器可以使用可单独由使用着色器的每个节点配置属性。要添加属性,创建一个SKAttribute
对象,并将其连接到您的着色器。然后,对使用该着色的每个节点,附加一个SKAttributeValue对象。]
该SKView
类定义新的方法,让您何时以及如何场景呈现了更好的控制。
UIKit
UIKit框架(UIKit.framework)包括许多增强功能,如:
新的基于对象的,完全互动和可中断动画支持,可以让你保持了自己的动画控制和基于手势的互动联系他们。要了解更多信息,请参阅UIViewAnimating
协议参考
,UIViewPropertyAnimator类参考,UITimingCurveProvider协议参考,UICubicTimingParameters类参考,并UISpringTimingParameters类参考。
新
UIPreviewInteraction类和UIPreviewInteractionDelegate协议,这让你提供与PEEK和流行的经验自定义用户界面。
新UIAccessibilityCustomRotor
类及相关类,帮助您提供的辅助技术,如VoiceOver的可以公开给用户的自定义,上下文特定的功能。例如,您可以创建一个自定义的转子,可以让用户的VoiceOver通过反复返回文本包含的下一个拼写错误的单词的范围内找到一个文档中的拼写错误的单词。
这让你决定启用AssistiveTouch
时,和这给你MFI助听器的配对状态。
新UIPasteboardAPI自动兼容的声明内容类型为普通类实例和新的选项,限制对剪贴板对象的生命周期。
在新选项UIPasteboard新
preferredFontForTextStyle:compatibleWithTraitCollection: UIFont方法,它可以让你的标签,文本框和其他文本区域添加对动态类型的支持。
该UIContentSizeCategoryAdjusting协议,它提供了adjustsFontForContentSizeCategory,你可以用它来 确定是否采用元素应该更新其字体,当设备的属性UIContentSizeCategory变化。
在徽章上一个标签栏项目的外观,如背景颜色和文本属性附加的控制。
在所有滚动视图的刷新控制支持和滚动视图的子类,如UICollectionView。
新的UIApplication方法的OpenURL:选项:completionHandler: ,这是异步执行,并呼吁主队列指定 的完成处理程序(此方法取代的OpenURL:)。
新UICloudSharingController类和UICloudSharingControllerDelegate协议,它帮助你启动CloudKit共享操作并显示一个视图控制器,它允许用户查看和修改的参与者和启动和
停止共享。
增强UICollectionView和新UICollectionViewDataSourcePrefetching协议,这有助于你把细胞自动预取的优势,提高了滚动体验。
WebKit的WebKit的框架(WebKit.framework)引入增强PEEK和流行的支持WKWebView对象。在iOS中10,可以使用web视图:shouldPreviewElement:方法来确定指定的Web视图应该显示预览。
已过时的
APIiOS的10弃用几个API,其中包括:
该CloudKit CKDiscoverAllContactsOperation, CKDiscoveredUserInfo , CKDiscoverUserInfosOperation , CKFetchRecordChangesOperation classes.相反,使用CKDiscoverAllUserIdentitiesOperation,CKUserIdentity,CKDiscoverUserIdentitiesOperation和CKFetchRecordZoneChangesOperation类,它们都支持记录共享。几个CKSubscription API,如涉及到区域为基础的订阅(使用方法和属性CKRecordZoneSubscription的API,而不是)和基于查询的用户(使用CKQuerySubscription的API来代替)。
几个NSPersistentStoreCoordinator相关内容无处不在的符号。
该ADBannerView和ADInterstitialAd类和相关的符号UIViewController中。
几个SKUniform有关浮点值的符号。相反,使用方法,如initWithName:vectorFloat2:和uniformWithName:matrixFloat2x2:酌情。
与通知若干UIKit类,如和UIUserNotificationSettings。使用在用户通知框架API(请参阅第用户通知框架参考)。
和didReceiveRemoteNotification:withCompletion:WatchKit
方法。使用handleActionWithIdentifier:forNotification:和didReceiveNotification:withCompletion:代替。另外,通知处理方法WKExtensionDelegate,如didReceiveRemoteNotification:和handleActionWithIdentifier:forRemoteNotification:。相反,使用这些方法中,首先创建一个采用委托对象UNUserNotificationCenterDelegate协议并执行相应的方法。然后委托对象分配给委托的单身财产UNUserNotificationCenter对象。
对于特定的API
弃用的完整列表,请参阅iOS的10.0 API的diff。
ReplayKit
前言
ReplayKit 是WWDC15推出的苹果原生录屏 API。在iOS9的时候主要提供的是录屏,录制完成后可以进行查看、编辑、通过指定方式分享出去。
在WWDC16上新版的 ReplayKit 提出了了 live 功能,简单说就是通过 ReplayKit 可以进行录屏直播。这对于苹果的手游直播行业有着很重要的意义。
首先给出视频地址和API文档
- Go Live with ReplayKit - WWDC 2016
- ReplayKit API Reference
简单测试
弹出可以接收广播的服务列表
新建工程,然后加入ReplayKit.frameword
添加一个按钮,然后按钮点击事件弹出广播服务的列表:
- (IBAction)displayServiceViewController:(id)sender {
[RPBroadcastActivityViewController loadBroadcastActivityViewControllerWithHandler:^(RPBroadcastActivityViewController * _Nullable broadcastActivityViewController, NSError * _Nullable error) {
broadcastActivityViewController.delegate = self;
[self presentViewController:broadcastActivityViewController animated:YES completion:nil];
}];
}
Mobcrush
所以想要直播的游戏本身添加这样一个逻辑,弹出服务列表即可。而直播软件也只需要注册为直播服务,就可以直播任何支持的游戏,软件。国外最火最先支持的就是示例中左边的Mobcrush,官网,里面有手机游戏Tower Dash的直播,就是使用这个技术实现的,Tower Dash游戏直播页面为 - 这里这里,需要***。
我录制了动态图展示:
动态图中可以看出支持摄像头录制,当然还有麦克风,这些已经满足了日常主播的基本需求。
国内
国内现在映客直播安装就直接有注册为广播服务,所以截图中列表里就有。我还安装了熊猫TV,虎牙直播,虎牙助手,虎牙手游。熊猫TV的主播权限还没有申请下来。虎牙手游貌似使用的也是这个技术,但是实现不一样,虎牙手游直接是在虎牙手游APP内部打开直播,提示成功之后,直接就进入了录屏模式,然后退出返回到手游界面开始游戏就可以。查看了虎牙直播平台,已经有主播使用了iPhone7进行王者荣耀直播,熊猫TV暂时还没有看到用iPhone直播手游的。
WWDC 2016
下面是观看WWDC16 记录的知识片段。
ReplayKit
新特性:
- Apple TV support
- Live Broadcasting 直播广播,这个很有用,就是要研究的直播功能
- 可以记录 Face Time摄像头的内容,增强了麦克风记录API
#import "ViewController.h" #importstatic NSString *StartRecord = @"开始"; static NSString *StopRecord = @"结束"; #if TARGET_IPHONE_SIMULATOR #define SIMULATOR 1 #elif TARGET_OS_IPHONE #define SIMULATOR 0 #endif #define AnimationDuration (0.3) @interface ViewController () { } @property (nonatomic, strong)UIButton *btnStart; @property (nonatomic, strong)UIButton *btnStop; @property (nonatomic, strong)NSTimer *progressTimer; @property (nonatomic, strong)UIProgressView *progressView; @property (nonatomic, strong)UIActivityIndicatorView *activity; @property (nonatomic, strong)UIView *tipView; @property (nonatomic, strong)UILabel *lbTip; @property (nonatomic, strong)UILabel *lbTime; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)viewDidAppear:(BOOL)animated { BOOL isVersionOk = [self isSystemVersionOk]; if (!isVersionOk) { NSLog(@"系统版本需要是iOS9.0及以上才支持ReplayKit"); return; } if (SIMULATOR) { [self showSimulatorWarning]; return; } UILabel *lb = nil; CGSize screenSize = [UIScreen mainScreen].bounds.size; //标题 lb = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 140)]; lb.font = [UIFont boldSystemFontOfSize:32]; lb.backgroundColor = [UIColor clearColor]; lb.textColor = [UIColor blackColor]; lb.textAlignment = NSTextAlignmentCenter; lb.numberOfLines = 3; lb.text = @"苹果ReplayKit Demo"; lb.center = CGPointMake(screenSize.width/2, 80); [self.view addSubview:lb]; //创建按钮 UIButton *btn = [self createButtonWithTitle:StartRecord andCenter:CGPointMake(screenSize.width/2 - 100, 200)]; [self.view addSubview:btn]; self.btnStart = btn; btn = [self createButtonWithTitle:StopRecord andCenter:CGPointMake(screenSize.width/2 + 100, 200)]; [self.view addSubview:btn]; self.btnStop = btn; [self setButton:btn enabled:NO]; //loading指示 UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 280, 80)]; [self.view addSubview:view]; view.backgroundColor = [UIColor redColor]; view.layer.cornerRadius = 8.0f; view.center = CGPointMake(screenSize.width/2, 300); activity.center = CGPointMake(30, view.frame.size.height/2); [view addSubview:activity]; [activity startAnimating]; self.activity = activity; lb = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 280, 80)]; lb.font = [UIFont boldSystemFontOfSize:20]; lb.backgroundColor = [UIColor clearColor]; lb.textColor = [UIColor blackColor]; lb.layer.cornerRadius = 4.0; lb.textAlignment = NSTextAlignmentCenter; [view addSubview:lb]; self.lbTip = lb; self.tipView = view; [self hideTip]; //显示时间(用于看录制结果时能知道时间) lb = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)]; lb.font = [UIFont boldSystemFontOfSize:20]; lb.backgroundColor = [UIColor redColor]; lb.textColor = [UIColor blackColor]; lb.layer.cornerRadius = 4.0; NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init] ; [dateFormat setDateFormat: @"HH:mm:ss"]; NSString *dateString = [dateFormat stringFromDate:[NSDate date]]; lb.text = dateString; lb.center = CGPointMake(screenSize.width/2, screenSize.height/2 + 100); lb.textAlignment = NSTextAlignmentCenter; [self.view addSubview:lb]; self.lbTime = lb; //进度条 (显示动画,不然看不出画面的变化) UIProgressView *progress = [[UIProgressView alloc] initWithFrame:CGRectMake(0, 0, screenSize.width*0.8, 10)]; progress.center = CGPointMake(screenSize.width/2, screenSize.height/2 + 150); progress.progressViewStyle = UIProgressViewStyleDefault; progress.progress = 0.0; [self.view addSubview:progress]; self.progressView = progress; //计时器 //更新时间 [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimeString) userInfo:nil repeats:YES]; } #pragma mark - UI控件 //显示 提示信息 - (void)showTipWithText:(NSString *)tip activity:(BOOL)activity{ [self.activity startAnimating]; self.lbTip.text = tip; self.tipView.hidden = NO; if (activity) { self.activity.hidden = NO; [self.activity startAnimating]; } else { [self.activity stopAnimating]; self.activity.hidden = YES; } } //隐藏 提示信息 - (void)hideTip { self.tipView.hidden = YES; [self.activity stopAnimating]; } //创建按钮 - (UIButton *)createButtonWithTitle:(NSString *)title andCenter:(CGPoint)center { CGRect rect = CGRectMake(0, 0, 160, 60); UIButton *btn = [[UIButton alloc] initWithFrame:rect]; btn.layer.cornerRadius = 5.0; btn.layer.borderWidth = 2.0; btn.layer.borderColor = [[UIColor blackColor] CGColor]; btn.backgroundColor = [UIColor lightGrayColor]; btn.center = center; [btn setTitle:title forState:UIControlStateNormal]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [btn addTarget:self action:@selector(onBtnPressed:) forControlEvents:UIControlEventTouchDown]; return btn; } //设置按钮是否可点击 - (void)setButton:(UIButton *)button enabled:(BOOL)enabled { if (enabled) { button.alpha = 1.0; } else { button.alpha = 0.2; } button.enabled = enabled; } //提示不支持模拟器 - (void)showSimulatorWarning { UIAlertAction *actionOK = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){ }]; UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action){ }]; UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"ReplayKit不支持模拟器" message:@"请使用真机运行这个Demo工程" preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:actionCancel]; [alert addAction:actionOK]; [self presentViewController:alert animated:NO completion:nil]; } //显示弹框提示 - (void)showAlert:(NSString *)title andMessage:(NSString *)message { if (!title) { title = @""; } if (!message) { message = @""; } UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleCancel handler:nil]; UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:actionCancel]; [self presentViewController:alert animated:NO completion:nil]; } //显示视频预览页面,animation=是否要动画显示 - (void)showVideoPreviewController:(RPPreviewViewController *)previewController withAnimation:(BOOL)animation { __weak ViewController *weakSelf = self; //UI需要放到主线程 dispatch_async(dispatch_get_main_queue(), ^{ CGRect rect = [UIScreen mainScreen].bounds; if (animation) { rect.origin.x += rect.size.width; previewController.view.frame = rect; rect.origin.x -= rect.size.width; [UIView animateWithDuration:AnimationDuration animations:^(){ previewController.view.frame = rect; } completion:^(BOOL finished){ }]; } else { previewController.view.frame = rect; } [weakSelf.view addSubview:previewController.view]; [weakSelf addChildViewController:previewController]; }); } //关闭视频预览页面,animation=是否要动画显示 - (void)hideVideoPreviewController:(RPPreviewViewController *)previewController withAnimation:(BOOL)animation { //UI需要放到主线程 dispatch_async(dispatch_get_main_queue(), ^{ CGRect rect = previewController.view.frame; if (animation) { rect.origin.x += rect.size.width; [UIView animateWithDuration:AnimationDuration animations:^(){ previewController.view.frame = rect; } completion:^(BOOL finished){ //移除页面 [previewController.view removeFromSuperview]; [previewController removeFromParentViewController]; }]; } else { //移除页面 [previewController.view removeFromSuperview]; [previewController removeFromParentViewController]; } }); } #pragma mark - 按钮 回调 //按钮事件 - (void)onBtnPressed:(UIButton *)sender { //点击效果 sender.transform = CGAffineTransformMakeScale(0.8, 0.8); float duration = 0.3; [UIView animateWithDuration:duration animations:^{ sender.transform = CGAffineTransformMakeScale(1.1, 1.1); }completion:^(BOOL finish){ [UIView animateWithDuration:duration animations:^{ sender.transform = CGAffineTransformMakeScale(1.0, 1.0); }completion:^(BOOL finish){ }]; }]; NSString *function = sender.titleLabel.text; if ([function isEqualToString:StartRecord]) { [self startRecord]; } else if ([function isEqualToString:StopRecord]) { [self stopRecord]; } } - (void)startRecord { // [self setButton:self.btnStart enabled:NO]; NSLog(@"ReplayKit只支持真机录屏,支持游戏录屏,不支持录avplayer播放的视频"); NSLog(@"检查机器和版本是否支持ReplayKit录制..."); if ([[RPScreenRecorder sharedRecorder] isAvailable]) { NSLog(@"支持ReplayKit录制"); } else { NSLog(@"!!不支持支持ReplayKit录制!!"); return; } __weak ViewController *weakSelf = self; NSLog(@"%@ 录制", StartRecord); [self showTipWithText:@"录制初始化" activity:YES]; [[RPScreenRecorder sharedRecorder] startRecordingWithHandler:^(NSError *error){ NSLog(@"录制开始..."); [weakSelf hideTip]; if (error) { NSLog(@"错误信息 %@", error); [weakSelf showTipWithText:error.description activity:NO]; } else { //其他处理 [weakSelf setButton:self.btnStop enabled:YES]; [weakSelf setButton:self.btnStart enabled:NO]; [weakSelf showTipWithText:@"正在录制" activity:NO]; //更新进度条 weakSelf.progressTimer = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(changeProgressValue) userInfo:nil repeats:YES]; } }]; } - (void)stopRecord { NSLog(@"%@ 录制", StopRecord); [self setButton:self.btnStart enabled:YES]; [self setButton:self.btnStop enabled:NO]; __weak ViewController *weakSelf = self; [[RPScreenRecorder sharedRecorder] stopRecordingWithHandler:^(RPPreviewViewController *previewViewController, NSError * error){ if (error) { NSLog(@"失败消息:%@", error); [weakSelf showTipWithText:error.description activity:NO]; } else { [weakSelf showTipWithText:@"录制完成" activity:NO]; //显示录制到的视频的预览页 NSLog(@"显示预览页面"); previewViewController.previewControllerDelegate = weakSelf; //去除计时器 [weakSelf.progressTimer invalidate]; weakSelf.progressTimer = nil; [self showVideoPreviewController:previewViewController withAnimation:YES]; } }]; } #pragma mark - 视频预览页面 回调 //关闭的回调 - (void)previewControllerDidFinish:(RPPreviewViewController *)previewController { [self hideVideoPreviewController:previewController withAnimation:YES]; } //选择了某些功能的回调(如分享和保存) - (void)previewController:(RPPreviewViewController *)previewController didFinishWithActivityTypes:(NSSet *)activityTypes { __weak ViewController *weakSelf = self; if ([activityTypes containsObject:@"com.apple.UIKit.activity.SaveToCameraRoll"]) { dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf showAlert:@"保存成功" andMessage:@"已经保存到系统相册"]; }); } if ([activityTypes containsObject:@"com.apple.UIKit.activity.CopyToPasteboard"]) { dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf showAlert:@"复制成功" andMessage:@"已经复制到粘贴板"]; }); } } #pragma mark - 计时器 回调 //改变进度条的显示的进度 - (void)changeProgressValue { float progress = self.progressView.progress + 0.01; [self.progressView setProgress:progress animated:NO]; if (progress >= 1.0) { self.progressView.progress = 0.0; } } //更新显示的时间 - (void)updateTimeString { NSDateFormatter * dateFormat = [[NSDateFormatter alloc] init] ; [dateFormat setDateFormat: @"HH:mm:ss"]; NSString *dateString = [dateFormat stringFromDate:[NSDate date]]; self.lbTime.text = dateString; } #pragma mark - 其他 - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } //判断对应系统版本是否支持ReplayKit - (BOOL)isSystemVersionOk { if ([[UIDevice currentDevice].systemVersion floatValue] < 9.0) { return NO; } else { return YES; } } @end