【问题标题】:Not receive notification with azure notification hub when using tag使用标签时未收到带有 azure 通知中心的通知
【发布时间】:2025-12-13 08:35:01
【问题描述】:

我是新手。 android的例子来自 GetStartedFirebase

以下是步骤:

1) 我将安卓安装到我的手机上

2) 我按照这个例子创建了我的 web api https//docs.microsoft.com/en-us/azure/notification-hubs/notification-hubs-aspnet-backend-gcm-android-push-to-user-google-notification

3) 我注释掉 AuthenticationTestHandler 类

4)我从小提琴中调用下面的代码

DeviceRegistration 对象

{
  "Platform": "gcm",
  "Handle": "regid i get from android",
  "Tags": [
    "1",
    "2"
  ]
}

// 这会在指定的 id 处创建或更新注册(使用提供的 channelURI)

      public async Task<HttpResponseMessage> Put(string id, DeviceRegistration deviceUpdate)
    {
        RegistrationDescription registration = null;
        switch (deviceUpdate.Platform)
        {
            case "mpns":
                registration = new MpnsRegistrationDescription(deviceUpdate.Handle);
                break;
            case "wns":
                registration = new WindowsRegistrationDescription(deviceUpdate.Handle);
                break;
            case "apns":
                registration = new AppleRegistrationDescription(deviceUpdate.Handle);
                break;
            case "gcm":
                registration = new GcmRegistrationDescription(deviceUpdate.Handle);
                break;
            default:
                throw new HttpResponseException(HttpStatusCode.BadRequest);
        }

        registration.RegistrationId = id;

        var username = "test";

        string[] userTag = new string[1];
        userTag[0] = "username:" + username;
        registration.Tags = new HashSet<string>(userTag);
        try
        {
            await hub.CreateOrUpdateRegistrationAsync(registration);
        }
        catch (MessagingException e)
        {
            ReturnGoneIfHubResponseIsGone(e);
        }

        return Request.CreateResponse(HttpStatusCode.OK);
    }

5) 然后我打电话发送推送通知

http://localhost:4486/api/Notifications?pns=gcm&to_tag=test

public async Task<HttpResponseMessage> Post(string pns, [FromBody]string message, string to_tag)
{

    var user = "test";
    message = "msg";
    string[] userTag = new string[1];
    userTag[0] = "username:" + to_tag;     

    Microsoft.Azure.NotificationHubs.NotificationOutcome outcome = null;
    HttpStatusCode ret = HttpStatusCode.InternalServerError;

    switch (pns.ToLower())
    {
        case "wns":
            // Windows 8.1 / Windows Phone 8.1
            var toast = @"<toast><visual><binding template=""ToastText01""><text id=""1"">" +
                        "From " + user + ": " + message + "</text></binding></visual></toast>";
            outcome = await Notifications.Instance.Hub.SendWindowsNativeNotificationAsync(toast, userTag);
            break;
        case "apns":
            // iOS
            var alert = "{\"aps\":{\"alert\":\"" + "From " + user + ": " + message + "\"}}";
            outcome = await Notifications.Instance.Hub.SendAppleNativeNotificationAsync(alert, userTag);
            break;
        case "gcm":
            // Android
            var notif = "{ \"data\" : {\"message\":\"" + "From " + user + ": " + message + "\"}}";
            outcome = await Notifications.Instance.Hub.SendGcmNativeNotificationAsync(notif, userTag);
            break;
    }

    if (outcome != null)
    {
        if (!((outcome.State == Microsoft.Azure.NotificationHubs.NotificationOutcomeState.Abandoned) ||
            (outcome.State == Microsoft.Azure.NotificationHubs.NotificationOutcomeState.Unknown)))
        {
            ret = HttpStatusCode.OK;
        }
    }

    return Request.CreateResponse(ret);
}

没有返回错误,但我没有收到任何通知。

我尝试删除用户标签如下:

outcome = await Notifications.Instance.Hub.SendGcmNativeNotificationAsync(notif);

我能够收到通知。

为什么标签不起作用?

任何帮助表示赞赏。

【问题讨论】:

标签: azure-notificationhub


【解决方案1】:
var allRegistrations = await Notifications.Instance.Hub.GetAllRegistrationsAsync(0);

allRegistrations 中检查您的标签。如果它在那里,那么它应该可以工作。

您可以查看http://pushtry.com的测试通知

【讨论】:

    【解决方案2】:

    我很困惑 - Fiddler 的 JSON 显示注册具有“1”和“2”标签,但在代码中的任何地方都使用“用户名:测试”标签。您能否从集线器获取此注册并确保它具有正确的标签? 您可以使用GetRegistrationAsync&lt;TRegistrationDescription&gt;(String) [1]、GetRegistrationsByChannelAsync(String, Int32) [2] 或GetAllRegistrationsAsync(Int32) [3] 方法获取注册。

    [1]https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.notificationhubs.notificationhubclient#Microsoft_Azure_NotificationHubs_NotificationHubClient_GetRegistrationAsync__1_System_String_

    [2]https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.notificationhubs.notificationhubclient#Microsoft_Azure_NotificationHubs_NotificationHubClient_GetRegistrationsByChannelAsync_System_String_System_Int32_

    [3]https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.notificationhubs.notificationhubclient#Microsoft_Azure_NotificationHubs_NotificationHubClient_GetAllRegistrationsAsync_System_Int32_

    【讨论】:

    • 最初我确实在参数中包含了“1”和“2”标签,但它不起作用所以我只是尝试只使用注册中的一个标签并忽略参数中的这些标签并调用通知 api功能也只有一个标签,看看它是否有效。不幸的是仍然无法工作。
    • 在 Microsoft.Azure.NotificationHubs.NotificationOutcome 之前结果 = null;我确实使用 GetAllRegistrationsAsync(0) 来检查,它有一个“用户名:测试”标签