2013-10-18 180 views
9

我是想實現在回合遊戲中的事件偵聽器,以便玩家可以接收當輪到他是活動的,或者當他被一個朋友邀請。 GKTurnBasedEventHandler在IOS 7中已棄用,我讀過我應該使用GKLocalPlayerListener的文檔;但這是它的延伸。有沒有人使用過它,因爲沒有任何信息。IOS遊戲中心GKLocalPlayerListener

這是我之前試過了,這是行不通的。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
    [localPlayer authenticateWithCompletionHandler:^(NSError *error) 
    { 
     if (localPlayer.isAuthenticated) 
     { 
      GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
      [localPlayer registerListener:self]; 
     } 
    }]; 

    return YES; 
} 

-(void)handleInviteFromGameCenter:(NSArray *)playersToInvite 
{ 
    NSLog(@"test"); 
} 

- (void)player:(GKPlayer *)player receivedTurnEventForMatch:(GKTurnBasedMatch *)match didBecomeActive:(BOOL)didBecomeActive 
{ 
    NSLog(@"test"); 
} 
+0

你有沒有想過或找到其他的東西?我在使用GKLocalPlayerListener時遇到問題。可用的文檔和示例仍然利用已棄用的API。 – iksnae

+0

還沒有,其他一些緊急事情出現了,但如果我這樣做,我會發布解決方案。 – Macaret

+0

它在某種程度上適用於我。這些方法類似於現在已棄用的方法,除了當前玩家也通過。然而,我遇到的問題是確定何時解除/重新註冊聽衆,例如當應用程序在bg/fg之間切換時。這對於iOS 6中的邀請聽衆也是一個問題。 – Drux

回答

2

下面是一些代碼,我爲了用來註冊GKLocalPlayerListener

__weak GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) { 
    if (viewController) { 
     [authenticateFromViewController presentViewController:viewController animated:YES completion:^{ 
      [localPlayer registerListener:self]; 
      NSLog(@"Authenticated. Registering Turn Based Events listener"); 
     }]; 
    } else if (localPlayer.authenticated) { 
     [localPlayer registerListener:self]; 
     NSLog(@"User Already Authenticated. Registering Turn Based Events listener"); 
    } else { 
     NSLog(@"Unable to Authenticate with Game Center: %@", [error localizedDescription]); 
    } 
}; 

文檔指出你應該只註冊一個GKLocalPlayerEventListener一次,所以你可以通過檢查,如果你已經改善這個代碼已經註冊。

注意authenticateWithCompletionHandler在iOS 6中棄用,就像我上面那樣,他們建議設置authenticateHandler財產。

1

我相信你在那裏。就在這個時候做幾件事情。確保在添加偵聽器之前不添加多個偵聽器,只需註銷所有偵聽器即可。

我確信我只在我的整個項目這樣做一次,但我得到了本土選手多次。

-(void) onLocalPlayerAuthChanged:(GKLocalPlayer*)authPlayer { 

    [authPlayer unregisterAllListeners]; 
    [authPlayer registerListener:_Whatever_]; 

} 
1

我可能有點晚了,但我希望它會幫助一個人在那裏......

這是我做的。根據Apple's documentation創建[我]自己的方法,顯示認證視圖適合[my]應用程序。

- (void)authenticateLocalUser 
    { 
     if ([GKLocalPlayer localPlayer].authenticated == NO) { 
      __weak typeof(self) weakSelf = self; 
      __weak GKLocalPlayer *weakPlayer = [GKLocalPlayer localPlayer]; 

      weakPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) { 
       if (viewController != nil) { 
        [weakSelf showAuthenticationDialogWhenReasonable:viewController]; 
       } else if (weakPlayer.isAuthenticated) { 
        // Player has been authenticated! 
        [weakPlayer registerListener:weakSelf]; 
       } else { 
        // Should disable Game Center? 
       } 
      }; 

     } else { 
      // Already authenticated 
      [[GKLocalPlayer localPlayer] registerListener:self]; 
     } 
    } 


    -(void)showAuthenticationDialogWhenReasonable:(UIViewController *)controller 
    { 
     [[[[[UIApplication sharedApplication] delegate] window] rootViewController] presentViewController:controller animated:YES completion:nil]; 
    } 

此代碼是一個單獨的輔助類中,它可能是,如果你擁有了它自己的類簡化。

+0

非常感謝你,我最近15個小時都在等待,而且隨處提到委託,但沒有提供正確的語法。爲了我自己的目的,我真的把它轉化爲快速。 https://stackoverflow.com/questions/44889019/gkturnbasedeventlistener-could-not-be-set-to-delegate-of-my-viewcontroller –