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:
Credo che l'archiviazione iCloud richieda oggetti plist (?) Probabilmente è necessario avvolgere alcuni di questi in NSNumber ... –
@nickfalk im sono sicuro che non è questo il problema. altrimenti qualcosa di simile alla ferita "setlonglong" non esiste –
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. –