首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在通知服务扩展和主应用之间共享数据

在通知服务扩展和主应用之间共享数据
EN

Stack Overflow用户
提问于 2019-07-23 13:32:19
回答 2查看 3.1K关注 0票数 5

在我的场景中,我在父iOS应用程序和通知服务扩展之间共享数据。我使用的是Xcode10.2.1,iOS部署目标10.0

我们已经尝试了NSUserDefaults和Keychain组,它可以正常工作。将值(存储模型或数据类型)从通知服务扩展(TargetB)保存到MainApp(TargetA)的任何其他方式。

一旦应用程序处于终止状态,我们已经将值附加到模型中,并将其保存在密钥链中。

保存到Keycahin:

代码语言:javascript
复制
NotificationAPI.shared.NotificationInstance.append(Notifications(title: messageTitle, message: messageBody,date: Date()))

let notification = NotificationAPI.shared.NotificationInstance

  let value = keychain.set(try! PropertyListEncoder().encode(notification), forKey: "Notification")

对于USerDefault:

代码语言:javascript
复制
var defaults = NSUserDefaults(suiteName: "group.yourappgroup.example")

我想要将数据从目标B传输到目标A。当应用程序处于非活动状态时?另一种传输或保存数据?请帮帮我?

EN

回答 2

Stack Overflow用户

发布于 2019-07-23 13:49:57

也许我没有理解正确的问题。

您可以通过CoreData在应用程序之间共享数据:

Here解释了这一点。

通常,您需要将扩展和主应用程序添加到组中,并将xcdatamodeled文件添加到扩展的目标位置。

我认为UserDefaults、Keychain、CoreData、iCloud以及将数据存储到其他应用程序的后端是您拥有的所有选项。

票数 0
EN

Stack Overflow用户

发布于 2019-07-23 14:06:16

在VC中添加以下属性。

代码语言:javascript
复制
var typeArray = [DataModelType]()
let path = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.ABC.app")?.appendingPathComponent("type.plist")

您要共享的DataModel

代码语言:javascript
复制
struct DataModelType: Codable {
    //define properties which you wanna use.
}

向ViewController添加扩展

代码语言:javascript
复制
extension ViewController {

    fileprivate func saveData() {
        let encoder = PropertyListEncoder()
        do{
            let dataEncode = try encoder.encode(typeArray)
            try dataEncode.write(to:path!)
        }
        catch{
            print("Error")
        }
    }

    fileprivate func loadData() {
        if let data = try? Data(contentsOf: path!) {
            let decoder = PropertyListDecoder()
            do {
                typeArray = try decoder.decode([DataModelType].self, from: data)
            }
            catch {
                print("Error")
            }
        }
    }

    func fetchDataModel() -> DataModelType {
        loadData()
        return typeArray
    }
}

在你的扩展中的在你想要访问数据的地方添加下面的代码。

代码语言:javascript
复制
let viewController = ViewController()
let currentDataModel = viewController.fetchDataModel()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57157269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档