【问题标题】:Share Data between Project and Share Extension在项目和共享扩展之间共享数据
【发布时间】:2020-05-02 17:13:49
【问题描述】:

我想在我的Main Project 和我的Share Extension 之间共享数据。这就是我所做的:

1.ProjectShare Extension 中启用应用组

2.将数据保存在ProjectviewDidLoad(工作正常,我测试过):

DataHandler.getWishlists { (success, dataArray, dropOptionsArray)  in
        if success && dataArray != nil {
            self.shouldAnimateCells = true
            self.dataSourceArray = dataArray as! [Wishlist]
            self.theCollectionView.isHidden = false
            self.theCollectionView.reloadData()
            self.dropOptions = dropOptionsArray as! [DropDownOption]
            self.addButton.isEnabled = true
            self.activityIndicator.stopAnimating()

            // save dataSourceArray in UserDefaults
            if let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey) {
                defaults.setDataSourceArray(data: dataArray as! [Wishlist])
                defaults.synchronize()
            } else {
                print("error Main")
            }
        }
    }

3. 检索Share Extension 中的数据(error 2 触发!)

if let defaults = UserDefaults(suiteName: UserDefaults.Keys.groupKey) {
        if let data = defaults.getDataSourceArray() {
            dataSourceArray = data
            defaults.synchronize()
        }else {
            print("error 2")
        }

    } else {
        print("error 1")
    }

用户默认值 + 助手

extension UserDefaults {

public struct Keys {
    public static let groupKey = "group.wishlists-app.wishlists"

    public static let dataSourceKey = "dataSourceKey"
}



func setDataSourceArray(data: [Wishlist]){
    set(try? PropertyListEncoder().encode(data), forKey: Keys.dataSourceKey)
    synchronize()
}

func getDataSourceArray() -> [Wishlist]? {
    if let data = UserDefaults.standard.value(forKey: Keys.dataSourceKey) as? Data {
        if let dataSourceArray = try? PropertyListDecoder().decode(Array<Wishlist>.self, from: data) as [Wishlist] {
            return dataSourceArray
        }
    }
    return nil
}
}

我无法检索我的Share Extension 中的数据,但我不知道为什么。有谁能帮帮我吗?

【问题讨论】:

  • 你遇到了什么错误?
  • 它打印“错误 2”(第 3 点有问题)
  • 在主应用重启后能找回来吗?
  • @Daij-Djan 你是什么意思?我在主应用程序中尝试了getDataSourceArray(),它工作得非常好
  • 在您的getDataSourceArray() 中检查数据是否为零或者您正在获取一些数据?

标签: ios swift nsuserdefaults ios8-share-extension


【解决方案1】:

您的帮助函数 getDataSourceArray() 尝试访问不在您的主机应用程序和扩展应用程序之间共享的 UserDefaults.standard。您需要使用共享容器。

  • UserDefaults.standard -> 在主机和扩展之间共享
  • UserDefaults(suiteName:) -> 在主机和扩展之间共享

尝试将您的功能更改为:

func getDataSourceArray() - > [Wishlist] ? {
    if let data = UserDefaults(suiteName: UserDefaults.Keys.groupKey).value(forKey: Keys.dataSourceKey) as ? Data {
        if let dataSourceArray =
            try ? PropertyListDecoder().decode(Array < Wishlist > .self, from: data) as[Wishlist] {
                return dataSourceArray
            }
    }
    return nil
}

【讨论】:

  • 很抱歉没有完全关注你。 UserDefaults + Helpers 将项目和扩展都作为目标
  • 是的,但这仅允许您从两个目标访问辅助函数。辅助函数本身正在访问UserDefaults.standard,这不是您创建的共享容器。
猜你喜欢
  • 2018-01-18
  • 2019-03-29
  • 2018-07-12
  • 2023-03-05
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多