2013-01-08 18 views
8

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.

  1. 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.

  2. 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".

risposta

4

Aggiungere la memorizzazione permanente per "Obiettivo sbloccato" si parla, e anche memorizzare un "presentato con successo al Game Center" bandiera per ogni realizzazione. Quindi, quando sei online, controlla i risultati da loadAchievementsWithCompletionHandler all'avvio e periodicamente per vedere se ogni risultato che è unlocked && !submitted ha effettivamente raggiunto Game Center e reinvia se non lo fa.

+0

Ehi, sai qualcosa delle prestazioni dei risultati? http://stackoverflow.com/questions/42631583/calling-report-achievements-performance – Esqarrouth

Problemi correlati