日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在 App 扩展和主 App 间共享数据

發布時間:2023/12/9 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在 App 扩展和主 App 间共享数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

tags: iOS 8,Swift,App Groups

隨著 iOS 8 的發布,蘋果為廣大開發者很多新的 API,其中最突出顯著的就非 App Extension 莫屬了。這為開發者們又帶來了很多機會。

而我們在開發 App Extension 的時候,基本大多數人都會遇到這樣一個問題。就是由于 App Store 的規則是 App Extension 不能獨立的發布,而是要跟隨一個宿主應用一起發布。

比如奇妙清單:

我們看到,通過 App 擴展,奇妙清單將主 App 的任務數據顯示到了通知中心上面。而這個通知中心插件的數據是來自它的主應用的。

要達到這個效果,就需要這兩個 App 之間的數據進行共享。注意,是兩個獨立的應用哦。App 擴展雖然是以插件形式附屬在主 App 中的,但它也作為一個獨立的 App。

在兩個獨立的應用間共享存儲數據有什么方法呢?這就需要 App Groups 的概念。

從名字就可以看出來啦,App Groups 就是應用分組,將不同的應用分到一個 App Groups 中,即可在這些應用之間共享數據。

具體操作流程如下:

  • 在項目的設置界面中找到應用的 Target,然后選擇 Capabilities 選項卡,然后會列出很多選項,往下拉就會找到 App Groups 選項,我們打開它的開關。如下圖:

    (注意一點:打開 App Groups 需要關聯你的蘋果開發者賬號。所以在這之前,你還需要擁有一個蘋果開發者賬號。)

  • 成功開啟后,會出現 App Groups 設置界面。點擊下方的加號按鈕,來添加一個新的 App Groups。如下圖:

    App Groups 的命名規則和 Bundle Identifier 一樣,都是使用反向 DNS 規則。比如 group.app.test
    添加完成后,新的 Group 就會顯示在設置界面上,我們將它左邊的復選框勾選上,就完成了。

  • 到此為止,主 App 的設置步驟就完成了,下面我們還要對擴展 App 進行類似的操作。首先還是找到 App Groups 選項框,并打開開關。

    (注意:這次我們的 Target 選擇的是 extension)

  • 打開開關后,這次和剛才的操作步驟有所不同,因為我們之前已經創建過 App Groups 了,這次就不需要創建新的了,只需要點擊 App Groups 設置界面中的刷新按鈕,就可以看到我們之前創建過的 Group 了。

    然后勾選上即可完成 App 擴展Group 設置。

  • 這些基本設置操作完成后,我們就可以在這兩個 App 之間進行數據共享啦。大家可以想一想,我們用什么方法進行數據共享比較合適呢?

    其實很簡單啦,就是我們熟悉的 NSUserDefaults 了。相信每一位朋友對這個類都不陌生。沒想到吧,它還有共享數據這個作用。如果仔細查看它的文檔,你就會發現它還有這樣一個初始化方法 initWithSuiteName: 而官方文檔上對這個方法是這樣解釋的:

    Returns an NSUserDefaults object initialized with the defaults for the specified app group.

    看到了吧,里面提到了 App Group, 這個初始化方法就是為 App Group 量身打造的。如果有興趣進一步研究,可以查看下 NSUserDefaults 的 官方文檔。

    下面我們就繼續啦,App 數據共享即將大功告成。首先我們在主 App 中的 AppDelegate 中的 didFinishLaunchingWithOptions 方法中來寫存入數據的代碼:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -\> Bool {var defaultForExtension:NSUserDefaults! = NSUserDefaults(suiteName: "group.app.test")if(defaultForExtension != nil){defaultForExtension.setObject("2014", forKey: "year")defaultForExtension.synchronize()}return true}

    有沒有注意到這里面 NSUserDefaults 的構造方法NSUserDefaults(suiteName: "group.app.test") ,我們將前面我們創建的 App Groups 的標識作為參數傳給了它的構造方法。這樣,這個 NSUserDefaults 就專為我們的這個 App Group 存儲數據了。

    接下來,再到 App 擴展 中,再用這個 NSUserDefaults 將我們設置的值讀取出來:

    var defaultForExtension:NSUserDefaults! = NSUserDefaults(suiteName: "group.app.test") if(defaultForExtension != nil){var result:NSString = defaultForExtension.objectForKey("year") as NSStringprintln(result) }

    到這里,我們的 AppExtension 之間的數據共享就完成了, 是不是解決了一個大問題呢。反正我覺得是。

    更多文章請訪問我的個人博客?www.theswiftworld.com

    轉載于:https://www.cnblogs.com/theswiftworld/p/4158590.html

    總結

    以上是生活随笔為你收集整理的在 App 扩展和主 App 间共享数据的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。