Mobilefirst PushNotification:在服务器上使用 wl_anonymousUserRealm 时,应用程序不会在单击通知时调用 onReceive 方法

Mobilefirst PushNotification: On using wl_anonymousUserRealm at server, app is not calling onReceive method on clicking notification

我正在开发 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);
        }

执行此侦听器后,我将调用订阅方法。订阅推送成功。

在服务器端,我调用程序发送推送通知,它到达 phone。

现在,当我的应用进入后台时,我会收到一条通知。我点击了通知,应用重启,没有调用注册接口的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 我遇到了这个问题。

每次应用程序连接到服务器时都会调用 onReadyToSubscribe() 方法(即使已经订阅了推送),这是设计使然。

onReadyToSubscribe() 是在客户端触发的回调,表示客户端和服务器之间的令牌交换已完成。这是必需的,因为调解器向应用程序颁发的令牌可能会更改。这使得服务器必须始终使用最新的令牌保持更新。否则,推送通知将因无效令牌错误而失败。

当客户端连接到服务器时,它们比较令牌 - 客户端提供它现在拥有的令牌,服务器提供它存储的内容。三种情况发生:

1) 在新注册中,服务器没有令牌。这里客户端传递它从中介那里得到的东西,服务器持久化它并发出成功。客户端触发 onReadyToSubscribe() 回调以指示推送握手已完成,客户端现在可以订阅别名或标签。

2) 客户端已收到来自中介的新令牌。这与已有的一台服务器不匹配。客户端将新令牌传递给服务器,服务器使用新令牌更新其记录并让客户端知道。 onReadyToSubscribe() 回调在客户端触发,表明握手成功。较早的订阅记录保留。

3)如果令牌匹配,则 onReadyToSubscribe() 触发,表示推送握手已完成(无需更改)

感谢 Vivin 的建议。 这是 MFP 在 7.1 版安全测试中提供的示例代码中的问题具有用户身份领域,但在我的情况下,我没有使用自定义用户身份领域,而是使用默认 wl_anonymousUserRealm。

实际问题是 wl_anonymousUserRealm 每次都会生成一个新的随机用户 ID。因此,每当我的应用程序重新启动时,我的用户 ID 都会更改,并且我不会在 onrecieve 中收到推送,因为它认为其他用户已登录到该应用程序..

现在因为我无法更改 wl_anonymousUserRealm 我正在使用 deviceid 发送推送。请检查下面的link(适配器代码如下)。 https://www.ibm.com/support/knowledgecenter/SSHS8R_7.1.0/com.ibm.worklight.apiref.doc/html/refjavascript-server/html/WL.Server.html#sendMessage

检查下面的示例客户端代码 link。 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/