Совместное использование данных между проектом и расширением общего доступа - PullRequest
1 голос
/ 02 мая 2020

Я хотел бы поделиться данными между моим Main Project и моим Share Extension. Вот что я сделал:

1. включите группы приложений в обоих Project & Share Extension

2. сохранить данные в Project внутри viewDidLoad (работает нормально, я проверял):

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")
    }

UserDefaults + Helpers

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, но понятия не имею почему. Может ли кто-нибудь помочь мне здесь?

1 Ответ

3 голосов
/ 06 мая 2020

Ваша вспомогательная функция 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
}
...