2016-06-05 3 views
1

Я хотел протестировать хранилище ключей iCloud. Вот шаги, которые я взял:Исходный тест хранилища ключей для iCloud

1) Приобретение яблока аккаунт разработчика по цене около $ 100, ждали его, чтобы активировать

2) В области разработчиков я создал идентификатор приложения, контейнер ICloud, профиль обеспечения (iOS Development), и удостоверился, что он знал о моем личном устройстве.

3) Создан новый сингл с видом на быстрое приложение в XCode

4) Добавлен следующий код в приложении: didFinishLaunchingWithOptions: метод:

let keyStore = NSUbiquitousKeyValueStore.defaultStore() 

    #if (arch(i386) || arch(x86_64)) && os(iOS) 
     //let DEVICE_IS_SIMULATOR = true 
     keyStore.setString("testValue2", forKey: "testKey2") 
     let didSync = keyStore.synchronize() 
     print("synched: \(didSync)") 
    #else 
     //let DEVICE_IS_SIMULATOR = false 
     let didSync = keyStore.synchronize() 
     print("synched: \(didSync)") 
     if let theString = keyStore.stringForKey("testKey2") { 
      print("the string: \(theString)") 
     } 
     else { 
      print("did not find string with specified key") 
     } 
    #endif 

5) Запустил приложение на тренажере 5s , подтвердил, что keyStore.synchronize() возвращает true.

6) Ждал 10 секунд

7) Запустили приложение на моем iPhone 6+, подтвердили, что keyStore.synchronize() возвращает истину.

8) К сожалению, он распечатал «не нашли строку с указанным ключом»

Что я делаю не так?

+0

Удалите вызовы 'synchronize' – Paulw11

ответ

1

В этом случае не следует звонить synchronize. Из documentation:

Во время синхронизации между памятью и диском, этот метод обновляет набор в памяти ключей и значений с изменениями, ранее полученных от ICloud

Поскольку вы сразу запись в память, а затем вызывая synchronize, ваши значения в памяти будут перезаписаны кешированными значениями, которые в случае совершенно нового приложения пусты. У системы пока еще не было возможности обновить кеш со значением, которое вы только что написали.

Вы должны включить вызов synchronize в applicationWillEnterForeground:

только рекомендуемое время, чтобы вызвать этот метод является при запуске приложения, или по возвращении на передний план, чтобы убедиться, что в памяти ключ-значение представление магазина является актуальным.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    // Override point for customization after application launch. 

    let keyStore = NSUbiquitousKeyValueStore.defaultStore() 
    keyStore.synchronize() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(AppDelegate.iCloudChangedNotification(_:)), name: NSUbiquitousKeyValueStoreDidChangeExternallyNotification, object: nil) 

    keyStore.setString("testValue2", forKey: "testKey2") 
    if let theString = keyStore.stringForKey("testKey2") { 
     print("the string: \(theString)") 
    } 
    else { 
     print("did not find string with specified key") 
    } 
    return true 
} 

func iCloudChangedNotification(notification: NSNotification) { 
    print("iCloud changed") 
    if let userInfo = notification.userInfo { 
     if let changeReason = userInfo[NSUbiquitousKeyValueStoreChangeReasonKey] as? NSNumber { 
      print("Change reason = \(changeReason)") 
     } 
     if let changedKeys = userInfo[NSUbiquitousKeyValueStoreChangedKeysKey] as? [String] { 
      print("ChangedKeys = \(changedKeys)") 
     }   
    } 

    let keyStore = NSUbiquitousKeyValueStore.defaultStore() 

    if let theString = keyStore.stringForKey("testKey2") { 
     print("the string: \(theString)") 
    } 
    else { 
     print("did not find string with specified key") 
    } 
} 

func applicationWillEnterForeground(application: UIApplication) { 
     // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
    let keyStore = NSUbiquitousKeyValueStore.defaultStore() 
    keyStore.synchronize()    
} 
+0

К сожалению, сделать это не изменить результаты. – xytor

+0

Код, как показано для меня, работает – Paulw11

+0

Я только заметил, что вы пытаетесь синхронизировать между двумя симуляторами; Предполагаю, что вы вошли в одну учетную запись iCloud на обоих? Я обновил свой код, чтобы показать, как вы можете регистрироваться для уведомлений об обновлении iCloud. – Paulw11

Смежные вопросы