Junkor

What's New in iOS9

iOS9
iPad的多任务增强
搜索

游戏

AppThinning
支持Right-to-Left语言
App传输安全(ATS)
插件拓展(Extension Points)
Contacts和Contacts UI
Watch Connectivity
Swift增强

其他的Framework变更

弃用APIs

###iOS9.0 这篇文章主要介绍了iOS9里跟开发相关一些主要功能,同时也列出了一些新功能的细节。 与iOS相关的最新的问题和发布信息可以参阅iOS9 Release Notes,iOS9中新增的全量API变更信息可以参阅iOS 9.0 API Diffs。与新设备相关的信息可以参阅iOS Device Compatibility Reference

####iPad的多任务增强 iOS9通过Slide Over、Split View 和 Picture in Picture提升了用户的多任务操作体验。Slide Over功能允许用户打开第二个应用并快速与其交互。Split View功能可以使用户在iPad Air2中分屏使用两个app。Picture in Picture(PiP)功能使你可以打开一个视频的悬浮窗口,漂浮于其他应用之上。 你无法预知用户何时会在同一个屏幕上操作两个App,所以,为了保障用户有一个不错的多任务体验,你得做到以下两点:

  • 在与其他应用共享系统资源的情况下,高效的利用系统资源是很有必要的。当产生内存的压力时,系统预先退出消耗最大内存的app。
  • 确保你的应用已经兼容了size classes,当用户想用一部分屏幕展示你的app时,只有这样才能保证app的正常显示。 想了解更多关于良好的支持Split View和Slide Over的信息,可参阅Adopting Multitasking Enhancements on iPad

除了Split View 和 Slide Over,用户可能还想使用PiP在操作其他app的同时观看视频。如果视频播放不是你app的主要功能,你不需要为支持PiP额外做任何工作。

如果要支持PiP,请使用AVKit 或者 AV Foundation API。Media Player framework里的视频播放API将在iOS9中被起弃用,且不支持PiP。了解更多有关PiP的准备工作,请移步Picture in Picture Quick Start

####搜索 iOS9中的搜索功能为用户提供了多种访问应用内信息的途径。当你兼容了iOS9的搜索功能以后,用户就可以通过Handoff、Siri Reminders 和 搜索结果访问到应用深处的内容。 兼容搜索功能以后,在提升了用户体验的同时,也降低了使用你的app的门槛,同时也可以在用户使用系统搜索或者网络搜索时轻松的展现你的应用内容。让我们举个例子来说明一下它是怎么工作的:假设你的app是帮助用户处理轻微病症,如晒伤或扭伤脚踝。你兼容过iOS9的搜索功能以后,当用户搜索“扭伤脚踝”,即便他们没有安装你的app也能看到有关你app的结果。当用户点击这条结果时,你的app就有机会被他们下载了。类似的,你可以关联关键字到你的web页面,这样用户可以在safari中搜索到相关结果。当用户点击时,Safari会引导用户到你的网站,用户可以通过你app的banner去下载应用。 兼容Search其实很简单:你不需要有任何关于搜索具体实现的经验,并且大多数开发者发现他们只用了几个教师就使得他们的内容可搜索了。iOS9提供了以下api供你使用:

这三种搜索相关的api是协同工作的。如果你app的内容是与web端相对应的,你可以三种同时兼容;否则的话你可以只兼容NSUserActivity和CoreSpot light。

对这些api适当的兼容可以提升搜索结果与你的app的关联性和排名。为了给用户提供最好的搜索体验,系统将会权衡用户与检索到的app内内容和从Safari检索到的web内容的交互频度。iOS会根据用户与你的app交互的频率、用户看到检索结果并跳入到app内部的时间差、以及你网站的威望来综合计算关联性和排行。

####重点: 一定要避免app内容的过度索引或者添加不必要的关键字和参数来提升你在搜索结果中的排行。因为iOS会权衡用户参与搜索结果的级别,那些无用的信息最终将不被展示到搜索结果中。

