2014-10-26 13 views
7

sto scrivendo un piccolo gioco universale per iOS. il punteggio più alto verrà sincronizzato su dispositivi tramite un archivio di chiavi/valori iCloud.Problemi di sincronizzazione di iCaloud Key-Value-Store (NSUbiquitousKeyValueStoreDidChangeExternallyNotification not called)

ottenere il nuovo punteggio:

func retrieveHighestScore() -> Int64 { 
     let iCloudScore: Int64 = NSUbiquitousKeyValueStore.defaultStore().longLongForKey(KeyValueKeyClassification.KeyHighscore.toRaw()) 
     let localScore: Int64 = Int64(NSUserDefaults.standardUserDefaults().integerForKey(KeyValueKeyClassification.KeyHighscore.toRaw())) 
     var result: Int64 = 0 

     if localScore > iCloudScore { 
      storeNewHighscore(localScore) 
      result = localScore 
     } else { 
      storeNewHighscore(iCloudScore) 
      result = iCloudScore 
     } 
     return result 
    } 

la memorizzazione di un nuovo punteggio

func storeNewHighscore(newScore: Int64) { 
     NSUbiquitousKeyValueStore.defaultStore().setLongLong(newScore, forKey: KeyValueKeyClassification.KeyHighscore.toRaw()) 
     NSUserDefaults.standardUserDefaults().setInteger(Int(newScore), forKey: KeyValueKeyClassification.KeyHighscore.toRaw()) 
     if NSUbiquitousKeyValueStore.defaultStore().synchronize() { 
      println("Synched Successfully") 
     } 
    } 

per qualche motivo ma i punteggi non sono sincronizzati.

  • nessun errore
  • non si blocca
  • senza nulla Valori

Ho sempre trovato il punteggio più alto dal dispositivo corrente, non quella raggiunta sugli altri.

il motivo potrebbe essere all'interno di itunesconnect o c'è qualcosa di sbagliato nel mio codice? sto usando un ipad e un iphone per il test, entrambi collegati al mio account icloud.

sto registrando per i cambiamenti come questo:

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

     NSNotificationCenter.defaultCenter().addObserver(self, selector: "icloudKeyValueChanged", name: NSUbiquitousKeyValueStoreDidChangeExternallyNotification, object: nil) 
     if NSUbiquitousKeyValueStore.defaultStore().synchronize() { 
      println("initial Synched Successfully") 
     } 

     return true 
    } 

ma la funzione 'icloudKeyValueChanged' non è mai chiamato.

icloud Capabilities tutti sono ok come sembra:

enter image description here

+0

Credo che l'archiviazione iCloud richieda oggetti plist (?) Probabilmente è necessario avvolgere alcuni di questi in NSNumber ... –

+0

@nickfalk im sono sicuro che non è questo il problema. altrimenti qualcosa di simile alla ferita "setlonglong" non esiste –

+0

OK, ho avuto un problema molto simile con 'Swift' +' NSUserDefaults' dove usare Ints non si gelava, a parte il fatto che non venivano riportati errori. –

risposta

-1

Il suo probabilmente solo la semplice aggiunta la sincronizzazione con il depositante highscore:

func storeNewHighscore(newScore: Int64) { 
    NSUbiquitousKeyValueStore.defaultStore().setLongLong(newScore, forKey: KeyValueKeyClassification.KeyHighscore.toRaw()) 
    NSUserDefaults.standardUserDefaults().setInteger(Int(newScore), forKey: KeyValueKeyClassification.KeyHighscore.toRaw()) 

    NSUserDefaults.standardUserDefaults().synchronize() 

    if NSUbiquitousKeyValueStore.defaultStore().synchronize() { 
     println("Synched Successfully") 
    } 
} 
+1

no: non è mai necessario sincronizzare nsuserdefaults. e il ubiquous (icloud) negozio è sincronizzato e il log 'sincronizzato con successo' viene messo fuori. semplicemente non arriva su altri dispositivi - non ha nulla a che fare con i nsuserdefaults locali –

0

Ho avuto lo stesso problema. La registrazione di iCloud sul mio dispositivo, e il login, ha risolto il problema :-)

Problemi correlati