IBM Worklight 5.0.6.1 - 关闭电话/应用程序时未收到推送通知

Posted

技术标签:

【中文标题】IBM Worklight 5.0.6.1 - 关闭电话/应用程序时未收到推送通知【英文标题】:IBM Worklight 5.0.6.1 - Not getting Push Notifications when phone/app is closed 【发布时间】:2013-07-10 21:38:10 【问题描述】:

我有一个 Worklight 混合应用程序,其中包含在 android 中运行的基本推送通知。如果应用程序正在运行并且在推送通知时处于焦点状态,那么它的行为与我预期的完全一样。我的应用程序中的通知回调被调用,它会弹出一个 SimpleDialog。 一切都好

如果我通过单击主页按钮关闭应用程序,并且有新消息到达,我会在 Android 通知区域中看到通知,当我单击 Android 通知列表中的项目时,该项目会从列表(但应用程序不会重新成为焦点)如果我随后从“应用程序”菜单启动我的应用程序,它就位于我离开它的位置并且 SimpleDialog 正在显示。 (我的通知处理程序被调用)大部分都很好,但是当我在 android 通知列表中选择通知时,我希望该应用程序能够成为焦点。

如果我通过单击后退按钮关闭应用程序,并且收到一条新消息,我会在 Android 通知区域中看到通知,当我单击 Android 通知列表中的项目时,该项目会从列表(但应用程序没有重新成为焦点)如果我随后从“应用程序”菜单启动我的应用程序,它会重新启动应用程序(我必须再次登录)并且我的通知处理程序永远不会被调用。 不太好

如果我在发送通知时强行停止应用程序或关闭手机(但保留订阅),则通知永远不会显示在手机上。当我重新启动手机时,我在 Android 通知区域中看不到它,并且当我启动应用程序时,我的应用程序中的通知处理程序永远不会被调用。 非常糟糕

这是预期的行为吗?

我正在使用 Worklight 5.0.6.1,并且我在平台 4.2.2 的 Android 模拟器和平台 4.1.2 的物理手机上看到了这种行为

EDT:添加代码。

适配器:

WL.Server.createEventSource(
    name : "MyPushEventSource",
    securityTest: "MyApp-strong-mobile-securityTest"
);

function submitNotification(userId) 

    var userSubscription = WL.Server.getUserNotificationSubscription(
            'MyPushNotification.MyPushEventSource', userId);

    if (userSubscription == null) 
        return 
            result : "No subscription found for user :: " + userId
        ;
    

    var notification = WL.Server
            .createDefaultNotification("There's work to be done!", 1, );

    WL.Server.notifyAllDevices(userSubscription, notification);

    return 
        result : "Notification sent to user :: " + userId
    ;

在应用程序中:

WL.Client.Push.onReadyToSubscribe = function() 

    var pushSubscribe_Success_Callback = function(response) 
        WL.Logger.debug("Enter: pushSubscribe_Success_Callback");
    ;

    var pushSubscribe_Fail_Callback = function(response) 
        WL.Logger.debug("Enter: pushSubscribe_Fail_Callback");
    ;

    var pushNotificationReceived = function(props, payload) 

        WL.SimpleDialog.show("Notification", props.alert, [
                 text : "OK" ]);
    ;

    WL.Client.Push.registerEventSourceCallback("myPush",
            "MyPushNotification", "MyPushEventSource",
            pushNotificationReceived);

    if (!WL.Client.Push.isSubscribed("myPush")) 

        WL.Client.Push.subscribe("myPush", 
            onSuccess : pushSubscribe_Success_Callback,
            onFailure : pushSubscribe_Fail_Callback
        );
    
 ;

正如我所说,如果应用程序处于焦点位置,这一切都可以顺利进行,所以我知道我的 Google 消息传递帐户和密钥设置正确。但是由于某种原因,如果在发布通知时应用程序没有处于焦点位置,我会看到意想不到的结果。

【问题讨论】:

"这是预期的行为吗?" ——当然是“强制停止”部分。 我不这么认为。我试过这个。见下文。也许是“强制关闭”部分,但在设备断电时它工作正常。 看起来通知代码实际上工作正常,(相同的代码在一个简单的应用程序中表现完美)但我的应用程序中还有其他事情导致我看到的行为.我需要做更多的研究来确定它,但基本的推送通知行为不是问题。 【参考方案1】:

好的。我花了足够长的时间才弄清楚这一点,所以万一有人跟着,问题就来了:

我已通过打开 [android project]/res/values/strings.xml 并更改 app_name 的值来重命名应用程序。

That causes the app to not launch when a push notification for the app is selected.

我通过将 app_name 改回其原始值并添加一个名为 app_label 的新字符串作为友好名称来解决此问题。然后我进入 AndroidManifest.xml,并将 android:label="@string/app_name" 的 2 个实例更改为: android:label="@string/app_label" 和 sha-zam!我的应用有一个友好的名称,点击通知就会启动它。

为了更好地衡量,我将 strings.xml 中的 push_notification_title 修改为友好名称,这改善了通知的显示并且没有中断应用程序的启动。

【讨论】:

您的意思是显示在设备中应用图标下方的应用名称吗?这在属性 displayName 属性 AFAIK 中的 application-descriptor.xml 中处理... 就是这个。默认情况下,它指向@string/app_name。互联网上的一些人建议更改 strings.xml 中的值,而不是硬编码 Manifest 中的值。无论哪种方式都有效,但是在 strings.xml 中更改它会导致中断接收到的通知与应用程序之间的连接。 最好使用 application-descriptor.xml 的 displayName 属性,而不是编辑 AndroidManifest.xml,但不管怎样都适合你。 有趣。如果在编辑应用程序描述符时 Android 环境已存在,则更改 application-descriptor.xml 中的显示名称不会影响应用程序在 Android 上的显示名称。另外,如果您将 displayName 编辑为带有嵌入空格的名称,然后添加 Android 环境,它确实影响 Android 设备上的显示名称,但原来的问题(点击通知不启动应用程序)回来。为了通知启动应用程序,strings.xml 中的 app_name(应用程序描述符中的 displayName)必须没有嵌入空格。【参考方案2】:

所有四种情况都按预期对我有用。 使用 Worklight v5.0.6.1 和 the accompaning PushNotifications project 测试。

使用 GCM 密钥和 GCM ID 设置项目后,部署适配器和应用程序并在运行 Android 4.2.2 的 Galaxy S4 上启动应用程序:

    我已登录、订阅并发送通知 我已登录、订阅、点击主页按钮将应用发送到后台并发送通知 我已登录、订阅、点击返回按钮关闭应用并发送通知 我已登录、订阅、关闭应用、关闭设备

    当应用程序在前台时,显示收到通知的对话框 当应用程序在后台时,我在通知栏中收到了通知。点击它会将应用程序置于前台,并显示收到通知的对话框 当应用程序关闭时,我在通知栏中收到了通知。点击它启动应用程序,登录后显示收到通知的对话框 打开设备,等待它连接到网络,我在通知栏中收到了通知。点击它启动应用程序,登录后显示收到通知的对话框

如果这是您自己编写的推送通知应用程序,我建议您检查您的代码。您可以使用示例应用作为指导。

【讨论】:

我将上面的代码逐字放入一个简单的新应用程序中,突然它工作正常了。所以我的问题一定在应用的其他地方(这是一个相当复杂的应用) 很高兴听到问题不在推送通知中。 :-) 如果已回答此特定问题,请将其标记为已回答。如果您对应用程序的其他部分还有其他问题,请打开一个新问题。谢谢。

以上是关于IBM Worklight 5.0.6.1 - 关闭电话/应用程序时未收到推送通知的主要内容,如果未能解决你的问题,请参考以下文章

IBM Worklight 5.0.6.1 - iOS 7 中的底部空白

IBM Worklight 5.0.6.1 - Android 通知未到达设备或模拟器

IBM Worklight 5.0.6.1 - 安装 5.0.6.1 修订包后,Studio 版本为 v6.0 而不是 v5.0.6.1

IBM Worklight 5.0.6.1 - 关闭电话/应用程序时未收到推送通知

IBM Worklight 5.0.6.1 - 移动浏览器模拟器 - 用于 navigator.network.connection.type 与 navigator.connection.type

IBM Worklight 6.0.0.1 - 将适配器部署到服务器时出错