NSUbiquityIdentityDidChangeNotification не работает?

Я создаю приложение cloudkit и пробовал несколько способов получить NSUbiquityIdentityDidChangeNotification, но так и не смог получить это уведомление.

Я пробовал обе эти версии кода в методах делегата didFinish и viewDidLoad. А я пробовал звонить из другого уведомления - UIApplicationDidBecomeActiveNotification. Я также ставлю import Foundation вверху файлов.

Вот основной код, который я пробовал:

NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "handleIdentityChanged:",
        name: NSUbiquityIdentityDidChangeNotification,
        object: nil)

// И это я тоже пробовал из другого сообщения здесь на ТАК:

    var localeChangeObserver = NSNotificationCenter.defaultCenter().addObserverForName(NSUbiquityIdentityDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()) { _ in
        println("The user’s iCloud login changed: should refresh all user data.")
    }

Кто-нибудь знает, как заставить это уведомление работать только для приложения cloudkit в быстром режиме? Я действительно просто хочу обнаружить изменение статуса iCloud, а затем инициировать получение userID, если произошло изменение.

Не то чтобы мне нужен доступ к ubiquityIdentityToken, но мне было интересно, почему бы не сохранить токен и каждый раз, когда приложение запускается, сравнивать текущий токен с тем, который находится в локальном хранилище, чтобы увидеть, является ли это другой учетной записью или nil? Поэтому, почему получение уведомления необходимо?

Кроме того, код для получения токена работает только в том случае, если я включаю «Документы iCloud», которые мне не нужны. Кто-нибудь знает последствия включения этого для социального приложения, которому это не нужно? И есть ли другой способ получить токен без включения iCloud Documents?

Это код, который я использовал для получения токена и поместил в метод делегата didFinish, но он работает только в том случае, если документы iCloud включены:

var token = NSFileManager.defaultManager().ubiquityIdentityToken
    println("token is \(token!)")

person Renee Olson    schedule 09.03.2015    source источник


Ответы (2)


В iOS, когда я выхожу из iCloud, мое приложение закрывается. Так что, похоже, нет необходимости получать NSUbiquityIdentityDidChangeNotification. Как вы сказали, кажется достаточным сравнить текущий токен с сохраненным токеном.

Однако на Apple TV мое приложение не было уничтожено, когда я вышел из iCloud. Здесь я заметил, что уведомление не было запущено, как вы описали. Поскольку приложение не убито, уведомление будет в порядке. (Разве Apple забыла удалить приложения на Apple TV при изменении учетной записи iCloud?)

В Apple TV нет доступного контейнера документов iCloud (если только я не предоставлю его явным образом из приложения iOS). Я обнаружил, что на веб-сайте центра разработки для идентификатора приложения iCloud отображается как «Настраиваемый», а не «Включенный», если не выбран контейнер документов. Интересно, влияет ли это на получение уведомлений.

Как на Apple TV, так и на iOS я также могу подтвердить, что токен iCloud равен nil, когда не используются документы (здесь: только хранилище ключей-значений). Теперь это затрудняет обнаружение изменений учетной записи приложениями Apple TV (поскольку приложение не уничтожается при изменении учетной записи iCloud, как в iOS).

Я только что заметил, что мое приложение Apple TV получает несколько NSUbiquitousKeyValueStoreDidChangeExternallyNotification, когда я вхожу в другую учетную запись iCloud, чтобы отразить изменения. Я думаю, это настолько хорошо, насколько это возможно. Эти уведомления приходят с ключом NSUbiquitousKeyValueStoreChangeReasonKey в userInfo, а значение NSUbiquitousKeyValueStoreAccountChange указывает на изменение учетной записи.

Извините, что не смог предоставить прямое решение, возможно, это помогло поделиться своим опытом.

person bio    schedule 22.01.2016
comment
Спасибо, что поделился. В конце концов я отказался от уведомления и некоторое время не пересматривал его, так что, возможно, эта проблема была исправлена ​​​​Apple ... Я помню, что видел другие сообщения, которые также жаловались на отсутствие этого уведомления. Я никогда не работал с Apple TV, но звучит забавно. Я не знаком с уведомлениями, которые вы упомянули в конце, но похоже, что это связано с хранилищем значений ключа, которое я еще не использовал. Удачи с вашим приложением! - person ScottEdwards2000; 25.01.2016

Чтобы получать уведомления в iOS, когда пользователь входит или выходит из iCloud во время использования вашего приложения, используйте уведомление CKAccountChangedNotification вместо уведомления NSUbiquityIdentityChanged.

(Более подробное объяснение: https://stackoverflow.com/a/38689094/54423.)

person Anthony C    schedule 31.07.2016