Mobilefirst PushNotification:在服务器上使用 wl_anonymousUserRealm 时,应用程序未在单击通知时调用 onReceive 方法
Posted
技术标签:
【中文标题】Mobilefirst PushNotification:在服务器上使用 wl_anonymousUserRealm 时,应用程序未在单击通知时调用 onReceive 方法【英文标题】:Mobilefirst PushNotification: On using wl_anonymousUserRealm at server, app is not calling onReceive method on clicking notification 【发布时间】:2016-09-29 13:02:23 【问题描述】:我正在开发 IBM Mobilefirst 本机 android 应用程序。我已经编写了启用推送通知的代码。我收到通知,但这里有问题。
在启动应用程序时,我正在调用以下代码。
final WLClient client = WLClient.getInstance();
push = client.getPush();
ResponseListener listener = new ResponseListener(ResponseListener.AUTHENTICITY_CONNECT);
client.getPush().setOnReadyToSubscribeListener(listener);
challengeHandler = new AndroidChallengeHandler(realm);
client.registerChallengeHandler(challengeHandler);
WLRequestOptions options=new WLRequestOptions();
options.setAppUserId("sample");
client.connect(listener,options);
当我第一次启动应用程序时,上面的所有代码都会被执行,并且监听器会调用下面的方法
@Override
public void onReadyToSubscribe()
WLClient.getInstance().getPush().registerEventSourceCallback(pushAliasName, "PushAdapter","PushEventSource", this);
在这个监听器被执行后,我正在调用 subscribe 方法。订阅推送成功。
在服务器端,我调用了发送推送通知的过程,它到达了手机。
现在,当我的应用程序进入后台并收到通知时。我点击通知,应用重启,从不调用注册接口的onRecieve方法。
点击通知后,它会重新启动应用程序并再次调用 onReadyToSubscribe(),它从不调用 onRecieve 方法。我应该怎么做才能在点击通知时调用 onReceive() 方法并且应用程序不应该重新启动(如果应用程序已经在后台)?
我的服务器端安全测试如下
<customSecurityTest name="AuthSecurityTest">
<test realm="wl_antiXSRFRealm" step="1"/>
<test realm="wl_authenticityRealm" step="1"/>
<test realm="wl_remoteDisableRealm" step="1"/>
<test realm="wl_anonymousUserRealm" isInternalUserID="true" step="1"/>
<test realm="wl_deviceAutoProvisioningRealm" step="2" isInternalDeviceID="true"/>
</customSecurityTest>
用户身份未绑定到安全测试,但我将其放入应用程序应用程序描述符中。所以它永远不会在连接时要求质询处理程序所需的凭据。
我认为这可能是 MFP 在 7.1 版本安全测试中提供的示例代码中的问题,该示例代码具有用户身份领域,但在我的情况下,我没有使用自定义用户身份领域,但我使用的是默认 wl_anonymousUserRealm .这是问题所在,因为当我尝试使用示例代码时,它在所有场景中都可以正常工作。但是使用 wl_anonymousUserRealm 我有这个问题。
【问题讨论】:
应用程序被杀死或关闭?如果您杀死该应用程序,它将退出推送服务,如果您关闭该应用程序,该服务将继续监听。您究竟是如何关闭应用程序的? 我可能会单击我的应用程序中的按钮,这可能会关闭应用程序,或者我转到手机的后台并清除可能会杀死应用程序的应用程序。在这两种情况下,我都会收到推送通知。但是点击通知时不会调用我的 onRecieve 方法.. 点击通知应用程序正在重新启动。我该如何阻止它。 这里我认为这可能是 MFP 在 7.1 版本安全测试中提供的示例代码中的问题,它具有用户身份领域,但在我的情况下,我没有使用自定义用户身份领域,但我正在使用默认 wl_anonymousUserRealm。这是问题所在,因为当我尝试使用示例代码时,它在所有场景中都可以正常工作。但是使用 wl_anonymousUserRealm 我有这个问题。 【参考方案1】:onReadyToSubscribe() 方法在每次应用程序连接到服务器时被调用(即使已经订阅了推送)是预期和设计的。
onReadyToSubscribe() 是在客户端触发的回调,表示客户端和服务器之间的令牌交换已完成。这是必需的,因为中介者向应用程序颁发的令牌可能会更改。这使得服务器必须始终使用最新的令牌保持更新。如果没有,推送通知将失败并出现无效令牌错误。
当客户端连接到服务器时,它们会比较令牌 - 客户端显示它现在拥有的令牌,服务器显示它存储的内容。三种情况发生:
1) 在新注册中,服务器没有令牌。在这里,客户端传递它从中介者那里得到的东西,服务器将它持久化并发出成功。客户端触发 onReadyToSubscribe() 回调以指示推送握手完成,客户端现在可以订阅别名或标签。
2) 客户端收到了来自中介的新令牌。这与已经拥有的一台服务器不匹配。客户端将新令牌传递给服务器,服务器使用新令牌更新其记录并让客户端知道。 onReadyToSubscribe() 回调在客户端触发,表明握手成功。之前的订阅记录会保留。
3)如果令牌匹配,则 onReadyToSubscribe() 触发表示推送握手已完成(无需更改)
【讨论】:
感谢您的回复.. 这很好,但是发生了两件事 1)如果我点击通知,即使我的应用在后台堆栈中打开,我的应用也会重新启动 2)点击通知 onrecieve不调用消息。我错过了什么吗。 Vivin 你有没有时间来研究这个问题。如果您有一些解决方案,请分享。 @Bender,如果应用程序在后台,它应该只将其带到前台并进入 onReceive 回调。 2) onReceive 应该被调用。我会验证这一点。您正在试用的确切 MFP 版本是什么? Vivin 我使用的是 7.1 版本。我假设这可能是我的代码中的一个问题... Vivin :我认为这可能是 MFP 在 7.1 版本安全测试中提供的示例代码中的问题,它具有用户身份领域,但在我的情况下,我没有使用自定义用户身份领域,但我是使用默认 wl_anonymousUserRealm。这是问题所在,因为当我尝试使用示例代码时,它在所有场景中都可以正常工作。但是使用 wl_anonymousUserRealm 我有这个问题。【参考方案2】:感谢 Vivin 的建议。 这是 MFP 在 7.1 版本安全测试中提供的示例代码中的问题,它具有用户身份领域,但在我的情况下,我没有使用自定义用户身份领域,而是使用默认的 wl_anonymousUserRealm。
实际问题是 wl_anonymousUserRealm 每次都会生成一个新的随机用户 ID。因此,当我的应用重新启动时,我的用户 ID 会发生更改,并且我不会在 onrecieve 中推送,因为它认为其他用户已登录到该应用..
现在因为我无法更改 wl_anonymousUserRealm,所以我正在使用 deviceid 发送推送。请检查以下链接(适配器代码如下)。 https://www.ibm.com/support/knowledgecenter/SSHS8R_7.1.0/com.ibm.worklight.apiref.doc/html/refjavascript-server/html/WL.Server.html#sendMessage
从下面的链接检查示例客户端代码。 https://mobilefirstplatform.ibmcloud.com/tutorials/en/foundation/7.1/notifications/push-notifications-overview/push-notifications-native-android-applications/tag-based-notifications-in-native-android-applications/
【讨论】:
以上是关于Mobilefirst PushNotification:在服务器上使用 wl_anonymousUserRealm 时,应用程序未在单击通知时调用 onReceive 方法的主要内容,如果未能解决你的问题,请参考以下文章
MobileFirst Platform Studio 6.3.0 - 将 mobilefirst 应用程序部署到开发服务器期间出错
MobileFirst 适配器 - 为啥我在 MobileFirst 操作控制台的 Swagger 文档页面上发出请求时收到“401 Unauthorized”错误