IOS小組件(8):App與Widget數據共享


引言

  Widget是一個迷你版的App,IOS有沙盒機制,不同App之間無法直接共享數據。組件和主App之間其實就是不同App的關系,所以也無法通過userdefaults.standard來傳數據,蘋果為了在不打破沙盒的前提下能夠傳數據,就想出了App Group的方法。

數據共享方式

 可以通過網絡和本地數據兩種方式進行數據的共享,本地數據共享可以通過 App Groups。

App Groups 原理

  它是 iOS 8 之后推出的在 App 之間共享數據的方式,只需要簡單的配置就可以實現數據的共享。它主要用於同一group下的app共享同一份讀寫空間,以實現數據共享。編碼 App Groups只能異步同步數據,當Widget讀取數據的時候,只能讀之前手機App保存的數據,相反也是如此。當手機App有新的數據保存時,不能及時的通知Widget更新數據,只能是Widget下次去主動獲取數據。

配置證書

  由於widget項目和主項目其實是兩個獨立的appID,因為需要單獨給widget配置證書,配置證書的過程參考APP證書配置;

開啟APP Groups

  開啟APP Groups是為了widget和app之間實現數據共享;為了便於后續操作,請先確保你的開發者賬號在Xcode上處於登錄狀態。

在app中開啟:

    • TARGETS-->AppExtensionDemo-->Capabilities-->App Groups
    • 找到以后,將App Groups右上角的開關打開,然后選擇添加groups,注意命名要規范,比如:group.com.company.app;

在extension中開啟

假設創建widget target的名稱為TodayExtension,對應的App Group位於

  • TARGETS-->TodayExtension-->Capabilities-->App Groups
  • 開啟的方式和APP中一樣,注意必須要保證這里的App Groups名稱和APP中相同。

App Groups特點

  App Group容器只是在宿主app運行期間才存在,其中的容器用於擴展與宿主的文件共享,宿主被關閉了,共享也就沒意義了。
以上來自於實際測試,測試過程是:在宿主app運行期間,點擊其中的按鈕彈出模態視圖控制器,進行數據填充。完成后保存數據到App Group容器中的文件中,以供today extension擴展進行數據使用。只要將宿主app殺掉后重啟啟動宿主app,today extension 中已經顯示的數據就完全沒有了。單純將宿主app殺掉不重啟,today extension的任然hi顯示之前的內容。由於宿主app中顯示的數據也是從app group中的文件中取出來的,所以數據也沒了。

  由於這個共享機制的特殊性,這個容器不能用來長期保存文件!!!應該將文件存儲到宿主app的文件夾中,可以長期存儲。today extension展示的數據量較少,在合適的時候將其需要的數據搬運到app group中!

共享數據核心代碼

FileManager實現創建一個文件夾

/*
 * 創建並返回目錄路徑URL
 */
static private func makeShareFolderExists(folderName: String) -> URL? {
    let documentsDirectory = FileManager().containerURL(forSecurityApplicationGroupIdentifier: groupId)
    guard let folderURL = documentsDirectory?.appendingPathComponent(folderName) else { return nil}
    
    var isDir : ObjCBool = false
    var isExists = FileManager.default.fileExists(atPath: folderURL.path, isDirectory: &isDir)
    if isExists && !isDir.boolValue {
        do {
            try FileManager.default.removeItem(at: folderURL)
            isExists = false;
        } catch {
            return nil
        }
    }
    if !isExists {
        do {
            try FileManager.default.createDirectory(atPath: folderURL.path, withIntermediateDirectories: true, attributes: nil)
        } catch {
            return nil
        }
    }
    return folderURL
}

  更多 FileManager 請查看官網Api https://developer.apple.com/documentation/foundation/filemanager/

參考

結語

  本文講解了App與小組件的數據共享方式是用App Groups機制來實現的,配置相關的請參考其他文章里面的詳細操作步驟。另外請特別注意App Groups里面的數據不是永久的,只是暫存而已


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM