WWDC2016,Apple發(fā)布了ios10撇簿,每次版本發(fā)布擒抛,都會(huì)帶來(lái)新的接口推汽,新的機(jī)會(huì),也能間接的看到Apple的未來(lái)發(fā)展方向歧沪。
這里就不討論iphone7歹撒、MacBook Pro、Apple Watch诊胞、Apple TV以及AirPods了暖夭。
下面回顧一下,Apple今年為我們帶來(lái)了什么
一撵孤,一些限制
IPV6
HTTPS
1.IPV6
由于IPv4最大的問(wèn)題在于網(wǎng)絡(luò)地址資源有限迈着,嚴(yán)重制約了互聯(lián)網(wǎng)的應(yīng)用和發(fā)展。IPv6的使用邪码,不僅能解決網(wǎng)絡(luò)地址資源數(shù)量的問(wèn)題裕菠,而且也解決了多種接入設(shè)備連入互聯(lián)網(wǎng)的障礙
6月1號(hào)以后提交新版本需要支持IPV6-Only的網(wǎng)絡(luò)
與IPv4地址空間需要擴(kuò)充迫在眉睫,越來(lái)越多的企業(yè)和移動(dòng)電話運(yùn)營(yíng)商部署IPv6 DNS64和NAT64網(wǎng)絡(luò)。DNS64 / NAT64網(wǎng)絡(luò)是一種能使ipv6網(wǎng)絡(luò)闭专。取決于應(yīng)用程序的性質(zhì),過(guò)渡有不同的含義:如果您正在編寫(xiě)一個(gè)客戶端應(yīng)用程序使用高級(jí)網(wǎng)絡(luò)api,如NSURLSession和CFNetwork框架,你應(yīng)該不需要改變?nèi)魏螙|西為您的應(yīng)用程序使用IPv6地址奴潘。如果項(xiàng)目中用了老的AFNetworking或ASIHTTPRequest等第三方網(wǎng)絡(luò)請(qǐng)求框架則可能需要做一下適配。因?yàn)橛岸ぃO(píng)果審核是不會(huì)讓你過(guò)得画髓。
客戶端向服務(wù)器端請(qǐng)求域名解析,首先通過(guò)DNS64 Server查詢IPv6的地址平委,如果查詢不到奈虾,再向DNS Server查詢IPv4地址,通過(guò)DNS64 Server合成一個(gè)IPV6的地址廉赔,最終將一個(gè)IPV6的地址返回給客戶端
關(guān)于IPV6的詳細(xì)介紹請(qǐng)見(jiàn):
IPV6
2.HTTPS
前面一個(gè)大神已經(jīng)詳細(xì)得介紹了HTTPS的相關(guān)知識(shí)肉微,講得非常詳細(xì),大家想看的話可以回顧一下蜡塌。我在這也就不做過(guò)多贅述了碉纳。
HTTPS
- 2017年1月1日起,蘋(píng)果App Store中的所有App都必須啟用 App Transport Security(ATS)安全功能岗照。(但延期了)
"應(yīng)用傳輸安全協(xié)議是與iOS9和OS X 10.11一同發(fā)布的村象,該協(xié)議需要應(yīng)用程序通過(guò)HTTPS使用安全的網(wǎng)絡(luò)連接笆环,以提高用戶的數(shù)據(jù)和隱私安全攒至。
在2016年WWDC上我們宣布在今年年底之前,提交到App Store的應(yīng)用程序必須支持應(yīng)用傳輸安全協(xié)議躁劣。為了給你們充裕的時(shí)間去準(zhǔn)備迫吐,這個(gè)截止日期已被延長(zhǎng),當(dāng)新的截止日期確定的時(shí)候账忘,我們將及時(shí)提供相關(guān)信息志膀。"
- App Transport Security(應(yīng)用程序安全傳輸)熙宇,簡(jiǎn)稱(chēng) ATS,是蘋(píng)果在 iOS 9 中首次推出的一項(xiàng)隱私安全保護(hù)功能溉浙,啟用ATS后烫止,它會(huì)屏蔽明文HTTP資源加載,強(qiáng)制App通過(guò)HTTPS連接網(wǎng)絡(luò)服務(wù)戳稽,通過(guò)傳輸加密保障用戶數(shù)據(jù)安全馆蠕。
- ATS要求服務(wù)器必須支持傳輸層安全(TLS)協(xié)議1.2以上版本;證書(shū)必須使用SHA256或更高的哈希算法簽名;必須使用2048位以上RSA密鑰或256位以上ECC算法等等,不滿足條件的證書(shū)惊奇,ATS都會(huì)拒絕連接互躬。強(qiáng)制開(kāi)啟ATS體現(xiàn)了蘋(píng)果一貫的隱私保護(hù)態(tài)度。 開(kāi)發(fā)者需要HTTPS證書(shū)颂郎。
二吼渡,ios10
IMessage
SiriKit
Speech Recognition
User Notifications
Others
1.IMessage
IMessage獲得重大更新,提供消息氣泡框效果乓序,手寫(xiě)信息寺酪。同時(shí)內(nèi)置的emoji表情也得到優(yōu)化,除了圖片變大3倍外竭缝,還能將文字直接轉(zhuǎn)化成emoji表情房维。蘋(píng)果還特別為IMessage開(kāi)辟了應(yīng)用專(zhuān)區(qū),所以你也可以做IMessage App了抬纸。
使用Messages framework創(chuàng)建兩種類(lèi)型的app extensions:
Sticker packs
IMessage apps
第一種方式僅僅提供靜態(tài)的貼紙,貼紙包圖片,用戶可以發(fā)送內(nèi)聯(lián)消息附加到消息氣泡中咙俩。貼紙包不需要任何代碼。你添加標(biāo)簽圖像文件拖到貼紙包文件夾內(nèi)的貼紙資源目錄湿故。有效的圖像文件必須符合以下規(guī)格:
- 圖片必須是png阿趁、apng、gif坛猪、jpeg中的一種
- 圖片必須小于500k
- 為了效果好脖阵,圖像不應(yīng)少于100×100pt,或超過(guò)206×206pt
如果你想做這些事的時(shí)候你就要用到第二種方式了
Use iMessage apps to:
- Present a custom user interface inside the Messages app; see MSMessagesAppViewController.
- Create a custom or dynamic sticker browser; see MSStickerBrowserViewController.
- Insert text, stickers, or media files into the Messages app’s input field; see MSConversation.
- Create interactive messages that carry app-specific data; see MSMessage.
- Update interactive messages (for example, to create games or collaborative apps); see MSSession.
//example1作為一個(gè)貼紙瀏覽器
class MessagesViewController: MSMessagesAppViewController, MSStickerBrowserViewDataSource {
var stickers = [MSSticker]()
func loadStickers() {
for i in 1...2 {
if let url = Bundle.main.url(forResource: "Sticker \(i)", withExtension: "png"){
do {
let sticker = try MSSticker(contentsOfFileURL: url, localizedDescription: "")
stickers.append(sticker)
} catch {
print(error)
}
}
}
}
func createStickerBrowser() {
let controller = MSStickerBrowserViewController(stickerSize: .large)
addChildViewController(controller)
view.addSubview(controller.view)
controller.stickerBrowserView.backgroundColor = UIColor.purple
controller.stickerBrowserView.dataSource = self
view.topAnchor.constraint(equalTo: controller.view.topAnchor).isActive = true
view.bottomAnchor.constraint(equalTo: controller.view.bottomAnchor).isActive = true
view.leftAnchor.constraint(equalTo: controller.view.leftAnchor).isActive = true
view.rightAnchor.constraint(equalTo: controller.view.rightAnchor).isActive = true
}
func numberOfStickers(in stickerBrowserView: MSStickerBrowserView) -> Int {
return stickers.count
}
func stickerBrowserView(_ stickerBrowserView: MSStickerBrowserView, stickerAt index: Int) -> MSSticker {
return stickers[index]
}
override func viewDidLoad() {
super.viewDidLoad()
loadStickers()
createStickerBrowser()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
// MARK: - Conversation Handling
override func willBecomeActive(with conversation: MSConversation) {
}
override func didResignActive(with conversation: MSConversation) {
}
override func didReceive(_ message: MSMessage, conversation: MSConversation) {
}
override func didStartSending(_ message: MSMessage, conversation: MSConversation) {
}
override func didCancelSending(_ message: MSMessage, conversation: MSConversation) {
}
override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
}
override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) {
}
}
example2(交互式)
class MessagesViewController: MSMessagesAppViewController {
@IBOutlet weak var stepper: UIStepper!
@IBAction func didPress(button sender: AnyObject) {
if let image = createImageForMessage(), let conversation = activeConversation {
let layout = MSMessageTemplateLayout()
layout.image = image
layout.caption = "云萊塢"
let message = MSMessage()
message.layout = layout
message.url = URL(string: "http://www.yunlaiwu.com/")
conversation.insert(message, completionHandler: { (error) in
print(error ?? "no error")
})
}
}
func createImageForMessage() -> UIImage? {
let background = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
background.backgroundColor = UIColor.white
let label = UILabel(frame: CGRect(x: 75, y: 75, width: 150, height: 150))
label.font = UIFont.systemFont(ofSize: 56.0)
label.backgroundColor = UIColor.red
label.textColor = UIColor.white
label.text = "\(Int(stepper.value))"
label.textAlignment = .center
label.layer.cornerRadius = label.frame.size.width/2.0
label.clipsToBounds = true
let imageView = UIImageView(frame: CGRect(x: 0, y: 200, width: 300, height: 100))
imageView.image = UIImage(named:"Sticker 2")
background.addSubview(label)
background.addSubview(imageView)
background.frame.origin = CGPoint(x: view.frame.size.width, y: view.frame.size.height)
view.addSubview(background)
UIGraphicsBeginImageContextWithOptions(background.frame.size, false, UIScreen.main.scale)
background.drawHierarchy(in: background.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
background.removeFromSuperview()
return image
}
2.SiriKit
Apple 為我們開(kāi)放了兩個(gè)framework讓我們更好的接入Siri
Intents、IntentsUI
Intents框架是必須支持的墅茉,支持基本應(yīng)用程序和系統(tǒng)之間的通信命黔。
IntentsUI框架是可選的,他提供了任務(wù)成功操作后的自定義UI接口就斤。
它所包括的領(lǐng)域:
- VoIP calling
- Messaging
- Payments
- Photo
- Workouts
- Ride booking
- CarPlay (automotive vendors only)
- Restaurant reservations (requires additional support from Apple)
接入siri的注意事項(xiàng):
- 證書(shū)支持
-
plist文件支持你所要的操作事件
import Intents
// As an example, this class is set up to handle Message intents.
// You will want to replace this or add other intents as appropriate.
// The intents you wish to handle must be declared in the extension's Info.plist.
// You can test your example integration by saying things to Siri like:
// "Send a message using <myApp>"
// "<myApp> John saying hello"
// "Search for messages in <myApp>"
class IntentHandler: INExtension, INSendMessageIntentHandling, INSearchForMessagesIntentHandling, INSetMessageAttributeIntentHandling {
override func handler(for intent: INIntent) -> Any {
// This is the default implementation. If you want different objects to handle different intents,
// you can override this and return the handler you want for that particular intent.
return self
}
// MARK: - INSendMessageIntentHandling
// Implement resolution methods to provide additional information about your intent (optional).
func resolveRecipients(forSendMessage intent: INSendMessageIntent, with completion: @escaping ([INPersonResolutionResult]) -> Void) {
if let recipients = intent.recipients {
// If no recipients were provided we'll need to prompt for a value.
if recipients.count == 0 {
completion([INPersonResolutionResult.needsValue()])
return
}
var resolutionResults = [INPersonResolutionResult]()
for recipient in recipients {
let matchingContacts = [recipient] // Implement your contact matching logic here to create an array of matching contacts
switch matchingContacts.count {
case 2 ... Int.max:
// We need Siri's help to ask user to pick one from the matches.
resolutionResults += [INPersonResolutionResult.disambiguation(with: matchingContacts)]
case 1:
// We have exactly one matching contact
resolutionResults += [INPersonResolutionResult.success(with: recipient)]
case 0:
// We have no contacts matching the description provided
resolutionResults += [INPersonResolutionResult.unsupported()]
default:
break
}
}
completion(resolutionResults)
}
}
func resolveContent(forSendMessage intent: INSendMessageIntent, with completion: @escaping (INStringResolutionResult) -> Void) {
if let text = intent.content, !text.isEmpty {
completion(INStringResolutionResult.success(with: text))
} else {
completion(INStringResolutionResult.needsValue())
}
}
// Once resolution is completed, perform validation on the intent and provide confirmation (optional).
func confirm(sendMessage intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) {
// Verify user is authenticated and your app is ready to send a message.
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self))
let response = INSendMessageIntentResponse(code: .ready, userActivity: userActivity)
completion(response)
}
// Handle the completed intent (required).
func handle(sendMessage intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) {
// Implement your application logic to send a message here.
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSendMessageIntent.self))
let response = INSendMessageIntentResponse(code: .success, userActivity: userActivity)
completion(response)
}
// Implement handlers for each intent you wish to handle. As an example for messages, you may wish to also handle searchForMessages and setMessageAttributes.
// MARK: - INSearchForMessagesIntentHandling
func handle(searchForMessages intent: INSearchForMessagesIntent, completion: @escaping (INSearchForMessagesIntentResponse) -> Void) {
// Implement your application logic to find a message that matches the information in the intent.
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSearchForMessagesIntent.self))
let response = INSearchForMessagesIntentResponse(code: .success, userActivity: userActivity)
// Initialize with found message's attributes
response.messages = [INMessage(
identifier: "identifier",
content: "I am so excited about SiriKit!",
dateSent: Date(),
sender: INPerson(personHandle: INPersonHandle(value: "sarah@example.com", type: .emailAddress), nameComponents: nil, displayName: "Sarah", image: nil, contactIdentifier: nil, customIdentifier: nil),
recipients: [INPerson(personHandle: INPersonHandle(value: "+1-415-555-5555", type: .phoneNumber), nameComponents: nil, displayName: "John", image: nil, contactIdentifier: nil, customIdentifier: nil)]
)]
completion(response)
}
// MARK: - INSetMessageAttributeIntentHandling
func handle(setMessageAttribute intent: INSetMessageAttributeIntent, completion: @escaping (INSetMessageAttributeIntentResponse) -> Void) {
// Implement your application logic to set the message attribute here.
let userActivity = NSUserActivity(activityType: NSStringFromClass(INSetMessageAttributeIntent.self))
let response = INSetMessageAttributeIntentResponse(code: .success, userActivity: userActivity)
completion(response)
}
}
3.Speech Recognition
iOS 10引入了一個(gè)新的API,支持連續(xù)語(yǔ)音識(shí)別悍募,可以將識(shí)別語(yǔ)音轉(zhuǎn)錄成文本⊙蠡可以執(zhí)行語(yǔ)音實(shí)時(shí)轉(zhuǎn)錄和記錄音頻坠宴。
SpeechFramework框架中的重要類(lèi)
SFSpeechRecognizer:這個(gè)類(lèi)是語(yǔ)音識(shí)別的操作類(lèi),用于語(yǔ)音識(shí)別用戶權(quán)限的申請(qǐng)绷旗,語(yǔ)言環(huán)境的設(shè)置喜鼓,語(yǔ)音模式的設(shè)置以及向Apple服務(wù)發(fā)送語(yǔ)音識(shí)別的請(qǐng)求副砍。
SFSpeechRecognitionTask:這個(gè)類(lèi)是語(yǔ)音識(shí)別服務(wù)請(qǐng)求任務(wù)類(lèi),每一個(gè)語(yǔ)音識(shí)別請(qǐng)求都可以抽象為一個(gè)SFSpeechRecognitionTask實(shí)例庄岖,其中SFSpeechRecognitionTaskDelegate協(xié)議中約定了許多請(qǐng)求任務(wù)過(guò)程中的監(jiān)聽(tīng)方法豁翎。
SFSpeechRecognitionRequest:語(yǔ)音識(shí)別請(qǐng)求類(lèi),需要通過(guò)其子類(lèi)來(lái)進(jìn)行實(shí)例化隅忿。
SFSpeechURLRecognitionRequest:通過(guò)音頻URL來(lái)創(chuàng)建語(yǔ)音識(shí)別請(qǐng)求谨垃。
SFSpeechAudioBufferRecognitionRequest:通過(guò)音頻流來(lái)創(chuàng)建語(yǔ)音識(shí)別請(qǐng)求。
SFSpeechRecognitionResult:語(yǔ)音識(shí)別請(qǐng)求結(jié)果類(lèi)硼控。
SFTranscription:語(yǔ)音轉(zhuǎn)換后的信息類(lèi)刘陶。
當(dāng)然,首先為了安全你得到plist文件中加權(quán)限
SFSpeechRecognizer.requestAuthorization { authStatus in
if authStatus == SFSpeechRecognizerAuthorizationStatus.authorized {
if let path = Bundle.main.url(forResource: "PPAP", withExtension: ".mp3") {
let recognizer = SFSpeechRecognizer()
let request = SFSpeechURLRecognitionRequest(url: path)
recognizer?.recognitionTask(with: request, resultHandler: { (result, error) in
if let error = error {
print("There was an error: \(error)")
} else {
print(result?.bestTranscription.formattedString)
}
})
}
}
}
4.User Notifications
支持了很多用戶定義的通知牢撼,并且可以捕捉到各個(gè)通知狀態(tài)的回調(diào)匙隔。以往的通知是大家想接收的都提前做好準(zhǔn)備,然后一下全量分發(fā)熏版,沒(méi)收到也不管了纷责,也不關(guān)心發(fā)送者。現(xiàn)在用戶通知做成了和網(wǎng)絡(luò)請(qǐng)求有點(diǎn)像撼短,一個(gè)request,response的流程再膳,也支持了error處理,可以在各個(gè)狀態(tài)的方法中做一些額外操作曲横,并且也能取到一些字段喂柒,如發(fā)送者等。
更為重要的是禾嫉,新增了UserNotificationsUI.framework框架灾杰,在收到通知的時(shí)候,可自定義通知UI樣式
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert,.badge,.sound]) { (granted, error) in
if granted {
print("授權(quán)成功")
}else{
print("授權(quán)失敗")
}
}
let content = UNMutableNotificationContent()
content.title = "云萊塢 PPAP"
content.body = "I have a pen I have an apple"
content.subtitle = "have a pineapple"
content.sound = UNNotificationSound.default()
let trigger1 = UNTimeIntervalNotificationTrigger(timeInterval: 61, repeats: true)
let request = UNNotificationRequest(identifier: "notificationTest", content: content, trigger:trigger1)
UNUserNotificationCenter.current().add(request) { (error) in
if (error != nil) {
print(error?.localizedDescription)
}
}
5.Others
- CallKit 集成了VoIP及信息標(biāo)識(shí)熙参,還有了黑名單功能艳吠,當(dāng)然不是云萊塢的黑名單
//開(kāi)始請(qǐng)求的方法,在打開(kāi)設(shè)置-電話-來(lái)電阻止與身份識(shí)別開(kāi)關(guān)時(shí)孽椰,系統(tǒng)自動(dòng)調(diào)用
- (void)beginRequestWithExtensionContext:(CXCallDirectoryExtensionContext *)context;
//添加黑名單:根據(jù)生產(chǎn)的模板昭娩,只需要修改CXCallDirectoryPhoneNumber數(shù)組,數(shù)組內(nèi)號(hào)碼要按升序排列
- (BOOL)addBlockingPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context;
// 添加信息標(biāo)識(shí):需要修改CXCallDirectoryPhoneNumber數(shù)組和對(duì)應(yīng)的標(biāo)識(shí)數(shù)組黍匾;CXCallDirectoryPhoneNumber數(shù)組存放的號(hào)碼和標(biāo)識(shí)數(shù)組存放的標(biāo)識(shí)要一一對(duì)應(yīng)栏渺,CXCallDirectoryPhoneNumber數(shù)組內(nèi)的號(hào)碼要按升序排列
- (BOOL)addIdentificationPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context;
- Wide Color 寬域顏色
@available(iOS 10.0, *)
public init(displayP3Red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
- Adapting to the True Tone Display 真彩色顯示
UIWhitePointAdaptivityStyle
共有五種選擇:
UIWhitePointAdaptivityStyleStandard 標(biāo)準(zhǔn)
UIWhitePointAdaptivityStyleReading 閱讀
UIWhitePointAdaptivityStylePhoto 圖片
UIWhitePointAdaptivityStyleVideo 視頻
UIWhitePointAdaptivityStyleGame 游戲
App Search Enhancements 應(yīng)用搜索增強(qiáng)
Widget Enhancements 鎖屏部件增強(qiáng)
News Publisher Enhancements 新聞出版商增強(qiáng)
Apple Pay Enhancements 支付增強(qiáng)
Security and Privacy Enhancements 安全和保密性增強(qiáng)
三,swift3.0
1.去除了swift2系列棄用得特性
2.語(yǔ)法精簡(jiǎn)膀捷,更加哲理性(這詞用得好啊)
3.響應(yīng)式迈嘹,函數(shù)式削彬,面向協(xié)議等語(yǔ)言現(xiàn)代化全庸。
let queue = dispatch_queue_create("this is Swift 2.2", nil)
dispatch_async(queue) {
print("Swift 2.2 queue")
}
Swift 3 取消了這種冗余的寫(xiě)法秀仲,而采用了更為面向?qū)ο蟮姆绞剑?/p>
let queue = DispatchQueue(label: "this is Swift 3.0")
queue.async {
print("Swift 3 queue")
}
當(dāng)然,問(wèn)題還很多壶笼,但4.0就快來(lái)了
四神僵,watchOS3.0,tvOS覆劈,AppStore保礼,macOS Sierra...
1.watchOS3.0
- 新增智能回覆與 Scribble 功能,可在表面手寫(xiě)文字用以回覆訊息责语。
- 新增 SOS 功能炮障,其支持全球的語(yǔ)言與緊急電話,危急時(shí)刻可立即通話或發(fā)出訊息坤候。
- 新增的《Breathe》App 能提醒用戶休息片刻胁赢、多做深呼吸。
- 《活動(dòng)記錄》App 加入 Activity Sharing 功能白筹,能將您個(gè)人的活動(dòng)量分享給親朋好友或健身教練智末,與他人運(yùn)動(dòng)競(jìng)爭(zhēng)或幫助維持健康⊥胶樱《活動(dòng)記錄》更針對(duì)乘坐輪椅的殘障用戶優(yōu)化設(shè)計(jì)系馆,提醒何時(shí)該稍做休息。
2.tvOS
整合 Siri顽照,用以加強(qiáng)語(yǔ)音搜索功能由蘑。此外,tvOS 將新增 Single Sign-on 功能代兵,僅需登入一次即可瀏覽所有付費(fèi)電視頻道纵穿。
當(dāng)然,國(guó)內(nèi)是被墻的
3.AppStore
AppStore 2.0 變革:更改拆帳比例奢人、置入搜索廣告谓媒、縮短審查時(shí)間
4.macOS Sierra
- 新增 Auto Unlock 功能,當(dāng)用戶戴著配對(duì)認(rèn)證的 Apple Watch 開(kāi)啟 Mac 電腦立即自動(dòng)登入何乎,無(wú)須輸入密碼句惯。
- 新增 Universal Clipboard 功能,使用 iCloud 可跨蘋(píng)果設(shè)備復(fù)制與貼上文字支救、照片抢野、影片等。
- 使用 iCloud Drive各墨,將允許多部 Mac 電腦共用桌面指孤,而且 iPhone、iPad 也能存取桌面上的檔案。
- 新增 Optimized Storage 功能恃轩,當(dāng) Mac 電腦容量不足结洼,自動(dòng)將不常用的檔案上傳 iCloud,提醒用戶清空垃圾桶叉跛。
- 線上付款將支持 Apple Pay松忍,搭配 iPhone 或 Apple Watch 快速且安全地完成網(wǎng)購(gòu)的付款動(dòng)作。
- 包括《地圖》筷厘、《郵件》鸣峭、《Pages》、《Numbers》酥艳、《Keynote》甚至第三方 Apps 將支持分頁(yè)功能摊溶。
- Safari 與 iTunes 新增 Picture in Picture 功能,以子母畫(huà)面的方式觀賞影片充石。
- 加入 Siri 功能更扁,可在 macOS Sierra 當(dāng)中語(yǔ)音搜索訊息、文件赫冬、照片浓镜、網(wǎng)頁(yè)等,甚至語(yǔ)音建立備忘錄或開(kāi)啟 FaceTime 視訊劲厌。登陸 macOS Sierra 之后膛薛,Siri 終能跨蘋(píng)果四大平臺(tái)使用。