在離線模式下(例如打開飛行模式)試圖找出在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可以正常工作。但萬一我離線我有兩個問題。
加載代碼返回錯誤和
achievments
初始字典不與已經完成的成就人口,這意味着每次用戶啓動他/她得到通知旗幟遊戲每個成就再次,即使它已經授予。然後放入字典後不會顯示,但我不想在每次遊戲開始時顯示一次成就。我不確定當用戶上線後離線的成就是否會到達Game Center。我可以使用持久性存儲(如數據庫)來解決遊戲啓動之間的成就狀態問題#1,但是如果我在Game Center在線時應該重新提交它們,並且如何檢測Game Center是否實際上在線,因爲即使離線
reportAchievementWithCompletionHandler
無誤完成,所以我無法檢測它是否未提交。這裏是我正在測試的方式,我打開飛行模式,解鎖一些成就,然後關閉飛行模式,成就沒有進入Game Center,儘管這可能是「沙盒」問題。
嘿,你知道成就的表現嗎? http://stackoverflow.com/questions/42631583/calling-report-achievements-performance – Esqarrouth