2016年IOS新技術(shù)回顧

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ò)得画髓。


ipv6.png

客戶端向服務(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文件支持你所要的操作事件


    siri.png
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

語(yǔ)音識(shí)別技術(shù)原理

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)使用。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末补鼻,一起剝皮案震驚了整個(gè)濱河市哄啄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌风范,老刑警劉巖咨跌,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異硼婿,居然都是意外死亡锌半,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)寇漫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刊殉,“玉大人,你說(shuō)我怎么就攤上這事州胳〖呛福” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵栓撞,是天一觀的道長(zhǎng)遍膜。 經(jīng)常有香客問(wèn)我碗硬,道長(zhǎng),這世上最難降的妖魔是什么瓢颅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任恩尾,我火速辦了婚禮,結(jié)果婚禮上惜索,老公的妹妹穿的比我還像新娘。我一直安慰自己剃浇,他們只是感情好巾兆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著虎囚,像睡著了一般角塑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淘讥,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天圃伶,我揣著相機(jī)與錄音,去河邊找鬼蒲列。 笑死窒朋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蝗岖。 我是一名探鬼主播侥猩,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼抵赢!你這毒婦竟也來(lái)了欺劳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铅鲤,失蹤者是張志新(化名)和其女友劉穎划提,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體邢享,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹏往,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骇塘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掸犬。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绪爸,靈堂內(nèi)的尸體忽然破棺而出湾碎,到底是詐尸還是另有隱情,我是刑警寧澤奠货,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布介褥,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏柔滔。R本人自食惡果不足惜溢陪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睛廊。 院中可真熱鬧形真,春花似錦、人聲如沸超全。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘶朱。三九已至蛾坯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疏遏,已是汗流浹背脉课。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留财异,地道東北人倘零。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像戳寸,于是被迫代替她去往敵國(guó)和親视事。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容