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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...