worklight中的推送通知,如何检索userId?

Posted

技术标签:

【中文标题】worklight中的推送通知,如何检索userId?【英文标题】:push notification in worklight, how to retrieve userId? 【发布时间】:2014-12-05 13:01:40 【问题描述】:

我正在尝试使用 Worklight 为 androidios 设置推送通知。

到目前为止,我已经成功设置了 Google GCM(订阅推送似乎成功),并且我使用了 IBM Worklight Getting Started page 中的示例作为主要参考。

在适配器中,sendNotification 方法需要userId,但我不知道如何检索它。在示例中,它作为参数传递给 jar,但对我来说这似乎不是一个可行的解决方案,因为我需要一个具有多个用户的真实应用程序。

我知道关于 Stack Overflow 的讨论:

userID in getUserNotificationSubscription WORKLIGHT Pushnotification Worklight: Push notification without User ID

但他们仍然没有回答我的疑问...在众多尝试之一中,我尝试在客户端上调用 WL.Client.getUserName(),但它返回 null

据我了解,这与 Worklight 的安全(和领域)设置有关,但我怀疑我并没有真正理解用户 ID 的概念。鉴于我对移动开发真的很陌生(因此很多概念对我来说都是新的,我可能说错了),我的疑问是:

    Worklight 是否存储了不同于 android 用户 ID 的用户 ID(作为抽象)? 如果是,这就是有时提到安全/领域的原因吗?如何将这两个用户 ID(android/worklight)配对,或者至少与 worklight 用户合作? 既然这似乎是一个常见的问题(将通知推送给不同的用户),是否可能没有在线示例代码? 根据用户 ID,应该遵循哪一个流程/架构? EG:用户 id 需要存储到一个领域,这个领域作为关于 x 的信息并且应该是 y 类型,它将用于 z 等......(我仍然必须弄清楚如何处理领域)

我的 authenticationConfig.xml 如下所示:

 <staticResources>
    <resource id="subscribeServlet" securityTest="SubscribeServlet">
        <urlPatterns>/subscribeSMS*;/receiveSMS*;/ussd*</urlPatterns>
    </resource>

</staticResources> 

 <securityTests>

    <!-- Added for pushing -->   
    <mobileSecurityTest name="PushApplication-strong-mobile-securityTest">
        <testUser realm="PushAppRealm"/>
        <testDeviceId provisioningType="none"/>
    </mobileSecurityTest>

    <customSecurityTest name="SubscribeServlet">
        <test realm="SubscribeServlet" isInternalUserID="true"/>
    </customSecurityTest>           

</securityTests> 

<realms>
    <realm name="SampleAppRealm" loginModule="StrongDummy">
        <className>com.worklight.core.auth.ext.FormBasedAuthenticator</className>
    </realm>

    <realm name="SubscribeServlet" loginModule="rejectAll">
        <className>com.worklight.core.auth.ext.HeaderAuthenticator</className>          
    </realm>

    <!-- Added for pushing -->   
    <realm loginModule="PushAppLoginModule" name="PushAppRealm">
        <className>com.worklight.core.auth.ext.FormBasedAuthenticator</className>
    </realm>

</realms>

<loginModules>

    <!-- Added for pushing -->   
    <loginModule name="PushAppLoginModule">
        <className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>
    </loginModule>

    <loginModule name="StrongDummy">
        <className>com.worklight.core.auth.ext.NonValidatingLoginModule</className>
    </loginModule>

    <loginModule name="requireLogin">
        <className>com.worklight.core.auth.ext.SingleIdentityLoginModule</className>
    </loginModule>

    <loginModule name="rejectAll">
        <className>com.worklight.core.auth.ext.RejectingLoginModule</className>
    </loginModule>

</loginModules>

这个是适配器(deviceSubscribeFunc 从未被调用,我希望相反):

WL.Server.createEventSource(
        name: 'PushEventSource',
        onDeviceSubscribe: 'deviceSubscribeFunc',
        onDeviceUnsubscribe: 'deviceUnsubscribeFunc',
        securityTest:'PushApplication-strong-mobile-securityTest'
);

// NEVER CALLED!
function deviceSubscribeFunc(userSubscription, deviceSubscription)
    WL.Logger.error(">> deviceSubscribeFunc"); // error is shown on the console, debug not
    WL.Logger.debug(userSubscription);
    WL.Logger.debug(deviceSubscription);


