2013-01-08 125 views
8

在離線模式下(例如打開飛行模式)試圖找出在Game Center中使用成就的最佳方式。離線遊戲中心iOS成就

據我瞭解,iOS 5+遊戲中心負責離線提交的成就和分數。它就像一個代理緩存,並在用戶下線時將它們提交到在線遊戲中心。考慮到這一點,我這樣做:

用戶身份驗證成功我加載成果並將它們存儲在字典中。

[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];  
}]; 

後,當我提交新的成就我檢查成就字典,如果成就已經完成不提交。如果我提交成績,我還將其添加到achievments字典(內存中)以立即重新指明此成果已提交。

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); 
     } 
    }]; 
} 

這種方法允許我在遊戲代碼中觸發提交,我會提交兩次實現成果或顯示通知橫幅兩次。

當Game Center在線時,Everyting可以正常工作。但萬一我離線我有兩個問題。

  1. 加載代碼返回錯誤和achievments初始字典不與已經完成的成就人口,這意味着每次用戶啓動他/她得到通知旗幟遊戲每個成就再次,即使它已經授予。然後放入字典後不會顯示,但我不想在每次遊戲開始時顯示一次成就。

  2. 我不確定當用戶上線後離線的成就是否會到達Game Center。我可以使用持久性存儲(如數據庫)來解決遊戲啓動之間的成就狀態問題#1,但是如果我在Game Center在線時應該重新提交它們,並且如何檢測Game Center是否實際上在線,因爲即使離線reportAchievementWithCompletionHandler無誤完成,所以我無法檢測它是否未提交。這裏是我正在測試的方式,我打開飛行模式,解鎖一些成就,然後關閉飛行模式,成就沒有進入Game Center,儘管這可能是「沙盒」問題。

回答

4

爲您提到的「成就解鎖」添加持久性存儲,併爲每個成就存儲「成功提交到遊戲中心」標誌。然後,在線時,請在啓動時檢查loadAchievementsWithCompletionHandler的結果,並定期查看每個成就unlocked && !submitted是否已實際到達Game Center,如果不是,則重新提交。

+0

嘿,你知道成就的表現嗎? http://stackoverflow.com/questions/42631583/calling-report-achievements-performance – Esqarrouth