2012-10-13 38 views
26

Khi sử dụng authenticateHandler trong iOS 6, trung tâm trò chơi sẽ không hiển thị chế độ xem đăng nhập nếu người dùng hủy bỏ. Tôi nhận ra trung tâm trò chơi sẽ tự động khóa một ứng dụng sau 3 lần hủy, nhưng tôi chỉ nói về 2 lần. Nếu họ hủy đăng nhập, họ phải rời khỏi ứng dụng và quay lại trước khi trung tâm trò chơi sẽ hiển thị thông tin đăng nhập ngay cả thông qua authenticateHandler sẽ được đặt lại. Bất kỳ ý tưởng về cách xử lý trường hợp này trong iOS 6?Trung tâm trò chơi iOS 6 authenticateHandler không thể đăng nhập sau khi hủy

Nó hoạt động tốt khi sử dụng phương pháp authenticateWithCompletionHandler cũ:

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_6_0 
    GKLocalPlayer.localPlayer.authenticateHandler = authenticateLocalPlayerCompleteExtended; 
#else 
    [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:authenticateLocalPlayerComplete]; 
#endif 

Lý do này là quan trọng đối với ứng dụng của tôi là nó đòi hỏi Game Center cho đa người chơi. Ứng dụng cố gắng xác thực với trung tâm trò chơi khi khởi chạy, nhưng nếu người dùng hủy chúng tôi không yêu cầu họ khởi chạy lại để họ không bị nagged. Những gì chúng tôi làm là hiển thị nút Đăng nhập Trung tâm trò chơi nếu họ không đăng nhập khi họ chọn nhiều người chơi. Nút đăng nhập buộc đăng nhập vào trung tâm trò chơi bằng cách gọi authenticateWithCompletionHandler (và bây giờ bằng cách đặt lại GKLocalPlayer.localPlayer.authenticateHandler).

+1

Có vẻ như bạn đang thực hiện việc này, nhưng gọi [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler: nil] sẽ khiến cho authenticateHandler được gọi lại bằng trình điều khiển chế độ xem xác thực. Phương pháp này không được chấp nhận mặc dù trong iOS6. – Greg

+0

Tôi đang sử dụng cuộc gọi được khấu hao để làm việc này nhưng tôi đang tìm cách "đúng" để thực hiện việc này mà không cần sử dụng các cuộc gọi không được chấp nhận. Tôi đã thử thiết lập GKLocalPlayer.localPlayer.authenticateHandler mới thành nil và sau đó quay lại trình xử lý của tôi để xem nó có hoạt động hay không, và có một ngoại lệ cố gắng đặt nó thành không.Tôi đã không thử cài đặt nó cho một trình xử lý khác để xem điều đó có kích hoạt đăng nhập không (chỉ dường như thực sự bị hack) –

+0

Tôi đã thử chuyển trình xử lý sang trình xử lý khác và điều đó cũng không kích hoạt hộp thoại đăng nhập mới . Tôi đăng trên diễn đàn nhà phát triển để xem có ai có lời khuyên nào không và sẽ đăng lại ở đây nếu tôi nghe thấy gì. https://devforums.apple.com/message/744983 – Greg

Trả lời

2

Kiểm tra thời gian chạy sử dụng tốt hơn (instancesRespondToSelector :) thay vì các câu lệnh #process preprocessor, để bạn có thể sử dụng các phương pháp được đề xuất khi chúng sẵn có và khấu hao ở những nơi khác. Tôi thực sự thấy tôi cần phải phân biệt ba trường hợp trước khi thiết lập mời xử lý, như xử lý xác thực cũng có thể được gọi với một bộ điều khiển xem nil:

-(void)authenticateLocalPlayer 
{ 
    if ([[GKLocalPlayer class] instancesRespondToSelector:@selector(setAuthenticateHandler:)]) { 
     [[GKLocalPlayer localPlayer] setAuthenticateHandler:^(UIViewController *gameCenterLoginViewController, NSError *error) { 
      if (gameCenterLoginViewController) { 
       [self.presentedViewController presentViewController:gameCenterLoginViewController 
                  animated:YES 
                  completion:^{ 
                   [self setInviteHandlerIfAuthenticated]; 
                  }]; 
      } else { 
       [self setInviteHandlerIfAuthenticated]; 
      } 
     }]; 
    } else { // alternative for iOS < 6 
     [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) { 
      [self setInviteHandlerIfAuthenticated]; 
     }]; 
    } 
} 

Tuy nhiên, nhiều trường hợp phải được phân biệt trong xử lý mời, như matchForInvite: : cũng mới trong iOS6 và tránh một vòng khác thông qua bộ điều khiển chế độ xem trung tâm trò chơi:

-(void)setInviteHandlerIfAuthenticated 
{ 
    if ([GKLocalPlayer localPlayer].isAuthenticated) { 
     [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite) { 
      if (acceptedInvite) { 
       if ([GKMatchmaker instancesRespondToSelector:@selector(matchForInvite:completionHandler:)]) { 
        [self showInfoAnimating:YES completion:NULL]; 
        [[GKMatchmaker sharedMatchmaker] matchForInvite:acceptedInvite 
                completionHandler:^(GKMatch *match, NSError *error) { 
                 // ... handle invited match 
                }]; 
       } else { 
        // alternative for iOS < 6 
        GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite] autorelease]; 
        mmvc.matchmakerDelegate = self; 
        // ... present mmvc appropriately 
        // ... handle invited match found in delegate method matchmakerViewController:didFindMatch: 
       } 
      } else if (playersToInvite) { 
       // ... handle match initiated through game center 
      } 
     }; 
    } 
} 

Hãy cho tôi biết nếu điều này có ích.

+1

Macro tiền xử lý chỉ dành cho gỡ lỗi và hiển thị sự cố. Vấn đề tôi gặp phải là bạn không thể kích hoạt đăng nhập bằng API công cộng iOS 6 nếu người dùng hủy đăng nhập ban đầu được hiển thị bởi Trung tâm trò chơi. API pre-ios6 hỗ trợ hành vi này được đặt lại trình xử lý. –

0

Tôi không nghĩ rằng điều này là có thể trong iOS 6.0. Đã có các cuộc gọi API để thực hiện việc này trong các bản dựng SDK ban đầu đã bị xóa trước khi phát hành.

Trong WWDC 2012 Video: Session 516 - Lồng ghép trò chơi của bạn với Game Center [08:30] Họ thực sự hiển thị mã nơi bạn gọi một phương pháp authenticate:

GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer]; 
localPlayer.authenticationHandler = //handle the callback... 
[localPlayer authenticate]; 

Phương pháp này hiện nay là API riêng nhưng bạn có thể nhìn thấy nó hoạt động bằng cách gọi:

[[GKLocalPlayer localPlayer] performSelector:@selector(_authenticate)]; 

Nó chính xác những gì bạn muốn, nhưng không thể sử dụng được vì giờ đây là riêng tư.


Bạn cũng có thể kích hoạt quá trình xác thực bằng cách đăng thông báo UIApplicationWillEnterForegroundNotification:

[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication]]; 

tôi giả sử nó sẽ là unadvisable để làm điều này trong mã sống.

Các vấn đề liên quan