冷启动后检测cordova app中的推送通知事件(来自通知点击)

时间:2017-08-18 17:56:17

标签: ios cordova push-notification pushwoosh

我的推送通知包含自定义数据,可帮助您在点击通知时将应用路由到正确的位置。如果应用程序处于打开状态或在后台运行,这些工作正常,但在应用程序关闭时不起作用。通知打开应用程序,但我的代码没有检测到引用的通知事件,以便我可以路由它。 我在AppDelegate.m

中有这个
#ifndef DISABLE_PUSH_NOTIFICATIONS

    - (void)                                 application:(UIApplication*)application
        didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
    {
        // re-post ( broadcast )
        NSString* token = [[[[deviceToken description]
            stringByReplacingOccurrencesOfString:@"<" withString:@""]
            stringByReplacingOccurrencesOfString:@">" withString:@""]
            stringByReplacingOccurrencesOfString:@" " withString:@""];

        [[NSNotificationCenter defaultCenter] postNotificationName:CDVRemoteNotification object:token];
    }

    - (void)                                 application:(UIApplication*)application
        didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
    {
        // re-post ( broadcast )
        [[NSNotificationCenter defaultCenter] postNotificationName:CDVRemoteNotificationError object:error];
    }
#endif

我有这个JS代码来捕获我的应用程序中的通知

document.addEventListener('push-notification', function(event) {
                             //get the notification payload

                             console.log("incoming PUSH notification!")
                             console.log(event);
                             factory.reactToIncomingPushNotification(event)


                         });

我的问题是,应用程序冷启动后如何在应用程序中引用通知事件?

我有一个带有pushwoosh的cordova /离子应用程序作为提供者。我在IOS上测试。

3 个答案:

答案 0 :(得分:0)

如果应用程序终止,并且用户想要通知自定义数据,那么AppDelegate的didFinishLaunchingWithOptions就是您的方法,因为它包含名为 UIApplicationLaunchOptionsRemoteNotificationKey

的密钥中的数据

答案 1 :(得分:0)

我的答案是在pushwoosh广播事件上设置超时。在我建立我的听众之前,它正在发送广播。这只发生在冷启动应用程序上。现在,我检测推送通知是否有“开始”按钮。键设置为true。如果是这样,我在dispatchEvent函数上放置了1.3秒的超时。以下是PushNotification.js文件的修改函数。

// file: plugins/pushwoosh-cordova-plugin/www/PushNotification.js 
PushNotification.prototype.notificationCallback = function(notification) {
    var ev = document.createEvent('HTMLEvents');
    ev.notification = notification;
    // test for the cold start
    var tout = notification.onStart ? 1300 : 10 ;
    setTimeout(function() { 
        ev.initEvent('push-notification', true, true, arguments);
        document.dispatchEvent(ev);
    }, tout);
};

答案 2 :(得分:0)

我遇到了类似的问题,所以我尝试尽早将事件监听器放在Javascript中。然后我就能收到Pushwoosh的推送通知。这意味着在“推送通知”之前已经触发了DOM事件。你应用程序JS中的监听器已经安装好了。

使用setTimeout似乎通过延迟DOM事件并允许侦听器准备好来掩盖问题。

我建议尽早移动听众。

document.addEventListener('push-notification', function(event) {
    ...
})

然而,这可能不是一个想法,因为应用可能还没有准备好使用推送通知中的事件。我的解决方案是缓存事件并在我的应用程序完全启动后检查它。

希望这有帮助!