如果在观看游戏中心屏幕(排行榜,成就)时在iOS7中背景cocos2d 2.1应用程序崩溃

Jon*_*nny 8 cocos2d-iphone ios game-center ios7

我在这里有100%可重现的崩溃.

如果在观看游戏中心屏幕(排行榜,成就)时在iOS7中背景cocos2d 2.1应用程序崩溃.按下主页按钮时会立即崩溃.

在CCGLView.m的第275行崩溃:

if(![_context presentRenderbuffer:GL_RENDERBUFFER])
Run Code Online (Sandbox Code Playgroud)

令人痒的是,我下载了官方cocos2diphone 2.1的新副本,另外一个,安装了它的模板并运行了主要应用程序,之后将它连接到与已经有游戏中心排行榜等设置的有问题的应用程序相同的应用程序ID.它没有崩溃.所以我在lib里面的cocos2d文件夹上运行了一个diff,除了我在CCDrawingPrimitives.h/m中添加了一些C函数代码之外没有区别......应该不是问题.所以问题不应该在cocos2d本身,但不知何故,使用它或我的项目设置会导致它.

更新:

问题似乎是在2.1和之前使用的cocos2d app模板中.它看起来像这样:

-(void) applicationDidEnterBackground:(UIApplication*)application
{
    if( [navController_ visibleViewController] == director_ )
        [director_ stopAnimation];
}
Run Code Online (Sandbox Code Playgroud)

这里明显的错误是如果你有navController打开一个Game Center控制器,那么当按下home按钮时,director_的visibleViewController将是GC控制器,因此不会调用stopAnimation.这导致iOS7崩溃,但似乎没有iOS6 ...也没有模板cocos2d 2.1应用程序(仍然在这里混淆).

当前的修复是注释掉if( [navController_ visibleViewController] == director_ ),以便始终调用stopAnimation.不确定是否有任何副作用,但现在将继续这样做.

zer*_*liu 4

好决定。我遇到了与您相同的问题,您的帖子帮助我弄清楚了我的应用程序是如何崩溃的。

所以我的解决方案是在显示游戏中心之前停止导演动画。

[[CCDirector sharedDirector] stopAnimation]
[[CCDirector sharedDirector] presentViewController:gcViewController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

然后在游戏中心视图中重新启动动画dismiss回调

- (void) gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController
{
    [[CCDirector sharedDirector] dismissViewControllerAnimated:YES completion:nil];
    [[CCDirector sharedDirector] startAnimation];
}
Run Code Online (Sandbox Code Playgroud)

您更新的解决方案应该有效,但这里也一样,我不确定是否会有任何副作用。我认为围绕游戏中心本身是一种更安全的方法。

再次感谢您提出这个问题!