Handoff使用指南 - 理論篇

来源:http://www.cnblogs.com/jinfengboy/archive/2016/08/26/5811357.html
-Advertisement-
Play Games

Handoff簡介 Handoff是iOS 8 和 OS X v10.10中引入的功能,可以讓同一個用戶在多台設備間傳遞項目。In iOS 9 and OS X v10.11 支持了Spotlight中搜索並打開應用。 Handoff交互: 在iOS中這個user activity object是U ...


Handoff簡介

Handoff是iOS 8 和 OS X v10.10中引入的功能,可以讓同一個用戶在多台設備間傳遞項目。In iOS 9 and OS X v10.11 支持了Spotlight中搜索並打開應用。

Handoff交互:

  1. 在你的app中為每一個活動創建一個user activity 對象
  2. 定期使用用戶的信息更新user activity對象
  3. 當用戶請求時在不同的設備上繼續用戶活動

在iOS中這個user activity object是UIKit中的 NSUserActivity類。

Handoff需要的硬性條件:

  • 互通的所有設備必須支持 Buletooth LE 4.0,Handoff使用BLE信號來傳遞用戶活動數據。

  • 所有設備必須連到同一個iCloud賬戶。

  • 當然你還得保證當前設備的Handoff功能打開了(iOS:設置->通用->Handoff 與建議的應用程式。 Mac:系統偏好設置->通用,倒數第二欄有個選項,"允許這台Mac和iCloud設備之間使用Handoff")

BLE並不像傳統的藍牙,並不需要人工手動進行配對,只要打開就行了,所有的配對數據傳輸都是自動完成的;設備並不一定需要連在同一個WIFI網路中,Handoff的活動基礎數據通過BLE進行傳遞,較大的數據通過iCloud同步(通過網路streams,比如郵件中有個圖片)。

工作流程

Handoff編程的核心類便是NSUserActivity了,代表著一個用戶的活動,每一個Activity都有一個activityType,用來標識Activity的類型。當App間進行Handoff的話,需要滿足下麵幾個條件:

  • 在iCloud 中使用相同的 Apple ID登錄
  • 和發佈Activity的App擁有相同的TeamID

  • 在應用中你想要支持的Target的Info.plist文件中加入活動標識NSUserActivityTypes

第三方開發的app必須通過App Store發佈或者使用註冊開發者簽名。啟動了Handoff功能的app,在使用期間Handoff消息會通過BLE進行分發,iOS設備接收到消息後會檢查與起始app是否具有相同TeamID以及相同NSUserActivityTypes,如果找到了則在“另一部”設備中顯示推薦app。

User Activity 對象

NSUserActivity對象存儲用戶的活動信息,實現在不同設備上的繼續工作。起始app必須顯式調用becomeCurrent或者基於文件的app(Document-based apps)進入前臺時,給在視圖層級中的UIViewController對象設置文件的NSUserActivity對象來啟用Handoff功能。將其設置resignCurrent或者Document-based app的NSUserActivity對象設置為nil停用。

NSUserActivity對象的唯一標示是 activityType and title 屬性(document name or web page title)。通過eligibleForSearch、 keywords and contentAttributeSet 屬性的支持,可以使其app支持Spotlight搜索結果中顯示。通過 expirationDate設置失效時間。

NSUserActivity對象通過userInfo dictionary 屬性來存儲並共用數據信息。

User Activity 同步機制

User Activity的同步機制分兩種:延時更新(lazy updating )和系統管理。

  • lazy updating 
  • 系統管理
    • 當響應者知道activity的狀態已修改,它必須設置needsSave設置為YES(When the responder knows that the activity state is dirty, it must set the object’s needsSave property to YES. )。系統會在合適的時間自動同步NSUserActivity 對象,首先會通過updateUserActivityState:回調給響應者更新activity’s state的機會。你的響應者子類必須重寫updateUserActivityState:方法來給user activity對象添加狀態數據(在此方法中通過NSUserActivity method addUserInfoEntriesFromDictionary: 方法merge相關狀態信息到userInfo 對象中)。如果多個響應者共用一個NSUserActivity對象,當系統更新user activity對象時,它們都會收到updateUserActivityState:回調。在更新回調發送之前,activity對象的userInfo字典會被清空。

使用App Delegate來繼續activity的使用

