如何在 iOS 的 Azure 移动应用通知中心注册目标推送通知

Posted

技术标签:

【中文标题】如何在 iOS 的 Azure 移动应用通知中心注册目标推送通知【英文标题】:How to register for targeted Push Notifications in Azure Mobile App notification hub from iOS 【发布时间】:2016-05-05 12:05:45 【问题描述】:

我有一个在 Azure 移动应用服务中注册推送通知的移动应用。 在以前的版本(Azure 移动服务)中,我可以在注册时添加标签。出于安全原因,在当前的移动应用服务中删除了这种可能性。 在这个论坛的另一个帖子中,我读到我们需要创建一个自定义 API 来为目标通知添加诸如用户 ID 之类的标签。 Azure 中的文档只提到了 .NET,我需要用 javascript 来做。所以,我写了这个 API:

module.exports = 
"put": function (req, res, next) 

    var token = req.query.token;
    token = token.replace('<','');
    token = token.replace('>',''); //Removing the token enclosures
    token = token.replace(/\s+/g,''); //Removing the spaces in the token
    req.azureMobile.push.apns.createNativeRegistration(token, req.azureMobile.user.id, function(error) 
        if (error) 
            console.log("Registration unsuccessful: ", error);
            res.status(500).json( error: error );
         else 
            var result = "Registration successful"
            console.log(result);
            res.status(201).json(result: result);
        
    );


我用这个 Swift 代码从 ios 调用它:

 self.client!.push?.registerDeviceToken(deviceToken, completion: (error) in
        var results = Dictionary<String, AnyObject>()
        if error == nil 
            let param = ["token":deviceToken]
            AOAppDelegate.client!.invokeAPI("apnsRegistration", body: nil, HTTPMethod: "PUT", parameters: param, headers: nil, completion: (objects, httpResponse, error) in
                if error != nil 
                    print("Error registering for notifications: %@", error);
                
            )
         else 
            print("Error registering for notifications: %@", error);
        
    )

这个过程在我的 iPhone 上运行得非常好,但在我的 iPad 上却不行,而且这个 iPad 没有什么特别的问题,这让我觉得代码有一些缺失。 此外,如果我转到 Azure 门户中的通知中心,它注册了 0 个标签,而注册的 iPhone 应该至少有一个标签可以正常工作。 测试推送通知也只向手机发送通知,而不向 iPad 发送通知。

有什么建议吗?我的代码有意义吗?

谢谢,

【问题讨论】:

检查你的测试推送是否被广播。如果是,那就是注册的问题。看起来您正在使用移动应用 API 而不是通知中心。你也可以检查一下吗?并使用 Service Bus Explorer 检查注册和标签 感谢您的回复亚历克斯。我已经配置了一个通知中心,但我找不到任何关于如何使用来自 Javascript 的中心注册标签的文档。你知道我在哪里可以找到一些信息吗? azure 中的代码示例仅在 .NET 中。 【参考方案1】:

调用看起来不像是写的。尝试类似:

var promises = require('azure-mobile-apps/src/utilities/promises');

function createInstallation(context, installationId, pushChannel) 
    var installation = 
        installationId: installationId,
        pushChannel: pushChannel,
        platform: 'apns',
        tags: [ 'some', 'list' ]
    ;

    return promises.wrap(context.push.createOrUpdateInstallation, context.push)(installation);


module.exports = 
    post: function (req, res, next) 
        var context = req.azureMobile,
            installationId = req.get('X-ZUMO-INSTALLATION-ID'),
            pushChannel: req.body.pushChannel;

        createInstallation(context, installationId, pushChannel)
        .then((result) => 
          res.status(204).end();
        );
        .catch(next);
    

context.push 只是包装了 Notification Hubs SDK,因此您可以从那里使用任何东西。

【讨论】:

谢谢阿德里安。 req.body.pushChannel 假设我需要在请求正文中发送 pushchannel? 正确 - 发送类似 "pushChannel": "" 在客户端调用之前,我只有 Azure 安装 ID 和 deviceToken。我没有任何可用的名为 pushChannel 的属性或变量。我在哪里可以得到它?您指的是设备令牌吗? pushChannel 是您从 PNS 收到的registrationId。这不是 Azure 安装 ID(由 SDK 生成),也不是您发送到 PNS 的 deviceId。这是你从 PNS 得到的。不幸的是,不同的 PNS 叫它不同的东西。 嗨阿德里安。我一直在检查文档,对于 Apple,PushChannel 是 deviceToken。但是代码不起作用。我什至无法从门户中的集线器发送测试通知。我的代码和您的代码之间的唯一区别是,首先我需要从 context.user.getIdentities 获取当前用户的电子邮件地址,因为我将其用作标签。有什么想法吗?

以上是关于如何在 iOS 的 Azure 移动应用通知中心注册目标推送通知的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更新 IOS 应用程序的情况下使用 Azure 通知中心

Xamarin和推送通知 - 使用Azure通知中心的原因?

Azure 通知中心:安装 ID 以及如何处理应用程序的卸载

Azure 通知中心不适用于 ios

如何将原始推送通知从 Azure 通知中心发送到 iOS 设备?

如何将 iOS APNs 身份验证密钥与 Azure 通知中心一起使用?