I need to implement push notification system which allows to send push to specific users every time.
the registration to the hub is supported by device token and set of tags.
Is the right way to do what I want is to register each user with a singleton set of tags with their user ID as the only tag?
and then when I'd like to send push notifications to users a,b,c for example I will need to attach their users Id's.
Is there any way more elegant to do so or those tags are the only way?
BTW I am limited to attach 20 tags foreach push Im sending so I wont be able to push to more then 20 specific users at once.
Please let me know what you think about this solution.
#Liran Revivo well i think, yes this is the right way to do push notification over azure.
As my experience with azure push notification
step 1: i made a notificationHub for my azure notification and registered my GCM api key with that hub
step 2: i did register device token with or without the tag as you want.
step 3: send push notification
i sent push with different case like:
(i) sends a push to single device: i just sent with that particular device token registration id
(ii) sends a push for a group of device: So i mentioned tag name and sent the push
(iii) sends a push for multiple group: So i mentioned multiple tag name and sent the push
(iv) sends a push to all devices: So i send tag name empty and by deafult it sent to all device with that notificationHub
By doing all these above stuff, i did my push notification with azure, And i think this is the right way to push with azure as it is documented by its offical site
From my experience - using user ID as a TAG works quite well. It allows you to send push for specific user. If you want to notify all users at once, you can send push notification without specific tag, then it would work as a broadcast message. On the other hand if you want to divide users to some subgroups you can provide them some "channels" using specific tags.
For example
"premium_user" tag that every premium user registers.
Related
everyone,
i have developed an app with Xamarin Forms and i want to implement Push Notification.
I use Azure Notificatio hubs to implement push notification.
I can now receive the push notification in my app but I want to group the push notification (send push notification to determine device)
I want the user to select certain category to receive notification.
but the documentation from Microsoft, does not explain how to do this. the documentation said how to implement push notification with Java, Swift (Native App).
but i want to do everything with C#, because i use Xamarin forms.
can someone please help me???
You could use Routing and Tag Expressions, Which enable you to target specific sets of devices, or more specifically registrations, when sending a push notification through Notification Hubs.
Tags can be used to subscribe to message categories such as news, sports, and weather. For simplicity, the sample application defines a default template with a single parameter called messageParam and a single tag called default. In more complex systems, user-specific tags can be used to message a user across devices for personalized notifications. To learn more about tags, see Routing and tag expressions.
For more details you could refer the docs .
I want to send web push notifications to registered users, are there any best practices on how to implement the cases when multiple users have access to the same device and one should not see the message of another user.
Thanks in advance.
A web push notification subscription is tied to the browser, not the device.
What you need to do is, map this id with your registered user when he logs in from a particular browser. Also, you need to remove the subscription id mapping with any other users in the system.
In the case of multiple users using the same browser, the above logic will make sure that at a time, a particular browser subscription id is linked only to a single user.
And when you want to send a notification to a registered user, you can retrieve all push subscription IDs linked to this user in your database, and trigger notifications to those subscription IDs.
And don't forget to unmap a subscription id when the user logs out from a browser. Otherwise, he will continue to receive all notifications even if he has logged out.
For sending and receiving push notifications I want to register all my apps to the push channel with:
var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
I can now send and recieve pushes over this channel.
The problem is that this channel is only valid for one app. If I install the same app on another device I only receive the message on the same device as I sent it.
How can I push the notification to all my devices?
The push channel is unique for each app installation. You can only use it to send a push to this one installation. If you want to send push to all the devices running your app, you have to collect the push channel info somewhere (your server, etc.) or you can use a service like https://parse.com/ that offer targeting multiple devices at once.
Are you trying to install the same debug-based app on more than one device?
I believe that the channel is based on some identity of the app, so try to release it and I prefer you to create a store-based hidden app and test it..
The code you're writing is OK with millions of devices :)
According to this article,
Devices can specify one or more tags when registering with a Notification Hub, These tags don’t need to be pre-provisioned or disposed, and provide a very easy way for apps to send targeted notifications to millions of devices with a single API call, without you having to implement your own per-device notification routing infrastructure - https://blogs.windows.com/buildingapps/2013/09/16/delivering-push-notifications-to-millions-of-devices-with-windows-azure-notification-hubs/#mQppyhpwaEAcMehc.97
In your Windows Store app, using the Windows Store device SDK, you can register to your Notification Hub simply calling
await hub.RegisterNativeAsync(channel.Uri, new string[] { "myTag", "myOtherTag" });
And then you can have your .NET backend broadcast a message to all your clients, just by calling
var toast = #"<toast><visual><binding template=""ToastText01""><text id=""1"">Hello everybody!</text></binding></visual></toast>";
await hub.SendWindowsNativeNotificationAsync(toast);
I recently migrated an old push notification app to a new Azure Mobile Service. The MPNS API, apparently, has changed. It also automatically created a notification hub. Now instead of being able to define a clear channel URI for the message to be sent to, I need to specify a tag. I find it very hard to find information on this and how to send messages to individual users from Azure Mobile Services.
How is this done now?
Its actually pretty simple. Use your unique user identifier as a tag when you register.
Here is an example.
Registration reg = new AppleRegistration(token)
reg.getTags().add(userId)
hub.createRegistration(reg)
Now when you want to send to that user, send via the tag.
hub.sendNotification(Notification.createAppleNotification(payload), userId)
With Notification Hubs you have a few different options. Tags are the way of identifying who you want to push to (i.e. when you push to tag X, any device that has registered with tag X will be pushed to). So if you want to push based off of channel URI, when you register from the device, you should use the Channel URI as one of the tags. If you want to be able to push to all of a single user's devices, you'd need a different mechanism of knowing who the user is (i.e. registering with the username as a tag and then pushing to the username).
I am evaluating which Push Notification service to use out of Azure Mobile Services, Parse and Urban Airship.
One of the criteria is whether the service provides a way for the app to register a bespoke user Id or alias that can then easily be used when calling the service to send a push notification to an individual. This removes the need for our backend service to have a lookup table giving us the service registration ID for a given user.
Urban Airship has the alias feature: http://docs.urbanairship.com/connect/connect_audience.html#aliases
Parse has a sophisticated Installation object which behaves like a dictionary so that additional values can be added to it (like UserId). When the Parse service is called to send a Push Notification a query can be used to specify the user that will receive the message:
https://www.parse.com/docs/push_guide#sending-queries/REST
Is there an equivalent feature in Azure Mobile Services?
With Mobile Services, you would need to keep track of a user to token / channel URI / registration ID association in a table which is more work than you NEED to do. However, another feature of Windows Azure is Notification Hubs which does what you want (and much more). With Notification Hubs, from the client you say "I want to register for Notification Hubs, here are some tags you can use to push me information". Those tags can be anything you want including a User ID. Later on you can tell your Notification Hub to push to anyone registered with a certain tag. That would allow you to then push notifications out to any devices a specific user has registered.
The flow would look something like this:
Register with Push Provider (APNS, GCM, MPNS, WNS)
Send token to Notification Hubs along with tags (such as the User's ID)
Trigger a push to a specific Tag (i.e. User ID)
Notification Hubs will handle delivering a push to all devices with a Tag (again, their user ID)
Notification Hubs has client SDKs for WinPhone, WinStore, iOS, and Android so it's very easy to use from the client side. As far as triggering pushes goes, Notification Hubs exposes a REST API you can communicate with, there is a .NET SDK, a Node SDK, as well as an unofficial Java SDK. You can even use the Node SDK from Mobile Services which makes it super easy to combine authentication (i.e. getting User IDs) with data storage and push notifications. It also has lots of other features like templated push notifications so instead of specifying a different payload depending on what the device OS you're pushing to is, you can have the client application indicate how it should receive a certain type of push.