在非document app中,通過Handoff啟動響應者app的時候,會在app的delegate中收到application:willContinueUserActivityWithType:application:continueUserActivity:restorationHandler:消息,分四種情況處理:

  1. 普通模式,正常處理
    1.   
      func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]!) -> Void) -> Bool {
          self.window?.rootViewController?.restoreUserActivityState(userActivity)
          return true
      }
      
      override func restoreUserActivityState(activity: NSUserActivity) {
          self.noteTitleField.text = activity.userInfo?["title"] as! String
          self.noteContentView.text = activity.userInfo?["content"] as! String
      }
  2. 如果需要其他響應者或者文件對象來恢復user activity,則需要調用block,數組包括UIResponder集合,然後會讓每個對象收到restoreUserActivityState: 消息。
  3. 如果你繼續的activity是通過搜索列表而來,那可以在這裡重新設置keyword。
  4. 如果沒有實現application:continueUserActivity:restorationHandler:或者返回NO,並且app是基於文件的(document-based),AppKit可以自動恢復用預設的NSUserActivity對象。在這種情況,文件會使用NSDocumentController的方法openDocumentWithContentsOfURL:display:completionHandler: 來打開,並且會收到一條restoreUserActivityState: 消息。

基於文件的app中支持User Activity 

基於文件的app如果Info.plist中添加了CFBundleDocumentTypes則預設支持Handoff功能。NSUbiquitousDocumentUserActivityType 對應的字元串作為NSUserActivity對象的activity type。基於iCloud來同步文件,並且自動生成並存儲到fileURL屬性中,如果app delegate方法application:continueUserActivity:restorationHandler:返回NO,或者沒有實現,那麼AppKit可以自動恢復用上面方式創建的NSUserActivity對象。在這種情況,文件會使用NSDocumentController的方法openDocumentWithContentsOfURL:display:completionHandler: 來打開,並且會收到一條restoreUserActivityState: 消息。

總結

Handoff可以實現iOS8之後的設備之間的“連續互動”,基於UIDocument 的文件app(Info.plist實現了CFBundleDocumentTypes)則預設支持Handoff功能。非文件的app需要實現NSUserActivityTypes在Info.plist中,然後可以分為laze和系統管理兩種同步機制。看的一些blog說需要連接同一網路,其實是沒有必要的。可以通過apple自己提供的預設支持app來做測試(Mac 訪問Safari,手機關閉wifi也會有提示)

iphone左下角的提醒應用圖標的機制有三種方式,Handoff只是其中一種,後面我會有單獨介紹著三種的實現及卻別。

參考資料

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/Handoff/HandoffFundamentals/HandoffFundamentals.html#//apple_ref/doc/uid/TP40014338-CH3-SW1

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [1]contains [2]empty [3]parent [4]has [5]not [6]header [7]lang [8]root ...
  • 模板方法模式 假如我們有一些對象,各個對象之間有一些相同的行為,也有一些不同的行為,這時,我們就可以用模板方法模式來把相同的部分上移到它們的共同原型中(父類),而將不同的部分留給自己各自重新實現。 模板方法:在這些平行對象的共同原型中定義的一個方法,它封裝了子類的演算法框架,它作為一個演算法的模板,指導 ...
  • 原生js使用forEach()與jquery使用each()遍曆數組,return false 的區別: 1、使用each()遍曆數組a,如下: 結果如下: 從運行的效果可以看出,return 相當於迴圈中的break,直接結束整個迴圈。 2、使用forEach()遍曆數組a,如下: 結果如下: 從 ...
  • 《JavaScript權威指南》中指出:JavaScript變數在聲明之前已經可用,JavaScript的這個特性被非正式的稱為聲明提前(hoisting),即JavaScript函數中聲明的所有變數(但不涉及賦值)都被“提前”至函數的頂部。下麵我們從實例中看看: 實例1: 調用函數myFunc() ...
  • form 轉化為真正的數組 先說一下使用場景,在Js中,我們要經常操作DOM,比如獲取全部頁面的input標簽,並且找到類型為button的元素,然後給這個按鈕註冊一個點擊事件,我們可能會這樣操作; 這樣寫肯定是沒有問題的,但是我們知道很多操作數組的方法比for迴圈好用多了,比如es5的forEac ...
  • 概述 現在的開發工具基本都用AndroidStudio了。網上的開源框架也是。比如做瀑布式UI的StaggeredGridView,還有導航頁的PagerSlidingTabStrip等。 那麼電腦性能不好的,還在用eclipse怎麼使用這些開源框架呢? 步驟 準備工作 下載對應的框架如Stagge ...
  • UITextField游標消失 修改以下設置 改為 即可 ...
  • 1、重覆添加某個文件。解決辦法:搜索工程,刪除多餘的文件; 2、文件添加引用錯誤,即尾碼 .m 誤寫為 .h 。解決辦法:改正,編譯通過。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...