选项卡推送通知 cocos2d 游戏崩溃

Posted

技术标签:

【中文标题】选项卡推送通知 cocos2d 游戏崩溃【英文标题】:tab the push notification cocos2d game is crash 【发布时间】:2012-09-01 10:41:26 【问题描述】:

我正在开发一款 box2d 游戏。在游戏中我使用的是 PushWoosh 推送通知。它工作正常(从 PushWoosh 服务器获取推送通知),但是当我点击推送通知时,我的游戏崩溃了。在 Appdelegate 中这样实现

-在 Appdelegate.h 中:

    @interface AppDelegate:NSObject<UIApplicationDelegate,AdColonyDelegate,PushNotificationDelegate,UIAlertViewDelegate>
        UIWindow            *window;
        RootViewController  *viewController;
        PushNotificationManager *pushManager;
    
    @property (nonatomic, retain) PushNotificationManager *pushManager;
    @property (nonatomic, retain) UIWindow *window;
    @property (nonatomic, retain) RootViewController    *viewController;
    @end



    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
        // Init the window
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];


    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationType)(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];   

    //initialize push manager instance
    pushManager = [[PushNotificationManager alloc] initWithApplicationCode:@"PushWoosh App_ID" appName:@"App_Name" ];
     pushManager.delegate = self;
     [pushManager handlePushReceived:launchOptions];
    /*pushManager = [[PushNotificationManager alloc] initWithApplicationCode:@"FA7CF-665BF" navController:self.viewController appName:@"Cricket" ];
    pushManager.delegate = self;
    [pushManager handlePushReceived:launchOptions];*/

    // Try to use CADisplayLink director
    // if it fails (SDK < 3.1) use the default director
    if( ! [CCDirector setDirectorType:kCCDirectorTypeDisplayLink] )
        [CCDirector setDirectorType:kCCDirectorTypeDefault];


    CCDirector *director = [CCDirector sharedDirector];

    // Init the View Controller
    viewController = [[RootViewController alloc] initWithNibName:nil bundle:nil];
    viewController.wantsFullScreenLayout = YES;

    //
    // Create the EAGLView manually
    //  1. Create a RGB565 format. Alternative: RGBA8
    //  2. depth format of 0 bit. Use 16 or 24 bit for 3d effects, like CCPageTurnTransition
    //
    //
    EAGLView *glView = [EAGLView viewWithFrame:[window bounds]
                                   pixelFormat:kEAGLColorFormatRGB565   // kEAGLColorFormatRGBA8
                                   depthFormat:0                        // GL_DEPTH_COMPONENT16_OES
                        ];

    // attach the openglView to the director
    [director setOpenGLView:glView];

    // Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices
    if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad)
    
        if( ! [director enableRetinaDisplay:YES] )
            CCLOG(@"Retina Display Not supported");
    

    //
    // VERY IMPORTANT:
    // If the rotation is going to be controlled by a UIViewController
    // then the device orientation should be "Portrait".
    //
    // IMPORTANT:
    // By default, this template only supports Landscape orientations.
    // Edit the RootViewController.m file to edit the supported orientations.
    //
#if GAME_AUTOROTATION == kGameAutorotationUIViewController
    [director setDeviceOrientation:kCCDeviceOrientationPortrait];
#else
    [director setDeviceOrientation:kCCDeviceOrientationLandscapeRight];
#endif

    [director setAnimationInterval:1.0/60];
    [director setDisplayFPS:YES];


    // make the OpenGLView a child of the view controller
    [viewController setView:glView];

    // make the View Controller a child of the main window
    [window addSubview: viewController.view];

    [window makeKeyAndVisible];

    // Default texture format for PNG/BMP/TIFF/JPEG/GIF images
    // It can be RGBA8888, RGBA4444, RGB5_A1, RGB565
    // You can change anytime.
    [CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];


    // Removes the startup flicker
    [self removeStartupFlicker];    


    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if(![defaults integerForKey:@"First"]) 

        [[CCDirector sharedDirector]runWithScene:[MainMenu scene]];
    
    else 

        [[CCDirector sharedDirector]runWithScene:[PlayAsGuestScene scene]];
    


    return YES;


    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

         [pushManager handlePushReceived:userInfo];

   - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
    [pushManager handlePushRegistration:deviceToken];

    //you might want to send it to your backend if you use remote integration
    NSString *token = [pushManager getPushToken];

在控制台中我收到此错误: * 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[AppDelegate onPushAccepted:]: unrecognized selector sent to instance 0xf50d290'

为什么会这样?

【问题讨论】:

哦,常见的,给我们更多代码,当它崩溃时?您是否尝试设置异常断点?给我们更多信息... 【参考方案1】:

我终于明白了。我改为

-(void)applicationDidFinishLaunching:(UIApplication*)application

  pushManager = [[PushNotificationManager alloc] initWithApplicationCode:@"PushWoosh App_ID" appName:@"App_Name" ];
     pushManager.delegate = self;



-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

         //write own code

我的应用程序运行正常。

【讨论】:

以上是关于选项卡推送通知 cocos2d 游戏崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Cocos2d FCM 推送通知不起作用

收到推送通知且未调用 CGM 意图服务时应用程序崩溃

如何在通知选项卡中单击推送通知消息打开特定片段?

IBM Bluemix 中的推送通知注册选项卡位置

在 AppDelegate iOS 中单击 FCM 推送通知时导航到特定选项卡 - Swift

单击推送通知时,正确重定向到选项卡栏导航控制器内的视图控制器