function deviceUnsubscribeFunc(userSubscription, deviceSubscription)
    WL.Logger.error(">> deviceUnsubscribeFunc"); // error is shown on the console
    WL.Logger.debug(userSubscription);
    WL.Logger.debug(deviceSubscription);


function testCall(message) 
    WL.Logger.error("Client says: " + message); // error is shown on the console, debug not
    return  response : "hello client!" ;


function submitNotification(userId, notificationText)

    var userSubscription = WL.Server.getUserNotificationSubscription('NotificationManager.PushEventSource', userId);

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

    var badgeDigit = 1;
    var notification = WL.Server.createDefaultNotification(notificationText, badgeDigit, custom:"data");

    WL.Logger.debug("submitNotification >> userId :: " + userId + ", text :: " + notificationText);

    WL.Server.notifyAllDevices(userSubscription, notification);

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

同时客户端以这种方式订阅推送(toUI 是一个简单的方法,将字符串放入 UI 中的新 div 中):

        var pushNotificationReceived = function(props, payload) 
            toUI("pushNotificationReceived invoked");
            toUI("props :: " + JSON.stringify(props));
            toUI("payload :: " + JSON.stringify(payload));
        

        if(WL.Client.Push) 
            var isSubscribed = WL.Client.Push.isSubscribed('myPush');
            toUI("User is " + (isSubscribed? "" : "<u>not</u>")+ " subscribed.", confStyle);
            WL.Client.Push.onReadyToSubscribe = function() 
                toUI("Ready to subscribe, subscribing...", confStyle);
                WL.Client.Push.registerEventSourceCallback("myPush", "NotificationManager", "PushEventSource", pushNotificationReceived);
            
         else
            toUI("Push not available.", errStyle);

【问题讨论】:

【参考方案1】:

UserId 应该由触发推送通知的实体提供,例如你的后端。你如何验证你的用户?你有某种用户存储库吗?这是您保存用户 ID 的地方。一旦发生某些事件,您的后端将决定发送推送通知。想象一个银行应用程序。 User123 已登录。在登录期间,WL 服务器联系了后端,该后端验证了 User123 存在于用户存储库中并提供了密码匹配。登录后,User123 订阅推送通知。那周晚些时候,一个使用 User123 的真人去 ATM 取款 10 美元。此事件由银行后端处理。银行后端看到提款的账户与移动用户 123 相关联。因此它告诉 WL 服务器向 User123 发送推送通知。

请注意,您不必将推送通知基于用户身份。您还可以在用户订阅特定标签的情况下使用基于标签的通知,您可以向订阅该标签的所有用户发送通知 (http://www-01.ibm.com/support/knowledgecenter/SSZH4A_6.2.0/com.ibm.worklight.dev.doc/devref/t_tag-based_notifications_setting_up.html)

【讨论】:

嗨 Anton,我修改了我的问题,添加了源代码。 PushApplication-strong-mobile-securityTest 是您对用户进行身份验证的意思吗(抱歉这个愚蠢的问题)?我没有存储任何信息,作为第一个目标,我想让用户请求订阅,然后服务器立即向他推送一些东西,我认为这并不难......我理解你提供的例子,但是我不知道如何检索用户数据(尤其是将来要重用的用户 ID)! :// 也许您应该阅读安全和身份验证培训模块,而不是深入研究推送通知,通过这些模块您将了解 Worklight 中身份验证的基础知识。这将帮助您在应用程序实现中使用这些概念,包括推送。 嗨@idan-adar,我阅读了您建议的文档。由于在 createEventSource 中我指向“PushApplication-strong-mobile-securityTest”(指向 PushAppRealm),因此缺少的步骤是使用 PushAppRealm 在 UI 中进行身份验证(此时我得到了一个非验证登录模块)。如果我设法做到这一点,那么 Worklight 将能够发送通知,因为用户是 PushAppRealm 中指定的用户(适配器和客户端都使用它),对吗?关键应该是让客户端和事件源在同一个领域。

以上是关于worklight中的推送通知,如何检索userId?的主要内容,如果未能解决你的问题,请参考以下文章

Worklight 6.1 中的默认推送通知声音

IBM Worklight:推送通知行为

多用户的 Worklight 推送通知

IBM Worklight 5.0.5:通过操作系统的通知句柄控制 Worklight 推送通知订阅/取消订阅

IBM Worklight - 仅向订阅用户推送通知

IBM Worklight - 可靠的推送通知