关键字参考 2015 Objective-C 新特性
这些是纯编译器的语法支持(llvm 7.0),没有借助任何 objc runtime 的升级,也就是说,这个新语法在 Xcode 7 上可以使用且完全向下兼容(更低的 iOS 版本)
- nullable (_Nullable、__nullabel setter 和 getter 可以为空)
- nonnull(_Nonnull、__nonnull setter 和 getter 不能为空)
- null_resettable(_Null_resettabel、__null_resettable setter 可以为空,getter 不能为空)
- __covariant: 协变, 用于数据强制转换类型(子类可以转变父类)
- __contravariant: 逆变, 用于数据强制转换类型(父类可以转变子类)
- kindof : 表示当前类, 或者它的子类(kindof使用: 放在类型前面, 表示修饰此类型)
- Foundation 还提供了一对儿宏,包在里面的对象默认加 nonnull 修饰符,只需要把 nullable 的指出来就行 NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END
关键字只能修饰对象, 不能修饰基本数据类型, 可以用在属性, 方法的参数, 方法的返回值使用, 在默认情况下, 不加nullable, setter 和 getter 都是可以为nil, 以下是nullable使用方法,nonnull、null_resettable 同理
@property (nonatomic, strong, nullable) NSArray *array;
@property (nonatomic, strong) NSArray * __nullable array;
@property (nonatomic, strong) NSArray * _Nullable array;
iOS 9引入联系人框架(Contacts.framework和ContactsUI.framework),它为通讯簿和通讯录UI框架提供了更加面向对象替代。要了解更多信息,请参阅官方文档联系人框架参考
联系人选择封装
- UIStackView类,它可以帮助您管理一组子视图,可以垂直或水平排列堆叠。
- 新的布局锚点UIView(如leadingAnchor和widthAnchor)NSLayoutAnchor,和NSLayoutDimension所有这些有助于使布局容易。新的布局指南,可帮助您采用可读的内容页边距,并定义视图中内容应绘制的位置。有关更多信息,请参阅UILayoutGuide。
- 对UIKit Dynamics的增强功能,例如支持非矩形碰撞界限,新UIFieldBehavior类,除了可定制之外还支持各种字段类型,还有其他附件类型UIAttachmentBehavior。
- AddressBook/AddressBookUI.frameworks废弃,使用Contacts/ContactsUI.frameworks替代.
- NSURLConnection废弃,使用 NSURLSession 替代
兼容iOS 10 资料整理笔记
活久见的重构 - iOS 10
开发者所需要知道的 iOS 10 SDK 新特性
- iOS 10引入了通知框架(UserNotifications.framework),它支持本地和远程通知的传递和处理。您可以使用此框架的类根据特定条件(如时间或位置)安排本地通知的传递。应用程序和应用程序扩展可以使用此框架在本地和远程通知传递到用户的设备时接收并潜在地进行修改。
- 在iOS 10中也引入了UserNotificationsUI.framework,您可以在用户设备上显示本地和远程通知时自定义外观。您可以使用此框架定义一个应用程序扩展,它接收通知数据并提供相应的可视化表示。您的扩展程序还可以响应与这些通知相关联的自定义操作。
- iOS 10引入了一个新的API,支持连续语音识别,并帮助您构建可识别语音并将其转录成文本的应用程序。使用Speech框架(Speech.framework)中的API ,您可以执行实时和录制音频的语音转录。例如,您可以使用以下代码获取语音识别器并开始简单的语音识别:
let recognizer = SFSpeechRecognizer()
let request = SFSpeechURLRecognitionRequest(url: audioFileURL)
recognizer?.recognitionTask(with: request, resultHandler: { (result, error) in
print (result?.bestTranscription.formattedString)
})
与访问其他类型的受保护数据(如日历和照片数据)一样,执行语音识别需要用户的许可(有关访问受保护的数据类的更多信息,请参阅安全和隐私增强)。在语音识别的情况下,需要许可,因为数据被传输并临时存储在苹果的服务器上,以提高识别的准确性。要请求用户的许可,您必须将NSSpeechRecognitionUsageDescription键添加到应用程序的Info.plist文件中,并提供描述应用程序使用情况的内容。
当您在应用程序中采用语音识别时,请务必向用户说明他们的演讲是否被识别,以避免在当时发出敏感的话语。
Foundation框架(Foundation.framework)包含许多增强功能,如:
- 新NSDateInterval类定义了一个用于计算时间间隔持续时间的程序接口,并确定一个日期是否在其中,以及比较日期间隔和检查它们是否相交。
- 在NSLocale类定义了许多,你可以用它来获得有关语言环境,以及如何可以显示信息的新属性。
- 新NSMeasurement课程帮助您将测量值转换为不同的单位,并计算两次测量之间的总和或差值。NSMeasurementFormatter当向用户显示单位数量时,新类可帮助您创建测量的本地化表示。
- 新的NSUnit类和具体NSDimension子类可以帮助您表示具体的度量单位。
UIKit框架(UIKit.framework)包括许多增强功能,如:
- 新的基于对象的完全交互式和可中断的动画支持,可让您保留对动画的控制,并将其与基于手势的交互链接。要了解更多信息,请参阅UIViewAnimating Protocol Reference,UIViewPropertyAnimator类参考,UITimingCurveProvider协议参考,UICubicTimingParameters类引用和UISpringTimingParameters类参考。
- 新的UIPreviewInteraction类和UIPreviewInteractionDelegate协议,让您提供与预览相关的自定义用户界面。
- 新UIPasteboardAPI可以自动声明普通类实例的兼容内容类型和限制粘贴板上对象生命周期。
- 新的preferredFontForTextStyle:compatibleWithTraitCollection: UIFont方法,它允许您添加对标签,文本字段和其他文本区域中的动态类型的支持。
该UIContentSizeCategoryAdjusting协议提供了adjustsFontForContentSizeCategory可用于确定在设备UIContentSizeCategory更改时采用元素是否应更新其字体的属性。
额外控制标签栏项目上徽章的外观,如背景颜色和文本属性。
支持所有滚动视图和滚动视图子类中的刷新控件,例如UICollectionView。- 新UIApplication方法openURL:options:completionHandler:是异步执行的,并在主队列中调用指定的完成处理程序(此方法替换openURL:)。
- 新的UICloudSharingController类和UICloudSharingControllerDelegate协议,可帮助您启动CloudKit共享操作,并显示视图控制器,让用户查看和修改参与者并启动和停止共享。
- 增强功能UICollectionView和新UICollectionViewDataSourcePrefetching协议,可帮助您利用单元格的自动预取来改善滚动体验。UICollectionView新特性
WebKit框架(WebKit.framework)在WKWebView对象中引入增强的预览和弹出支持。在iOS 10中,您可以使用该webView:shouldPreviewElement:方法来确定指定的Web视图是否应显示预览。
WWDC 17: 开发者的最初观感
开发者所需要知道的 iOS 11 SDK 新特性
支持二进制(非文本)条形码。
为AV Foundation,Core Image和SiriKit添加了API,以支持检测,解码和创建具有二进制内容的条形码。CIBarcodeDescriptor为Core Image 添加了一个新的条形码描述符对象,以提供与AV Foundation和Vision API的互操作性。MusicKit
MusicKit可让您的应用访问完整的Apple Music目录以及用户的图书馆。
StoreKit中增加和更新了功能,用于检索客户端令牌和店面标识符. 在Media Player中添加和更新功能以启用播放。在Apple Music订户设置流程中添加了自定义消息的显示。
- 支持拖放功能。
在iOS中拖放可让用户将项目从一个位置拖动到另一个位置; 在单个应用程序或不同的应用程序中。
功能增加,将视图识别为拖动源和目的地。
添加了可定制的预览和定制动画。- 新增 - 浏览本地和iCloud文档。
添加了视图控制器,用于浏览存储在本地和云中的文档。有关更多信息,请
添加了UIDocumentBrowserAction一个用于为文档浏览器创建自定义操作的对象。
添加了FileProvider和FileProviderUI框架,用于添加第三方存储服务。- 改进了动态类型支持。
添加了UIFontMetrics一个用于创建根据当前选定的文本大小进行缩放的自定义字体的对象。
更新自动布局,以便在基准锚点是使用系统间距的约束的一部分时,根据字体大小动态调整间距。
添加了一个属性来保存PDF资源的矢量数据,以实现平滑缩放。这可以用于显示较大版本的条形条和分段控制项,以及调整图像大小以匹配用户的文字大小。在资产目录中,为PDF选择“保留矢量数据”以启用缩放。
添加UIAccessibilityContentSizeCategoryImageAdjusting了一种用于缩放辅助功能文本大小的图像的协议。- 改进了动态类型的自动布局支持。
更新NSLayoutXAxisAnchor并NSLayoutYAxisAnchor提供使用两个锚之间的系统间距创建约束的工厂方法。以前,创建这样的约束的唯一方法是使用-Visual Format语言中的dash()。
添加了一个选项,NSLayoutFormatOptions用于创建使用基线到基线间距的Visual Format语言字符串。
更新UIStackView以实现系统间距和定制间距。- 更新的文本内容可以与App Password自动填充一起使用。
添加username和password属性UITextContentType。- 对键盘扩展的更新。
已添加selectedText,该属性UITextDocumentProxy返回文档中当前选定的文本。
已添加documentIdentifier,其属性UITextDocumentProxy指定用户是否导航到新的文本小部件。
添加hasFullAccess了UIInputViewController检查键盘权限的属性。
添加needsInputModeSwitchKey了UIInputViewController控制输入 模式切换键显示的属性。
在“设置”中添加新的系统权限,以便应用程序访问附加的键盘扩展。- 改进的可用存储空间API。
URL为不同的使用场景添加了新的键。
volumeAvailableCapacityForImportantUsageKey 返回用户明确要求的操作的总字节数,或者是您的应用程序正常运行所必需的。
volumeAvailableCapacityForOpportunisticUsageKey 返回可用于存储非必需项目的总字节数,例如预先下载的用于用户可能使用或可能不会被使用的性能的内容。
- 支持增强现实。
添加了ARKit.framework,结合了设备运动跟踪,摄像头场景捕获,高级场景处理和显示便利,简化了建立AR体验的任务。- 高性能图像分析。
添加了用于检测面部,条形码,文本,图像水平和矩形区域的Vision框架。
与Core ML集成以在图像上运行自定义模型。
跟踪视频中的对象。
包括对图像注册的支持。- 为Core Image编写自定义图像混合内核。
新增CIBlendKernel,一种特殊类型的CIColorKernel混和两个图像(通过支持CIRenderDestination和CIImageAccumulator)。
添加init(functionName:fromMetalLibraryData:)到CIKernel使用Metal编写内核以从现代语言功能和减少的编译时间中受益。- 轻量级渲染目标。
添加了CIRenderDestination一个对象,用于创建在工作发出后返回给调用者的渲染器。功能包括为不同目的地指定渲染器的所有目标属性IOSurface,包括CVPixelBuffer,GL纹理,金属纹理和内存。- 扩展ReplayKit.framework。
更新RPScreenRecorder了屏幕捕获和后置摄像头支持。- 增加了新的核心图像过滤器CITextImageGenerator,CIColorCurves,CILabDeltaE,CIBokehBlur,CIMinMaxRed,和CIBicubicScaleTransform。
- 支持机器学习模式。
添加了CoreML.framework,轻松将机器学习模型集成到应用程序中。- SiriKit支持视觉代码。
向Sirkit 添加了视觉代码域,以支持显示交换付款和联系信息的视觉代码。- SiriKit支持笔记和待办事项列表。
向SiriKit 添加了列表和Notes域,以支持使用Siri添加备注,与待办事项列表进行交互,以及与提醒进行交互。- 在SiriKit域中增加了意图。
将骑行取消和反馈添加到骑行预订域。
增加了汇款和搜索帐户到付款域。- 查找设备的标题。
添加heading到CMDeviceMotion,返回相对于的方位角度的属性CMAttitudeReferenceFrame。返回的值是以度为单位的标题double。当参考帧为xArbitraryZVertical或时,返回负值xArbitraryCorrectedZVertical。- 多路径TCP。
增加了对使用多个接口(如Wi-Fi和Cellular)的URLSessionConfiguration支持,通过扩展支持IETF RFC 6824中定义的多路径TCP传输单个数据流。有关更多信息,请参阅URLSessionConfiguration.MultipathServiceType。- DNS代理。
向网络扩展框架添加了新的DNS代理应用程序扩展类型。- Apple Pay中增强的最终用户交易流程。
添加PKPaymentError到PassKit,用于详细报告用户运输和付款信息中的错误以及授权错误的结构。开发人员可以使用该信息来提供自定义的错误字符串。
更新处理程序方法PKPaymentAuthorizationControllerDelegate以接收PKPaymentError。
更新PKPaymentRequest使用PKContactField的联系信息。
添加supportedCountries到PKPaymentRequest用于指定支持的交易的国家/地区。
即使电子钱包中没有支持付款方式,您也可以提供付款按钮。Apple Pay现在提供付款而不离开您的应用程序,然后返回结帐。- 在App Store上推广应用内购买。
开发人员可以在App Store产品页面上宣传多达20个应用内购买。客户可以在App Store上开始购买,然后被带到应用程序来完成交易。
增加paymentQueue(_:shouldAddStore:for:)了一种SKPaymentTransactionObserver促进应用内购买的新方法。应用程序需要支持此代理,以便在App Store上显示促销的应用内购买。- 实时消息。
添加MSMessageLiveLayout了一个新的消息布局,用于显示可以显示动态内容的实时消息,如游戏。每个实时消息都有自己的MSMessagesAppViewController,并且可以在屏幕上同时存在多个活动的实时消息。以下代码显示将消息流添加到消息流中,包括不支持实时消息的设备的备用布局。
guard let conversation = activeConversation else {
fatalError("No active conversation")
}
let alternateLayout = MSMessageTemplateLayout()
alternateLayout.image = UIImage(named: "SuperSweetGameImage")
alternateLayout.caption = "$(\(conversation.localParticipantIdentifier)) wants to play a game!"
let layout = MSMessageLiveLayout(alternateLayout: alternateLayout)
let message = MSMessage()
message.layout = layout
conversation.insert(message, completionHandler: nil)
- HomeKit的增强触发器。
增强触发器的基于时间的条件。HMSignificantTimeEvent指定日出和日落的偏移量。HMCalendarEvent指定日期和时间。HMDurationEvent指定时间间隔。
添加HMCharacteristicThresholdRangeEvent以支持跟踪一个范围内的配件的状态,例如当温度在68和72度之间时运行自动化。
添加HMPresenceEvent用于添加基于用户的存在或不存在的条件。
更新HMEventTrigger以启用多次重复的事件。- 通过实施来接收家庭中心状态的更新home:didUpdateHomeHubState:。
- 更新了MapKit,以更清楚地显示开发人员数据。
添加mutedStandard了一种强调开发人员数据的新地图显示模式。
添加属性以自定义注释在碰撞发生时的行为。开发人员使用的组合displayPriority,collisionMode以及clusteringIdentifier对影响哪个注解持续显示在地图上。
- 支持高效率视频编码(HEVC)。
高效率视频编码(HEVC)是视频编码的新标准,在相同的视觉质量水平下,提供比H.264更好的压缩效果。
使用AV基金会播放包含HEVC编码曲目的电影,并捕获和导出视频。
VideoToolbox 客户端可以对HEVC视频比特流进行编码和解码。- 支持高效图像格式(HEIF)。
高效图像格式(HEIF)是一种新的图像压缩标准,可将相同级别图像质量的当前数据压缩比加倍。
添加了照片和核心图像框架的功能,以显示,编码和导出HEIF图像。- 支持捕获和操作深度数据,以及增强的照片捕获。
向AVFoundation添加了对象,用于捕获和表示深度数据。欲了解更多信息,请参见AVCaptureDepthDataOutput,AVDepthData以及相关的API。
添加了AVCapturePhoto一个封装捕获的照片的信息并支持HEVC和HEIC编码图像的对象。
更新AVCapturePhotoOutput以提供更多信息。- 自动存储管理。
增加了HTTP实时流资源的自动存储管理AVAssetDownloadTask。当需要空间时,系统可以自动清除过期或不必要的下载。使用优先级来影响清除策略。- AirPlay 2。
AV基础中某些音频播放界面改善了AirPlay的可靠性。要利用增加的可靠性,播放音频AVPlayer或新的AVSampleBufferAudioRenderer对象。
为AirPlay添加了多个扬声器支持,以支持长形音频,如音乐和播客。要将应用程序标记为呈现长格式音频,请调用该AVAudioSession方法setCategory(_:mode:routeSharingPolicy:options:)并将AVAudioSessionRouteSharingPolicyLongForm其用作参数值。- FairPlay流密钥管理。
改进了功能AVContentKeySession。使用AVContentKeySession启动独立播放或媒体资产的下载的内容密钥请求。符合AVContentKeyRecipient协议的对象(例如AVURLAsset)可被添加为接收者AVContentKeySession以获得对现有内容密钥的访问并发起新的内容密钥请求- 增加了更多的实时照片调整。
添加了一个称为效果的实时照片调整的集合,将实时照片呈现为循环,反弹或长时间曝光。与常规实时照片不同,Loop和Bounce视频将以连续的循环播放。
添加了playbackStyle一个新的属性,标识如何向PHAsset用户呈现。
- 热点配置。
添加了热点配置的网络扩展。有关更多信息,请参阅NEHotspotConfiguration。- 更新了核心蓝牙框架。
增加了对L2CAP频道的支持。
扩展会话恢复可以在蓝牙复位和设备重新启动时工作。
更新了核心蓝牙框架,以适应iOS,tvOS,watchOS和macOS,以及基于平台的标记呼叫可用性。- 检测NFC标签并读取包含NDEF数据的消息。
增加了核心NFC,一种用于阅读NFC数据交换格式(NDEF)的近场通信(NFC)标签和数据的新框架。- APFS现在是默认文件系统。
APFS现在对区分大小写的文件系统有不规范化的支持。