Azure通知中心标记不创建或更新 - 以特定用户为目标

时间:2015-08-10 06:15:05

标签: azure asp.net-web-api push-notification azure-notificationhub

您好我正在使用web api作为后端服务,我正在使用Azure通知中心。我需要根据条件业务逻辑通知登录用户,简称目标特定用户。我从this文章中提取代码。一切正常,但标签不是创建也不是更新。我需要帮助。这是我的代码片段

// It returns registrationId
public async Task<OperationResult<string>> GetRegistrationIdAsync(string handle)
{
      ........
}

// actual device registration and tag update 
public async Task<OperationResult<RegistrationOutput>> RegisterDeviceAsync(string userName, string registrationId, Platforms platform, string handle)
{
      ...........
registration.Tags.Add(string.Format("username : {0}", userName)); // THIS TAG IS NOT CREATING
await _hub.CreateOrUpdateRegistrationAsync(registration);
      ...........
}

// Send notification - target specific user
public async Task<OperationResult<bool>> Send(Platforms platform, string userName, INotificationMessage message)
{
      ...........
}

2 个答案:

答案 0 :(得分:2)

提交此问题后,我尝试更新VS通知资源管理器中的代码。在那里我发现标签不允许空格,而api调用中的标签格式有空格。 这些空间是罪魁祸首。 API调用默默地忽略这些无效的标记格式

答案 1 :(得分:1)

这是完整的工作实施。根据您的需要进行修改

 public class MyAzureNotificationHubManager
{
    private Microsoft.ServiceBus.Notifications.NotificationHubClient _hub;

    public MyAzureNotificationHubManager()
    {
        _hub = MyAzureNotificationClient.Instance.Hub;
    }

    private const string TAGFORMAT = "username:{0}";

    public async Task<string> GetRegistrationIdAsync(string handle)
    {

        if (string.IsNullOrEmpty(handle))
            throw new ArgumentNullException("handle could not be empty or null");

        // This is requied - to make uniform handle format, otherwise could have some issue.  
        handle = handle.ToUpper();

        string newRegistrationId = null;

        // make sure there are no existing registrations for this push handle (used for iOS and Android)
        var registrations = await _hub.GetRegistrationsByChannelAsync(handle, 100);
        foreach (RegistrationDescription registration in registrations)
        {
            if (newRegistrationId == null)
            {
                newRegistrationId = registration.RegistrationId;
            }
            else
            {
                await _hub.DeleteRegistrationAsync(registration);
            }
        }


        if (newRegistrationId == null)
            newRegistrationId = await _hub.CreateRegistrationIdAsync();
        return newRegistrationId;
    }

    public async Task UnRegisterDeviceAsync(string handle)
    {
        if (string.IsNullOrEmpty(handle))
            throw new ArgumentNullException("handle could not be empty or null");
        // This is requied - to make uniform handle format, otherwise could have some issue.  
        handle = handle.ToUpper();
        // remove all registration by that handle
        var registrations = await _hub.GetRegistrationsByChannelAsync(handle, 100);
        foreach (RegistrationDescription registration in registrations)
        {
            await _hub.DeleteRegistrationAsync(registration);
        }
    }

    public async Task RegisterDeviceAsync(string userName, string registrationId, Platforms platform, string handle)
    {

        if (string.IsNullOrEmpty(handle))
            throw new ArgumentNullException("handle could not be empty or null");

        // This is requied - to make uniform handle format, otherwise could have some issue.  
        handle = handle.ToUpper();

        RegistrationDescription registration = null;
        switch (platform)
        {
            case Platforms.MPNS:
                registration = new MpnsRegistrationDescription(handle);
                break;
            case Platforms.WNS:
                registration = new WindowsRegistrationDescription(handle);
                break;
            case Platforms.APNS:
                registration = new AppleRegistrationDescription(handle);
                break;
            case Platforms.GCM:
                registration = new GcmRegistrationDescription(handle);
                break;
            default:
                throw new ArgumentException("Invalid device platform. It should be one of 'mpns', 'wns', 'apns' or 'gcm'");
        }

        registration.RegistrationId = registrationId;


        // add check if user is allowed to add these tags
        registration.Tags = new HashSet<string>();
        registration.Tags.Add(string.Format(TAGFORMAT, userName));

        // collect final registration 
        var result = await _hub.CreateOrUpdateRegistrationAsync(registration);
        var output = new RegistrationOutput()
        {
            Platform = platform,
            Handle = handle,
            ExpirationTime = result.ExpirationTime,
            RegistrationId = result.RegistrationId
        };
        if (result.Tags != null)
        {
            output.Tags = result.Tags.ToList();
        }


    }

    public async Task<bool> Send(Platforms platform, string receiverUserName, INotificationMessage message)
    {

        string[] tags = new[] { string.Format(TAGFORMAT, receiverUserName) };

        NotificationOutcome outcome = null;
        switch (platform)
        {
            // Windows 8.1 / Windows Phone 8.1
            case Platforms.WNS:
                outcome = await _hub.SendWindowsNativeNotificationAsync(message.GetWindowsMessage(), tags);
                break;
            case Platforms.APNS:
                outcome = await _hub.SendAppleNativeNotificationAsync(message.GetAppleMessage(), tags);
                break;
            case Platforms.GCM:
                outcome = await _hub.SendGcmNativeNotificationAsync(message.GetAndroidMessage(), tags);
                break;
        }

        if (outcome != null)
        {
            if (!((outcome.State == NotificationOutcomeState.Abandoned) || (outcome.State == NotificationOutcomeState.Unknown)))
            {
                return true;
            }
        }

        return false;
    }

}

public class MyAzureNotificationClient
{
    // Lock synchronization object
    private static object syncLock = new object();
    private static MyAzureNotificationClient _instance { get; set; }

    // Singleton inistance
    public static MyAzureNotificationClient Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (syncLock)
                {
                    if (_instance == null)
                    {
                        _instance = new MyAzureNotificationClient();
                    }
                }
            }
            return _instance;
        }
    }

    public NotificationHubClient Hub { get; private set; }

    private MyAzureNotificationClient()
    {
        Hub = Microsoft.ServiceBus.Notifications.NotificationHubClient.CreateClientFromConnectionString("<full access notification connection string>", "<notification hub name>");
    }
}

public interface INotificationMessage
{
   string GetAppleMessage();
   string GetAndroidMessage();
   string GetWindowsMessage();

}

 public class SampleMessage : INotificationMessage
{
    public string Message { get; set; }
    public string GetAndroidMessage()
    {
        var notif = JsonObject.Create()
             .AddProperty("data", data =>
             {
                 data.AddProperty("message", this.Message);
             });
        return notif.ToJson();
    }

    public string GetAppleMessage()
    {
        // Refer -  https://github.com/paultyng/FluentJson.NET
        var alert = JsonObject.Create()
             .AddProperty("aps", aps =>
             {
                 aps.AddProperty("alert", this.Message ?? "Your information");
             });


        return alert.ToJson();
    }

    public string GetWindowsMessage()
    {
        // Refer - http://improve.dk/xmldocument-fluent-interface/
        var msg = new XmlObject()
                    .XmlDeclaration()
                    .Node("toast").Within()
                        .Node("visual").Within()
                            .Node("binding").Attribute("template", "ToastText01").Within()
                                .Node("text").InnerText("Message here");
        return msg.GetOuterXml();
    }
}