有两点你可以用来判断用户检索与你app内容相关信息时体验是否完善:

  1. 确保你的结果是丰富有用且描述性强的。当用户看到与他们的检索直接相关的信息时,他们会更乐意与你的app交互。
  2. 当用户点击一条结果时,直接跳转到你应用里的相应区域。尽可能的不要有中间环节打断用户的操作,那样会阻止用户获取他们真正想要的内容。

###使用NSUserActivity使应用内容可搜索 目前为止,你或许在使用NSUserActivity api来支持Handoff(更多关于handoff的功能可以参阅Handoff Programming Guide)。在iOS9中,NSUserActivity添加了一些新的api允许你指定一些程序特定的活动或者状态是可搜索的,当这些内容被出现在用户的搜索结果或者Safari结果中时,用户可以点击相应的结果跳转到你的app中来。

NSUserActivity也提供了一些属性以便你在搜索结果中展示丰富的内容,例如你可以指定搜索结果的标题、描述或者缩略图。

通过创建一个NSUserActivity对象来描述应用活动和状态的可搜索性。使用NSUserActivity的属性可以完整的描述这些信息并使其具备被搜索的资格。Listing1中的代码展示了如何配置一个activity:

Listing 1 Creating a new activity

NSUserActivity *userActivity = [[NSUserActivity alloc]
    initWithActivityType:@“com.mycompany.activity-type”];
	// Set properties that describe the activity and that can be used in search.
	userActivity.title = @"...";
	userActivity.keywords = [NSSet setWithArray:@[...]];
// Set values needed to restore state
	userActivity.userInfo = @{ ... };
	// Enable the activity to participate in search results.
	[userActivity.eligibleForSearch = YES];

当一个用户执行这个activity或者携带着与你创建的NSUserActivity对象一致的状态进入应用,你的app需要调用[userActivity becomeCurrent] 来确保这个activity就是当前的activity。当前的activity才有资格自动出现到索引结果中(也就是CSSearchableIndex)。

当用户点击一条与一个状态或者活动有关的结果时,你的app通过NSUserActivity的api来继续用户的操作并记录用户的信息。Listing 2展示了怎样继续用户的行为:

Listing 2 Continuing an activity

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler: {
	    NSString *activityType = userActivity.activityType;
    	if ([activityType isEqual:@“com.mycompany.activity-type”]) {
        	// Handle restoration for values provided in userInfo
			return YES; 
	}
		return NO;
}

同样的,它适用于所有用户。例如,Health应用索引它的分组信息使得他们对于所有用户都是可用的。当用户搜索“steps”时,搜索结果中会显示用户当前的记步信息,点击该条目时,会自动跳转到Health应用的Steps内容区域。因为“step”被标记为一个公共搜索条目,即便是用户的设备没有跟踪其记步信息,当用户搜索“step”时,Health应用也会收到一个跟记步相关的link。

被标记为public的activity可被展示给那些未安装你app的用户并引导他们来使用你的app。默认情况下activity都是私有的,只有当一个activity对其他用户也是有意义的时候你才能把它标记未public。一般情况下,用户自己创建的内容都不会对别人有太大用途。标记activity为public的话,直接设置eligibleForPublicIndexing属性为YES即可。

###使用Core Spotlight使应用内容可搜索 CoreSpotlight提供了类似数据库操作的api,允许你对描述可搜索内容的条目进行增删改查。当你使用CoreSpotlight来检索这些条目的时候,用户可以轻松的搜索到他们想要的内容。 为了使应用内内容可搜索,首先你要做的是创建一些参数用来存放你想在结果列表中展示的元数据。Listing 3中展示了如何创建一个CSSearchableItemAttributeSet对象并且配置它的属性。

Listing 3 Creating an attribute set for a searchable item

