Не удается получить доступ к NSUserDefaults, используя группы приложений друг к другу

Я работаю над приложением и виджетом, который необходим виджету для получения данных из приложения. Я использовал следующие коды для чтения и записи на NSUserDefaults. А также я использовал $(PRODUCT_BUNDLE_IDENTIFIER).widget для виджета и $(PRODUCT_BUNDLE_IDENTIFIER) со ссылкой на этот пост. Но виджет не может получить данные из приложения или NSUserDefaults. Как я могу заставить это работать?

func addTask(name: String?) {
    let key = "keyString"
    tasks.append(name!)
    let defaults = NSUserDefaults(suiteName: "group.Mins")
    defaults?.setObject(tasks, forKey: key)
    defaults?.synchronize()

}

///////

let defaults = NSUserDefaults(suiteName: "group.Mins")
let key = "keyString"

if let testArray : AnyObject = defaults?.objectForKey(key) {
    let readArray : [String] = testArray as! [String]
    timeTable = readArray
    timeTable = timeTable.sort(<)
    print("GOT IT")
    print("timetable: \(timeTable)")
}

Ответ 1

Чтобы прочитать и сохранить из того же набора NSUserDefaults, вам необходимо следующее:

  1. В главном приложении выберите свой проект в навигаторе проектов.
  2. Выберите цель своего основного приложения и перейдите на вкладку возможностей.
  3. Включите группы приложений (они будут взаимодействовать с порталом разработчика, так как он генерирует набор разрешений, соответствующий идентификатор приложения и т.д.).
  4. Создайте новый контейнер. Согласно справке, он должен начинаться с "group.", Поэтому дайте ему имя, например "group.myapp.test".
  5. Выберите цель "Расширение сегодня" и повторите этот процесс включения групп приложений. Не создавайте новую, вместо этого выберите эту вновь созданную группу, чтобы указать, что расширение Today является членом группы.

Напишите в свой NSUserDefaults:

// In this example I´m setting FirstLaunch value to true 
NSUserDefaults(suiteName: "group.myapp.test")!.setBool(true, forKey: "FirstLaunch")

Читать из NSUserDefaults:

// Getting the value from FirstLaunch
let firstLaunch = NSUserDefaults(suiteName: "group.myapp.test")!.boolForKey("FirstLaunch")

if !firstLaunch  {
   ...
}

Swift 4.x:

Запись:

UserDefaults(suiteName: "group.myapp.test")!.set(true, forKey: "FirstLaunch")

чтения:

UserDefaults(suiteName: "group.myapp.test")!.bool(forKey: "FirstLaunch")