引言
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里面的數據不是永久的,只是暫存而已