// Create an attribute set for an item that represents an image.
	CSSearchableItemAttributeSet* attributeSet = 	[[CSSearchableItemAttributeSet alloc] 	initWithItemContentType:(NSString*)kUTTypeImage];
	// Set properties that describe attributes of the item such as title, description, and image.
	[attributeSet setTitle:@"..."];
	[attributeSet setContentDescription:@"..."];

然后创建CSSearchableItem对象来描述这个item并把它加到Index中。Listing 4展示了如何创建一个CSSearchableItem对象并加到index中:

Listing 4 Creating a searchable item

// Create a searchable item, specifying its ID, associated domain, and attribute set.
	CSSearchableItem* item;
	item = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"..."
	domainIdentifier:@"..." attributeSet:attributeSet];
	// Index the item.
	[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler: ^(NSError * __nullable error) {
		NSLog(@"Search item indexed";
	}];

当用户点击一条你添加到index中的搜索结果时,你的app需要被打开,并且恢复到相应条目的上下文。为了实现这样的功能,你需要在你的app delegate中实现application:continueUserActivity:restorationHandler:,可以通过判断activity的类型来检测app是否打开。Listing 5展示了该函数的一个实现:

Listing 5 Implementing continueUserActivity… in the app delegate

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray *restorableObjects))restorationHandler
{
    	
	if ([[userActivity activityType] isEqualToString:CSSearchableItemActionType])
	{
			// This activity represents an item indexed using Core Spotlight, so restore the context related to the unique identifier.
    		// The unique identifier of the Core Spotlight item is set in the activity’suserInfo for the key CSSearchableItemActivityIdentifier
        	NSString *uniqueIdentifier = [activity.userInfo objectForKey:CSSearchableItemActivityIdentifier];
		} 
}

如果你的app允许用户创建并存储数据,建议你同时兼容NSUserActivity和CoreSpotlight。对两者同时兼容的话可以使activity和检索条目展示同样的内容,这样可以提升用户体验。Listing 6中展示了如何通过一个unique ID来把activity和item关联起来:

Listing 6 Relating a user activity and a searchable item

// Create an attribute set that specifies a related unique ID for a Core Spotlight item.
  	CSSearchableItemAttributeSet *attributes = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:@"public.image"];
	attributes.relatedUniqueIdentifier = coreSpotlightUniqueIdentifier;

  	// Use the attribute set to create an NSUserActivity that's related to a Core Spotlight item.
  	NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:@“com.mycompany.viewing-message”];
userActivity.contentAttributeSet = attributes;

iOS9中还包含了一个Core Spotlight的拓展,它允许系统在你的app没有运行的时候与你的app进行通信,为你的app提供更新index或者校验item可用性的时机。

###使用Web Markup使应用内容可搜索 如果你app的内容有对应的web版本,你可以通过web markup使得用户可以在搜索结果中直接访问你的app内容。因为Apple索引了web内容并且使其在Search和safari中都是可用的,添加markup的支持并帮助Apple发现和索引你的内容对于展示丰富的搜索结果是很重要的。

采用Smart App Banners是帮助你的web用户发现你的app的最好方式。在你的Smart App Banner标记中添加app-argument来允许Apple索引到你网站的内容。

除了使用Smart App Banners以外,你还可以选择苹果支持的其他开放标准。

用开放标准声明(如Schema.org)的结构来标记你的网站内容,使得用户可以搜索到丰富的结果。例如,一个食谱网址或许会使用Listing 7中关于食谱的标记信息:

Listing 7 Using markup to provide more information

<div itemscope itemtype="http://schema.org/Recipe">
  		<span itemprop="name”>Apple Pie</span>
  		<span itemprop="description">This yummy recipe uses healthy Gala apples!</span>
  		Prep Time: <meta itemprop="prepTime" content="PT30M”>30 minutes
  		Cook Time: <meta itemprop="cookTime" content="PT2H”>2 hours
  		Yields: <span itemprop="recipeYield”>8 servings</span>
  		Ingredients:
  			- <span itemprop="recipeIngredient”>6-8 Gala apples, diced</span>
  			- <span itemprop="recipeIngredient”>1/4 cup of flour egg</span>
  			- <span itemprop="recipeIngredient”>1 pie dough</span>
	</div>

除了使用Schema.org的标准,你还可以支持Open Graph标记来提供一张具体的图片,或者使用标题和描述的方式来组织内容。

###使用Universal Links使得你的应用可以处理你的网站链接 在iOS9里,你的app可以直接注册并打开一个web链接(http或者https),而不是通过Safari打开。这种web和app之间的关联方式可以帮助Apple在搜索列表中呈现你的app的内容。

支持universal links是建立于在浏览器和app之间使用Handoff的类似机制之上的,并且可以共享web证书(关于技术的细节可移步至 Web Browser–to–Native App HandoffShared Web Credentials Reference)。一个信任的链接关系是通过在一个存在app中添加一个叫做com.apple.developer.associated-domains的entitlement和在网站端添加一个叫做apple-app-site-association的文件来建立的。

在你的entitlement中,需要包含你想要app处理的universal links列表,例如:

applinks:developer.apple.com

在你的apple-app-site-association文件中,你可以指定哪些路径需要当做universal links来处理。例如:

{
    "applinks": {
        "apps": [],
        "details": {
            "9JA89QQLNQ.com.apple.wwdc": {
                "paths": [
                    "/wwdc/news/",
                    "/videos/wwdc/2015/*"
                ]
            }
        }
    }
}

当你把上边说的两个文件分别部署到你的app和网站端以后,当用户点击了某个web端的链接,你的app就会被唤醒并处理这个链接。你的app需要实现UIApplicationDelegate中为支持Handoff提供的函数(尤其是application:continueUserActivity:restorationHandler:),才能确保接收到链接并得到处理。

强烈建议使用universal links方式取代URL scheme方式。主要有以下好处:

  • 安全 - universal links 不会像URL schemes那样被另外一个app劫持。
  • 当用户未安装你的app时,会回调到Safari中去。
  • 一个链接,app和web同样适用,不管你的用户在哪一端。

###游戏 iOS9中包含了多项有关游戏绘制和音频播放的技术提升。你可以使用高层api轻松开发,也可以使用底层api来充分发挥GPU的力量。

####GameplayKit GameplayKit.framework提供了游戏开发的基础支持。使用GameplayKit来开发游戏机制,并结合高级图形引擎(例如SceneKit或SpriteKit)可以创建一个完整的游戏上。这个framework为创建游戏提供了很多模型化的架构,包括:

  • 在不影响调试的情况下给游戏引入不可预知性的Randomization tools
  • Entity-component式的架构设计,提升gameplay代码的复用性
  • 降低gameplay系统状态机维护的复杂性

GameplayKit也包含了对通用gameplay算法的标准实现,所以你不必花费太多精力去阅读白皮书,而是把更多的时间用在创建独一无二的游戏上。GameplayKit主要实现了下列几种标准算法:

  • 敌对的回合制游戏minmax人工智能。
  • 用来描述行为的高级自动追踪目标的模拟代理。
  • 构建数据驱动的游戏规则系统:logic、fuzzy reasoning和emergent behavior。

了解更多GameplayKit地信息,可以查阅GameplayKit Programming GuideGameplayKit Framework Reference。具体的,可以从看一些demo工程开始:FourInARow(使用GameplayKit Minmax Strategist实现的Opponent AI)、AgentsCatalog(使用了GameplayKit的Agents System)还有DemoBots(使用SpriteKit和GameplayKit创建跨平台的游戏)。

####Model IO ModelIO.framework提供对3D资源和相关素材的系统级别的理解。使用这个框架你可以:

  • 引入mesh数据、资源描述、光线和camera的配置,或者从其他当下主流的绘制软件或者游戏引擎支持的格式文件中引入场景信息。
  • 访问或生成下列数据——如:bake光照信息到mesh中,或者创建程序式的sky textures。
  • 与MetalKit、GLKit和SceneKit配合,完成向GPU缓存高效的加载资源数据进行渲染。
  • 导出正在访问的或者生成的资源数据到多个或者多种格式的文件中。

