Cercando di capire il modo migliore per lavorare con Obiettivi in Game Center in caso di modalità offline (ad esempio, modalità aereo attivata).Offline Game Center iOS Obiettivi
Per quanto ne so, Game Center in iOS 5+ si occupa di risultati e punteggi inviati offline. Funziona come una cache proxy e li invia al Game Center online la prossima volta che l'utente è online. Considerando questo, ecco cosa faccio:
All'autenticazione utente riesco a caricare i risultati e li memorizzo in un dizionario.
[GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *gcAchievments, NSError *error)
{
if (error) { ..skipped ..}
//This dictionary will store current achievments, so that we didn't submit them
//once more and didn't show notification.
achievments = [[NSMutableDictionary alloc] initWithCapacity:gcAchievments.count];
//Storing achievments in dictionary
for(GKAchievement *a in gcAchievments)
[achievments setObject:a forKey:a.identifier];
}];
più tardi, quando ho presentare nuovi raggiungimento I check per la realizzazione in un dizionario e non lasciatevi se realizzazione è già stata completata. Se invio un risultato, lo aggiungo anche al dizionario achievments
(in memoria) per riflettere immediatamente che questo risultato è già stato inviato.
GKAchievement *cachedAchievment = [achievments objectForKey:identifier];
if (cachedAchievment && cachedAchievment.percentComplete >= 100)
{
//Already unlocked this achievment.
return;
}
GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier: identifier];
if (achievement)
{
achievement.percentComplete = percent;
[achievement reportAchievementWithCompletionHandler:^(NSError *error)
{
if (!error)
{
//Flagging achievment as completed locally to avoid achieving it second time and showing notification.
[achievments setObject:achievement forKey:achievement.identifier];
//Now shoing notification banner.
GKAchievementDescription * desc = [achievmentsDescriptions objectForKey:achievement.identifier];
[[GKAchievementHandler defaultHandler] notifyAchievement:desc];
}
else
{
NSLog(@"Error in reporting achievements: %@", error);
}
}];
}
questo approccio mi permette di innescare presentazione nel codice del gioco witout worying che mi sottopongo achievment due volte o mostrare messaggio di avviso due volte.
Tutto funziona quando Game Center è online. Ma nel caso in cui sono offline ho 2 problemi.
codice di Caricamento restituisce l'errore e il dizionario iniziale di
achievments
non è popolata con risultati già completato, questo significa che ogni volta che l'utente lancia il gioco che lui/lei ottiene bandiera notifica per ogni realizzazione di nuovo, anche se è già assegnato. Quindi, dopo che è stato inserito nel dizionario, non viene visualizzato, ma non voglio mostrare i risultati anche una volta per ogni inizio di gioco.Non sono sicuro che i risultati inviati offline raggiungeranno Game Center quando l'utente si collega online. Posso risolvere il problema numero 1 utilizzando la memoria persistente (come il database) per archiviare lo stato dei risultati tra i lanci del gioco, ma dovrei inviarli nuovamente quando Game Center è online e come posso rilevare se Game Center è online, poiché anche offline
reportAchievementWithCompletionHandler
si completa senza errori , quindi non riesco a rilevare se non è stato presentato. Ecco come sto testando, ho attivato la Modalità aereo, sblocco di alcuni risultati e quindi disattivare la modalità aereo, i risultati non arrivano a Game Center, anche se questo potrebbe essere un problema di "sandbox".
Ehi, sai qualcosa delle prestazioni dei risultati? http://stackoverflow.com/questions/42631583/calling-report-achievements-performance – Esqarrouth