我们正在使用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>
答案 0 :(得分:0)
看起来我已经开始工作了 (大多数情况。如果应用未运行且用户刷掉通知,或直接从启动器打开应用,则通知仍然不会显示在应用中。)< / p>
有两件事需要做:
WL.Client.Push.onMessage
的作业必须在任何功能之外完成#34; native/res/values/strings.xml
中用于从推送服务中找到应用程序并确保消息通过第二点对我来说仍然没有意义,但看起来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>