我在堆棧溢出的帖子中看到了顯示處理GameCenter認證片段的帖子。但是,這些解決方案都不能解決現實世界使用案例涉及的任何問題。也就是說,[GKLocalPlayer localPlayer] .authenticateHandler只是狀態的回調,而不是其他的。它提供了一個視圖控制器,但是在認證和錯誤狀態中存在巨大的不一致。做什麼是GameCenter身份驗證的正確方法?
有我試圖做幾件事情:直到功能使用它 2.嘗試在應用程序啓動默默認證 1.不彈出遊戲中心登錄 3.提供一些信息給用戶爲什麼GameCenter功能不起作用 4.提供恢復機制
即是說如果有錯誤報告我怎麼能顯示登錄對話框呢?
我得到這個錯誤沒有的viewController:
案例1:
錯誤GameCenterManager :: authenticateLocalPlayer [互聯網連接似乎已離線。]
儘管它的錯誤信息,設備完全在線,因爲safari加載cnn.com就好了。
案例2:
有人關閉登錄屏幕,因爲他們還沒有準備好,在這種情況下.authenticated回來爲真,的viewController保持在零,但所有的遊戲中心通話將失敗。爲什麼當[GKLocalPlayer localPlayer] .authenticated設置爲true時不是?
案例3:
錯誤GameCenterManager :: authenticateLocalPlayer [操作 無法完成。 (NSURLErrorDomain error -1009。)]
這種情況持續發生,但應用程序無法爲用戶做任何事情。在這種情況下,消息應該是什麼?將應用程序切換到Game Center並在那裏登錄?
情況4:
錯誤GameCenterManager :: authenticateLocalPlayer [請求的 操作已被取消或由用戶禁用。]
會發生這種情況,如果用戶取消的viewController該應用被告知由蘋果出席。然而,也沒有恢復或檢測到這種狀態。
案例5:
錯誤GameCenterManager :: createMatch [要求的操作因爲 無法完成,因爲本土球員還未被驗證。]
如果用戶已登錄,但無論出於何種原因退出GameCenter然後返回到應用程序,都會發生這種情況。應用程序將被告知用戶仍然通過身份驗證,但顯然不是,但我沒有可以撥打另一個登錄名的電話。所以基本上,如果GameCenter不只是默默地工作,我們應該怎麼做應用程序設計師呢?警報視圖,並告訴他們使用遊戲中心應用程序登錄並重新啓動應用程序?
這裏是我的驗證碼:
//******************************************************
// Authenticate
//******************************************************
-(void)authenticateLocalPlayer:(bool)showLogin
{
if(showLogin && self.loginScreen != nil)
{ [[WordlingsViewController instance] presentViewController:self.loginScreen animated:YES completion:nil]; }
if([GKLocalPlayer localPlayer].isAuthenticated)
{
NSDLog(NSDLOG_GAME_CENTER,@"GameCenterManager::authenticateLocalPlayer LocalPlayer authenticated");
}
__weak GameCenterManager* weakSelf = self;
[GKLocalPlayer localPlayer].authenticateHandler = ^(UIViewController *viewController, NSError *error)
{
if (error != nil)
{
NSDLog(NSDLOG_GAME_CENTER,@"Error in GameCenterManager::authenticateLocalPlayer [%@]", [error localizedDescription]);
}
else
{
if (viewController != nil)
{
NSDLog(NSDLOG_GAME_CENTER,@"GameCenter: No authentication error, but we need to login");
weakSelf.loginScreen = viewController;
}
else
{
if ([GKLocalPlayer localPlayer].authenticated)
{
NSDLog(NSDLOG_GAME_CENTER,@"GameCenter localPlayer authenticated");
weakSelf.gameCenterAvailable = YES;
weakSelf.localPlayer = [GKLocalPlayer localPlayer];
[weakSelf retrieveFriends];
[weakSelf loadPlayerPhoto:weakSelf.localPlayer];
for (id<GameCenterDelegate> listener in weakSelf.listeners)
{ [listener onPlayerAuthenticated]; }
}
else
{
weakSelf.gameCenterAvailable = NO;
}
}
}
};
}
這個函數被調用兩次:一次是在應用程序啓動,希望能夠建立一個有效的登錄狀態,第二如果用戶沒有通過驗證,他們嘗試使用一個應用程序功能需要遊戲中心。在這個應用程序,它正在創建一個基於回合的比賽或查看朋友
正如預期的那樣,我想我將不得不彈出一個警告視圖,帶有指示在視圖控制器出錯的情況下殺死應用程序。欣賞反饋,看起來我們有非常類似的處理,所以我不覺得糟糕。 –