了解更多关于Model IO的细节,看看Model I/O Framework Reference

####MetalKit MetalKit.framework提供了很多使用的类和函数来降低创建一个Metal应用的成本。MetalKit对开发主要提供了3方面的支持:

  • Texture loading帮助你的应用轻松且移步的从不同格式的资源中加载纹理。常见的格式有PNG、JPEG,还支持纹理的特有格式如KTX和PVR。
  • Model handling提供了Metal特用的功能,使得Metal和Model IO之间的接口更简单。使用这些类和函数在Model IO的meshes和Metal的buffers之间高效的传输数据。
  • View management对Metal view的标准实现,这样彻底降低了创建一个图形渲染app的代码成本。

了解更多MetalKit APIs,这里MetalKit Framework Reference.Metal相关的,Metal Programming GuideMetal Framework Reference还有Metal Shading Language Guide

####MetalPerformanceShaders MetalPerformanceShaders.framework提供了高度优化的计算和图形着色器,可以轻松高效地集成到你的Metal应用中。这些data-parallel着色器将充分发挥那些支持Metal的iOS设备CPU的硬件特性。

使用MetalPerformanceShader类可以在支持的硬件上,在不改变你原有着色器代码的情况下提升性能。MetalPerformanceShader对象。MetalPerformanceShader objects可以无缝地融入你的Metal应用中配合Metal resource objects如buffers、或者textures使用。

MetalPerformanceShaders.framework支持的常用着色器有:

  • Gaussian blur - 由MPSImageGaussianBlur类实现
  • Image histogram - 由MPSImageHistogram类实现
  • Sobel edge detection - 由MPSImageSobel类实现

####New Features in Metal Metal.framework添加了一些使你的应用图像渲染性能更多、效果更好地新特性。例如:

  • Metal Shading Language和Metal标准库的改进
  • 着色计算现在支持更大范围的像素格式
  • OSX中添加私有的深度模板文理对齐(The addition of private and depth stencil textures to align with OS X)
  • 为了改善阴影效果新增的depth clamping和前后分离的模板引用值(stencil reference values)

####New Features in SceneKit SceneKit.framework在iOS9中包含的新特性有:

  • 支持Metal渲染。SCNViewSCNSceneRenderer类可以在支持Metal的设备上执行高性能的Metal渲染。创建游戏或者交互式的3D应用时,使用场景编辑器可以减少一些编码成本和时间成本(这里有个相关的事例工程,这里下载Building a SceneKit Game with the Xcode Scene Editor)。
  • 音频定位(Positional audio)。SCNAudioPlayerSCNNode类中添加了音频占位效果,可以自动追踪场景中的人物坐标。(这个翻译的有点儿屎)

了解这方面的更多详情或者其他特性,移步SceneKit Framework Reference

####New Features in SpriteKit SpriteKit.framework在iOS9中包含的新特性有:

  • 支持Metal渲染。在支持Metal的设备上,metal渲染是自动启用的,除非你用的是自定义的OpenGL ES着色器。
  • Xcode集成了新的场景编辑器和Action Editor。创建游戏或者交互式的2D应用时,使用场景编辑器可以减少一些编码成本和时间成本(这里有个相关的事例工程,这里下载Building a Cross Platform Game with SpriteKit and GameplayKit)。
  • Camera nodes(SKCameraNode类实例)使得scrolling类型的游戏实现更简单。只用拖拽一个camera node到你的场景中,然后配置到场景的camera属性中就ok了。
  • Positional audio。想要了解更多关于在场景中追踪玩家坐标自动配置音效的内容,看看SKAudioNode Class Reference

了解这方面的更多详情或者其他特性,移步SpriteKit Framework Reference

