2012-03-20 73 views
2

如何防止每當您的應用從睡眠中醒來時顯示遊戲中心「歡迎回來」消息?有些應用程序(如Scramble CE,Jetpack Joyride和Bubblin)可以正確處理它(只有一個啓動時的歡迎消息),而其他應用程序(如Backgammon NJ)則不會(每次喚醒時都歡迎消息)。重複遊戲中心歡迎橫幅

正在運行的程序代碼不在我的控制範圍內(發送給authenticateWithCompletionHandler),即使程序塊爲空也會顯示歡迎消息。

這種行爲開始發生在iOS 5.0(在4.x中很好),並且發生在模擬器和真實設備中,而不是在沙盒中。

謝謝!

回答

0

在遊戲套件編程指南,我發現這個位文檔:

所有遊戲支持遊戲中心必須使用任何遊戲中心的功能之前認證的本土球員 。你的遊戲應該在發射後儘早驗證玩家 。理想情況下, 身份驗證應該在您的遊戲向用戶展示用戶界面時立即發生。當您的遊戲對玩家進行身份驗證時,遊戲 套件首先檢查設備上是否已有身份驗證的 播放器。 如果有認證播放器,遊戲套件 會向播放器短暫顯示歡迎標語。

看起來好像你可以用公共API改變這種行爲。

+0

謝謝,我知道這一點。我只知道App Store中的應用程序正在解決這個問題,我也想要! – user1281726 2012-03-21 17:05:43

+0

那麼您需要使用一些未公開的API調用來使其發生或以某種方式在不需要時繞過GK身份驗證檢查。 – 2012-03-21 21:18:56

1

我來自BivisSoft。我們開發了Bubblin。

我們有一個控制GameCenter的Singleton。

這是我們的代碼... 它基於Jacob Gundersen的教程 - http://www.raywenderlich.com/5480/beginning-turn-based-gaming-with-ios-5-part-1

你可以試試!

#pragma mark Singleton 

    static BSGameCenterManager *sharedHelper = nil; 
    + (BSGameCenterManager *) sharedInstance { 
     if (!sharedHelper) { 
      sharedHelper = [[BSGameCenterManager alloc] init]; 
     } 
     return sharedHelper; 
    } 

    #pragma mark Initializers 

    - (id)init { 
     if ((self = [super init])) { 
      gameCenterAvailable = [self isGameCenterAvailable]; 
      if (gameCenterAvailable) { 
       self.localPlayerId = @""; 
       NSNotificationCenter *nc = 
       [NSNotificationCenter defaultCenter]; 
       [nc addObserver:self 
         selector:@selector(authenticationChanged) 
          name:GKPlayerAuthenticationDidChangeNotificationName 
         object:nil]; 
      } 
     } 
     return self; 
    } 

    // Check if GameCenter is Avaiable 
    - (BOOL)isGameCenterAvailable { 
     // check for presence of GKLocalPlayer API 
     Class gcClass = (NSClassFromString(@"GKLocalPlayer")); 

     // check if the device is running iOS 4.1 or later 
     NSString *reqSysVer = @"4.1"; 
     NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
     BOOL osVersionSupported = ([currSysVer compare:reqSysVer  
               options:NSNumericSearch] != NSOrderedAscending); 

     return (gcClass && osVersionSupported); 
    } 

    #pragma mark Authentication 

    - (void)authenticationChanged {  

     if ([GKLocalPlayer localPlayer].isAuthenticated && 
      !self.userAuthenticated) { 
      NSLog(@"GameCenter authentication changed: player authenticated."); 
      self.userAuthenticated = TRUE;   
      self.localPlayerId = [[GKLocalPlayer localPlayer] playerID]; 
      [[NSNotificationCenter defaultCenter] postNotificationName: @"gameCenterPlayerAuthenticated" object: nil userInfo: nil];  
      [self checkNotSentScores]; 
     } else if (![GKLocalPlayer localPlayer].isAuthenticated && 
        self.userAuthenticated) { 
      NSLog(@"GameCenter authentication changed: player not authenticated"); 
      self.userAuthenticated = FALSE; 
      self.localPlayerId = @""; 
     } 
    } 

    - (void)authenticateLocalUser { 

     if (!gameCenterAvailable) return; 

     NSLog(@"GameCenter authenticating local user..."); 
     if ([GKLocalPlayer localPlayer].authenticated == NO) {  
      [[GKLocalPlayer localPlayer] 
      authenticateWithCompletionHandler:nil];   
     } else { 
      NSLog(@"GameCenter already authenticated!"); 
     } 
    } 
+0

謝謝!唯一不同的是我看到的是單身的部分,但我一定會試一試。 – user1281726 2012-04-06 06:12:09