【问题标题】:Game Center iOS 7 not working游戏中心 iOS 7 不工作
【发布时间】:2014-03-11 18:50:11
【问题描述】:

按照 Ray Wenderlich 教程使用 iOS 7 实现游戏中心

http://www.raywenderlich.com/3276/game-center-tutorial-for-ios-how-to-make-a-simple-multiplayer-game-part-12

但是我没有收到登录提示,也没有出现欢迎返回横幅,尝试了许多教程,似乎无法让它与 iOS 7 一起使用。

这是我的代码

GCHelper.h

#import <Foundation/Foundation.h>
#import <GameKit/GameKit.h>

@interface GCHelper : NSObject {
    BOOL gameCenterAvailable;
    BOOL userAuthenticated;
}

@property (assign, readonly) BOOL gameCenterAvailable;

+ (GCHelper *)sharedInstance;
- (void)authenticateLocalUser;

@end

GCHelper.m

#import "GCHelper.h"

@implementation GCHelper

@synthesize gameCenterAvailable;

#pragma mark Initialization

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

- (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);
}

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

- (void)authenticationChanged {

    if ([GKLocalPlayer localPlayer].isAuthenticated && !userAuthenticated) {
        NSLog(@"Authentication changed: player authenticated.");
        userAuthenticated = TRUE;
    } else if (![GKLocalPlayer localPlayer].isAuthenticated && userAuthenticated) {
        NSLog(@"Authentication changed: player not authenticated");
        userAuthenticated = FALSE;
    }

}

#pragma mark User functions

- (void)authenticateLocalUser {

    if (!gameCenterAvailable) return;

    NSLog(@"Authenticating local user...");
    if ([GKLocalPlayer localPlayer].authenticated == NO) {
        [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:nil];
    } else {
        NSLog(@"Already authenticated!");
    }
}

@end

并且在我的应用程序中确实完成了我的启动方法

[[GCHelper sharedInstance] authenticateLocalUser];

是因为我的authenticateWithCompletionHandler 被弃用了吗?

【问题讨论】:

  • @sami- 输入你的验证码
  • @VivekSehrawat 我已经添加了我的代码
  • @Sami- 你见过苹果 GKTapper 的示例代码吗...?
  • 是的,我看过并尝试实现它,但没有运气。
  • @sami- 你试过我的答案吗

标签: ios ios7 game-center leaderboard


【解决方案1】:

#import "GameCenterManager.h" 来自苹果示例代码。将您的项目目标设置为 iOS 6.0 将代码放入 viewdidload 即可正常工作

   @property (nonatomic, retain) GameCenterManager *gameCenterManager;

    if([GameCenterManager isGameCenterAvailable])
      {
        self.gameCenterManager= [[GameCenterManager alloc] init];
            [self.gameCenterManager setDelegate: self];
        [self.gameCenterManager authenticateLocalUser];
        }

【讨论】:

【解决方案2】:

这是我使用 iOS7 显示游戏中心登录的代码

gamecentercontrol.h

#import <Foundation/Foundation.h>
#import <GameKit/GameKit.h>

@interface gamecentercontrol : NSObject {

    BOOL gameCentreAvailable;
    BOOL userAuthenticated;

}

@property (assign, readonly) BOOL gameCentreAvailable;

+ (gamecentercontrol *)sharedInstance;

-(void)authenticateLocalUser;


@end

gamecentercontrol.m

#import "gamecentercontrol.h"

@interface gamecentercontrol () <GKGameCenterControllerDelegate> {

    BOOL _gameCenterFeaturesEnabled;

}
@end


@implementation gamecentercontrol

@synthesize gameCentreAvailable;

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

-(BOOL)isGameCentreAvailable {
    // 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);
}

- (id)init {
    if ((self = [super init])) {

        gameCentreAvailable = [self isGameCentreAvailable];
        if (gameCentreAvailable) {
            NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
            [nc addObserver:self selector:@selector(authenticationChanged) name:GKPlayerAuthenticationDidChangeNotificationName object:nil];
        }

    }
    return self;
}


- (void)authenticationChanged {

   if ([GKLocalPlayer localPlayer].isAuthenticated && !userAuthenticated) {
        NSLog(@"Authentication Changed. User Authenticated");
        userAuthenticated = TRUE;
    }
    else if (![GKLocalPlayer localPlayer].isAuthenticated && userAuthenticated) {

        NSLog(@"Authentication Changed. User Not Authenticated");
        userAuthenticated = FALSE;
    }

}


-(void) authenticateLocalUser {
    if ([GKLocalPlayer localPlayer].authenticated == NO) {
        GKLocalPlayer* localPlayer = [GKLocalPlayer localPlayer];

    localPlayer.authenticateHandler = ^(UIViewController *gcvc,NSError *error) {

        if(gcvc) {

            [self presentViewController:gcvc];
        }
        else {
            _gameCenterFeaturesEnabled = NO;
        }
    };
    }

    else if ([GKLocalPlayer localPlayer].authenticated == YES){
        _gameCenterFeaturesEnabled = YES;
    }

}

-(UIViewController*) getRootViewController {
    return [UIApplication sharedApplication].keyWindow.rootViewController;
}

-(void)presentViewController:(UIViewController*)gcvc {
    UIViewController* rootVC = [self getRootViewController];
    [rootVC presentViewController:gcvc animated:YES completion:nil];
}


-(void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController {


} 
@end

那就用

[[gamecentercontrol sharedInstance] authenticateLocalUser]

在您希望它完成身份验证的视图控制器文件中。

【讨论】:

    【解决方案3】:
    ///////just Update the method 
    
    - (void) authenticateLocalPlayer
    
    {
    
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    
        localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error)
    {
    
    
    viewController=[[UIViewController alloc] init];
    
             if (viewController != nil)
    
             {
    
                 //showAuthenticationDialogWhenReasonable: is an example method name. Create your own method that displays an authentication view when appropriate for your app.
    
                 [self showAuthenticationDialogWhenReasonable: viewController];
    
             }
    
             else if (localPlayer.isAuthenticated)
    
             {
    
                 //authenticatedPlayer: is an example method name. Create your own method that is called after the local player is authenticated.
    
                 [self authenticatedPlayer: localPlayer];
    
             }
    
             else
    
             {
    
                 [self disableGameCenter];
    
             }
    
         };
    
    }
    

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多