### AppThinning App thinning包含以下几点:

  • Slicing。根据设备只下载当前设备需要的资源。(比如iphone6,只下载@3x的图片资源)
  • On-Demand Resources。允许app在需要时再异步下载对应的资源文件(比如游戏,玩到第3关再下载第3关的地图等资源),更多细节到On-Demand Resources Guide
  • Bitcode。归档你的app并提交编译的中间文件到App Store,apple会将中间文件编译成指定的64位或者32位的可执行文件供相应的设备下载。

更多关于app thinning的信息,移步App Thinning (iOS, watchOS)

####支持Right-to-Left Languages iOS9中对Right-to-Left Languages做了广泛支持,使得实现翻转类的交互更加简单。例如:

  • 标准的UIKit控件在right-to-left的context中可以自动翻转。
  • UIView定义了content attributes的语法使得你可以指定特定的View出现在right-to-left的context中。
  • UIImage提供了imageFlippedForRightToLeftLayoutDirection方法,使得用程序的方式翻转图片变得更加简单。

了解更多flip方式的交互,移步Supporting Right-to-Left Languages

####App Transport Security ATS允许一个app在Info.plist中声明一个指定的域名,来标示与其进行安全通讯。ATS为了防止信息泄露,提供了简单易用的默认的安全处理。你需要尽快采用ATS,不管你是创建新的app或者是已经现存的一个app。

如果你是新开发一个app,你需要使用HTTPS。如果是现存的app,你最好立刻切换成https的方式,并尽快制定一个迁移方案。

####Extension Points iOS9中引入了一些新的Extension Points(一个Extension Point的意思就是为指定的功能点定义一些策略或者提供一些api,以便你开发相应的插件)

  • 网络的extension points:

    • 使用Packet Tunnel Provider来实现自定义的VPN数据封装协议
    • 使用App Proxy Provider实现一个客户端的自定义的透明的网络代理协议
    • 使用Filter Data Provider和Filter Control Provider实现一个动态的、设备端的网络过滤器。

    每一个网络的extension points都需要Apple特定的许可。

  • Safari extension points:

    • 使用Shared Links可以在Safari的分享列表中展现你的内容
    • 使用Content Blocking,通过给Safari提供一个描述屏蔽内容的列表就可以在用户浏览web内容时屏蔽指定的内容。
  • Spotlight extension points:

    • 使用app indexing extension point 来索引你应用内的数据
    • 使用Index Maintenance extension point使得在不加载应用的情况下re-indexing
  • Audio Unit extension point 允许你的应用拥有像GarageBand、Logic等的乐器、音效、声音合成功能。这个extension point不仅给iOS带来了插件式的音频处理体验并且允许你在App Store中售卖。

想了解更多关于App extension的信息,移步App Extension Programming Guide.

####Contacts and Contacts UI iOS9引入了Contacts和Contacts UI框架(Contacts.framework和 ContactsUI.framework),提供了Address Book和Address Book UI的oop替代方案。了解更多可以到Contacts Framework Reference或者ContactsUI Framework Reference

####Watch Connectivity Watch Connectivity框架(WatchConnectivity.framework)提供了两种iPhone与已配对Apple Watch的通讯方式。使用这个框架来协调你的iOS app与Watch app直接的互动。框架为两个应用提供了针对运行时(不是runtime而是两个app both running的时候)的及时消息(immediate messaging)和非运行时的后台消息(background messaging)。了解更多,请移步Watch Connectivity Framework Reference

####Swift Enhancements 想了解关于Swift的更新?看看这个Swift Language

###Additional Framework Changes 除了上述的一些主要变更外,iOS9还做了很多其他方面的改进。

####AV Foundation Framework AVFoundation.framework包含了一个新的class —— AVSpeechSynthesisVoice,允许你通过一个identifier指定voice,也可以使用name或者quality属性获取voice的信息。

####AVKit Framework AVKit.framework引入了AVPictureInPictureControllerAVPlayerViewController来帮助支持画中画(pip).更多关于 Picture in Picture的信息,看这里Multitasking Enhancements for iPad

