如果在使用IBM MobileFirst Platform 7.0关闭应用程序时收到了onMessage未处理的推送通知

时间:2015-10-23 15:46:00

标签: push-notification ibm-mobilefirst

我们正在使用MFP 7.0.0.00-20150907-1450并构建面向iOS和Android的混合应用 我们正在使用"send bulk messages" REST API发送广播消息。

我们已在应用中实施WL.Client.Push.onMessage,只要应用程序在收到通知时正在运行,它就会处理该消息。 如果应用程序在通知到达手机时关闭,则消息有效负载似乎无法进入我们的onMessage实施。

iOS和Android之间的行为相同。

我怀疑我们分配的onMessage功能与MFP框架尝试将消息传递到我们的应用程序之间存在时间问题。
关于如何在应用程序关闭时收到消息的处理方式的一些指示会很棒!

(以下是我们设置的一些细节。)

我们在主应用模块中使用Angular和

if (angular.isDefined(window.WL) && angular.isDefined(window.WL.Client.Push)) {
  window.WL.Client.Push.onMessage = function (props, payload) {
    console.log('Received push notification in client', JSON.stringify(props), JSON.stringify(payload));
    $rootScope.$broadcast('pushNotification', props, payload);
  };
}

onMessage的文档中注意到这一点("您必须在任何函数之外声明它。")之后,我已将该作业移到JavaScript文件的顶部,甚至在IIFE之外。这个函数似乎没有被调用,当然没有记录,变量仍未定义:

var lastPushMessage;
function pushMessageRecorder(props, payload) {
  lastPushMessage = {
    props: props,
    payload: payload
  };
  console.log('MFP: push received: ' + JSON.stringify(lastPushMessage, null, 2));
}
WL.Client.Push.onMessage = pushMessageRecorder;

我们的安全测试(用户无需登录,只需使用我们的密钥打包应用):

<customSecurityTest name="customTests">
  <test realm="wl_antiXSRFRealm" step="1" />
  <test realm="wl_authenticityRealm" step="1" />
  <test realm="wl_remoteDisableRealm" step="1" />
  <test realm="wl_directUpdateRealm" mode="perSession" step="1" />
  <test realm="wl_anonymousUserRealm" isInternalUserID="true" step="1" />
  <test realm="wl_deviceNoProvisioningRealm" isInternalDeviceID="true" step="2" />
</customSecurityTest>

1 个答案:

答案 0 :(得分:0)

看起来我已经开始工作了 (大多数情况。如果应用未运行且用户刷掉通知,或直接从启动器打开应用,则通知仍然不会显示在应用中。)< / p>

有两件事需要做:

  1. WL.Client.Push.onMessage的作业必须在任何功能之外完成#34;
  2. 它看起来像字符串&#34; app_name&#34;的值在native/res/values/strings.xml中用于从推送服务中找到应用程序并确保消息通过
  3. 第二点对我来说仍然没有意义,但看起来android:name中的intent-filter action AndroidManifest.xml值是使用以下值构建的:

    {AndroidManifest.xml:/manifest[@package]}.{res/values/strings.xml:/resources/string[@name="app_name"]}.NOTIFICATION
    

    由于app_name值用于构建通知限定符,因此它不能包含任何空格,这对于手机上显示的应用名称来说并不是那么好。

    我通过在strings.xml文件中添加另一个变量来解决这个问题(尽管我也可以在AndroidManifest.xml中对该名称进行硬编码,然后将该变量用作我的标签

    这是什么工作:

    res/values/strings.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
      <string name="app_name">MyApp</string>
      <string name="app_label">My App</string>
      <string name="push_notification_title">My App</string>
      <!-- ... -->
    </resources>
    

    AndroidManifest.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.MyProject" android:versionCode="1" android:versionName="1.0">  
        <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19"/>  
        <supports-screens android:smallScreens="false" android:normalScreens="true" android:largeScreens="false"/>  
        <uses-permission android:name="android.permission.INTERNET"/>  
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <!-- Push permissions -->  
        <permission android:name="com.MyProject.permission.C2D_MESSAGE" android:protectionLevel="signature"/>  
        <uses-permission android:name="com.MyProject.permission.C2D_MESSAGE"/>  
        <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>  
        <uses-permission android:name="android.permission.WAKE_LOCK"/>  
        <uses-permission android:name="android.permission.GET_ACCOUNTS"/>  
        <uses-permission android:name="android.permission.USE_CREDENTIALS"/>  
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
        <application android:label="@string/app_label" android:icon="@drawable/icon"> 
            <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
            <activity android:name=".MyApp" android:label="@string/app_name" android:configChanges="orientation|keyboardHidden|screenSize" android:launchMode="singleTask" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:screenOrientation="portrait" android:windowSoftInputMode="adjustPan">
                <intent-filter> 
                    <action android:name="android.intent.action.MAIN"/>  
                    <category android:name="android.intent.category.LAUNCHER"/> 
                </intent-filter>
                <intent-filter> 
                    <action android:name="com.MyProject.MyApp.NOTIFICATION"/>  
                    <category android:name="android.intent.category.DEFAULT"/> 
                </intent-filter>
            </activity>  
            <!-- Preference Activity  -->  
            <activity android:name="com.worklight.common.WLSettingActivity" android:label="Worklight Settings"/>  
            <!-- UI Activity for displaying native dialogs  -->  
            <activity android:name="com.worklight.wlclient.ui.UIActivity"/>  
            <!-- Push service  -->  
            <!-- In order to use the c2dm library, an application must declare a class with the name C2DMReceiver, in its own package, extending com.google.android.c2dm.C2DMBaseReceiver
                It must also include this section in the manifest, replacing "com.google.android.apps.chrometophone" with its package name. -->  
            <service android:name=".GCMIntentService"/>  
            <service android:name=".ForegroundService"/>  
            <!-- Only google service can send data messages for the app. If permission is not set - any other app can generate it -->  
            <receiver android:name="com.worklight.androidgap.push.WLBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND"> 
                <!-- Receive the actual message -->  
                <intent-filter> 
                    <action android:name="com.google.android.c2dm.intent.RECEIVE"/>  
                    <category android:name="com.MyProject"/>
                </intent-filter>  
                <!-- Receive the registration id -->  
                <intent-filter> 
                    <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>  
                    <category android:name="com.MyProject"/> 
                </intent-filter> 
            </receiver> 
        </application> 
    </manifest>