####CloudKit 如果你在应用中使用了CloudKit,你可以使用CloudKit web services或者CloudKit JS(一个js库)提供的web接口来为用户提供访问数据。你需要创建相应的schema以实现现有数据库操作增、删、改、查、订阅等web接口的功能。更多内容请查阅CloudKit JS Reference,CloudKit Web Services Reference还有CloudKit Catalog: An Introduction to CloudKit

####Foundation Framework Foundation.framework包含了以下增强:

  • NSBundle资源的按需加载(on-demand loading)APIs
  • Strings文件支持context-dependent variable width strings
  • NSProcessInfo提供了对电量和热量的管理APIs

####HealthKit Framework HealthKit.framework主要有以下改进:

####Local Authentication Framework LocalAuthentication.framework包含以下改进:

  • 新增的当前登记指纹信息的描述,使得当一个指纹登记或者移除的时候,应用可以修改相应的行为。
  • 支持代码方式取消用户提示(prompt)。
  • 支持对keychain访问的control lists的评估和在keychain调用中使用authentication context(Support for evaluating keychain access control lists and the use of an authentication context in keychain calls)。
  • 支持Touch ID匹配重用。通过evaluateAccessControl: 和 evaluatePolicy:localizedReason:reply:,可以复原当前手机的前一次指纹校验。

####MapKit Framework MapKit.framework引入了一些新的特性来提升用户体验。特别是:

  • MapKit支持交通路线搜索和路线导航(and launching Maps into transit directions)
  • Map views支持3D立交桥模式
  • 注释支持完全自定义
  • MapKit和CLGeocoder的搜索结果支持时区

####PassKit Framework PassKit.framework主要增加了一些Apple Pay的支持,例如:

####Safari Services Framework SafariServices.framework包含了以下改进: SFSafariViewController 可以用来在你的应用内展示web内容,并且可以共享Safari的cookie和其他网站信息,同时也支持很多Safari的其他主要功能:自动填充、Reader等。SFSafariViewController并不像Safari那样,它只展示一页,和一个“完成”按钮,以 便用户可以回到原来应用的场景中。 如果你应用中展示的web内容没有太多自定义的需求,可以考虑把原来的WKWebView或者基于UIWebView的内置浏览器替换为SFSafariViewController。

####UIKit Framework UIKit.framework包含了很多新的提升,例如:

  • UIStackView可以帮助你管理一些横向或者纵向的子view。
  • 为了使布局更简单,为UIView(例如leadingAnchorwidthAnchor)、NSLayoutAnchorNSLayoutDimension提供了新的anchors。
  • 新的布局引导在你采用readable content时,提供合适的边距和定义一个view中内容的绘制区域,详情请见UILayoutGuide
  • UIApplicationDelegate中提供了一个新的函数用来打开(或者编辑)一个文档而不是处理一个文档的副本。应用想要支持open-in-place功能,还需要在Info.plist中配置LSSupportsOpeningDocumentsInPlace的值为yes或者true。
  • UITextInputAssistantItem类用来来布局shortcuts bar中的bar buttons。
  • touch events有部分改进,比如你可以获取到最后一次刷新显示和触摸预测之间的toch值。
  • UIKit dynamics的升级有,支持不规则边界的碰撞检测、新的UIFieldBehavior类支持自定义多种field types,而UIAttachmentBehavior则支持附加的attachment types。
  • UIUserNotificationAction增加的behavior属性,允许你在用户输入时得到通知。
  • 新的NSDataAsset类使得从内存或者绘图中获取资源更加轻松
  • 所有标准UIKit组件都适的当支持从右到左的语言。此外,导航,手势,collection views和 table cell布局也有相应的支持。

###Deprecated APIs 下列APIs是被弃用的:

  • AddressBook和AddressBookUI,可以使用Contacts和Contacts UI替代。 想获取完整的弃用API列表,可以在这里找到iOS 9.0 API Diffs