UWP Push In Foreground and Background - push-notification

I'm having the following problem with UWP push notifications.
Scenario:
Foreground registers a background task for push notifications but also wants to be notified of incoming pushes so it gets a channel, updates the server with the channel then hooks onto events on that channel.
Push notification comes in
Background task launches and does it's work. It also checks to see if the channel URI has changed, if it has, it updates the server with the new uri.
Result:
Foreground app no longer receives incoming pushes on the channel because the background task updated the server with a different channel uri from what the foreground app was listening on.
What is the proper way for the foreground app to continue listening for push notifications after the uri potentially changed?
Updated problem for clarification:
Step 1 Foreground app code:
var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
channel.PushNotificationReceived += OnPushNotificationReceived;
//<update server with channel.Uri
Step 2 Background task launches and also checks for a new channel uri:
var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
//update server with channel uri
Problem
If channel uri changes in Step 2 then the even handler in Step 1 never gets invoked again.

because the background task updated the server with a different channel uri from what the foreground app was listening on.
No. Your understanding was incorrect. Let's first check the steps on how to send a push notification:
Your app requests a push notification channel from the Universal Windows Platform.
Windows asks WNS to create a notification channel. This channel is returned to the calling device in the form of a Uniform Resource Identifier (URI).
The notification channel URI is returned by Windows to your app.
Your app sends the URI to your own cloud service. You then store the URI on your own cloud service so that you can access the URI when you send notifications.
When your cloud service has an update to send, it notifies WNS using the channel URI. This is done by issuing an HTTP POST request, including the notification payload, over Secure Sockets Layer (SSL). This step requires authentication.
WNS receives the request and routes the notification to the appropriate device.
Then, if you understand these steps, you will find that the key point of sending a notification to the appropriate device is you need to request a notification channel. This channel URI is unique for every device no matter whether the channel URI is updated. So, even if your UWP app's background task has updated the channel URI on your cloud service, it will not affect the device to receive the notification. As long as you could make sure that the channel URI is the latest when you use this channel URI to send notification, then your device will always receive the notification(Except for some special cases, e.g, the device is powered off or device is in battery saver etc).
Please read Windows Push Notification Services (WNS) overview for more detailed information.
What is the proper way for the foreground app to continue listening for push notifications after the uri potentially changed?
What you said was not correct. There is no relationship between the "listening for push notifications" and "the uri potentially changed".
If you want to do some operations when the devices receive notifications, you could use the Notification listener to perform specific actions when notifications are received.

Related

Send FCM push notification to sip client app on Android based on pn-param and pn-prid URI Parameters

I want to send push notifications from my PBX/SIP-Server (FreePBX 15/Asterisk 17)
to sip client apps that provide 'pn-provider', 'pn-param' and 'pn-prid' URI Parameters as specified in rfc8599/draft-ietf-sipcore-sip-push-29 during REGISTER sip request, e.g.
xyz#1xx.1xx.2xx.198:9926;transport=TLS;pn-provider=fcm;pn-param=com.mizuvoip.mizudroid.app;pn-prid=dcrpn1TbEW0:APA91bGgK3RV-s7AX-U2...HLoQL1UNgom
What I haven't managed/do NOT understand so far is how to successfully create a push notification with the device token in 'pn-prid' submitted by the sip client app (NOTE: This is a 3rd party(!) app, for which I neither possess a SenderID nor a ServerKey from its linked Firebase project. In my case, I use and tried before with MizuDroid sip client APP for Android.)
Attempts to send a PUSH notification via FCM HTTP REST API using a ServerKey from a Firebase project I have registered before all resulted in
{"multicast_id":2435751791125788205,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}
My questions are:
Is it possible to send FCM PUSH notifications to 3rd party(!) apps from which you have already obtained a device token (here: in 'pn-prid' URI parameter)
If answer 1 is yes: What FCM API do I need to use, what data do I need to submit for the purpose and what are the further prerequisites

Does push notification cause a continuous polling on server?

I am using Google Channel to do Push notification from server. It's working fine, but when I open the debugger windows, I can see lot of polling request that are going to the server.
Is that the way push notification works? If yes, then what is the use of it?
var token ="<%token%>";// This will creaete unique identifier(some id created by google api + ur key)
channel = new goog.appengine.Channel(token);
socket = channel.open();
socket.onopen = function() {
$('#messages').append('<p>Connected!</p>');
};
Thanks.
GCM doesn't do that. Gonna refer to the official docs on it's flow.
Lifecycle Flow
Send and receive downstream messages.
Send a message. The app server sends messages to the client app:
The app server sends a message to GCM connection servers.
The GCM connection server enqueues and stores the message if the device is offline.
When the device is online, the GCM connection server sends the message to the device.
On the device, the client app receives the message according to the platform-specific implementation. See your platform-specific documentation for details.
Receive a message. A client app receives a message from a GCM connection server.
Also announced in the recent I/O 2016, GCM's successor is now Firebase Cloud Messaging, which not only has the Push Notification Service, but also has other features (one example is Analytics) for free.
So overall, using GCM (or FCM) is a simpler method than polling. It handles the queuing of the messages you sent, and some others.
Part of my answer here. Also includes an idea why Polling is not ideal when sending push notifications.

Push notification reached the device but not able to see it in the applicaition

I am using mobilefirst push notification service in my application. I am using rest api to send the message to GCM.
GCM receives and send it back to the mobile device too but in the device I am able to see the push message in the log, but not in alert which is the event source I have registered in my client device.
You have received a notification intended for Push.ALL tag. This is a broadcast notification and will not appear within the callback you registered with your Eventsource subscription.
You should use the onMessage callback API, as described in KnowledgeCenter and GettingStarted.

Understanding Push notifications for Windows Phone 8.1

I'm trying to understand what I will need to build on my server for Push notifications to work successfully.
My thoughts were:
The phone sends the notify URL to my server
The server stores the information in a Database
A separate process or PHP script will query the database and open continuous looping process for each device. (Each socket will be querying a 3rd party API)
When there is a change detected in the API for that device a push notification will be sent to the device's notify url.
Is this the right method on what needs to be done. Isn't this going to eat up server resources or is it the expected outcome of Push a push notifications server?
I've produced a simple diagram on all this below:
First of all, let's separate the process in the main stages needed for PUSH.
Device subscription.
Send the PUSH
Process the notification on device.
Subscription
For the subscription, your device (more specifically, your App) must call the PUSH api,for enabling PUSH notifications. This call to the push API will give you a URL that uniquely identify the device where your application is installed and running. You should store this URL on your database, the same way you store a user's email, or a user's phone number. No special black magic here. You only use it when you need to send a communication to a user.
Send the PUSH
For the push stuff, the same approach as for email, or SMS messaging here: "One does not simply make an infinite loop and send a message if any change is detected". What you have to do is, just send the PUSH message when your application needs to. So you have the user to which you want to send a message, instead of opening a SMTP connection to send ane mail, just build the PUSH XML Message and call the URL associated with that user. Some things to consider here are:
Network reliability (you need to retry if you can't connect to the server).
Response error code-handling (you don't need to retry if the server tells you that the phone has uninstalled your application, for example).
Scalability. You don't want to send a PUSH message from your PHP code, because you don't know how long it will take for the task to be completed. You have to make this thing asynchronously. So just queue up all the push messages, you can create a separate process (windows service, nodeJS service, cron job, daemon, etc.) to send the PUSH, handle retries and errors and clean the queue.
Process the notification on Device
So now that you are this far, you need to handle the notification on the phone. It depends on the type of PUSH notification that you are sending:
Tile. You will update the image, text and counter of the application tile, if the user has put your application to the start screen. On client side you need nothing to so, as all these parameters are part of your PUSH request.
Toast. This one requires a title, text (limited to some 35 characters more or less) and a relative URL inside of your APP. Your application will be launched (like when you click on a Toast notification from Twitter, for example) using the URI that you specify in the payload. So a bit of data can be already injected here. You may/or may not make a request to your server for new data. It is up to you.
Raw. This one is pretty much silent. Is not seen by the user if your APP is not running. As you might guess, this kind of PUSH is useful to live update your running APP, instead of continuously polling your server, wasting user battery and bandwidth and wasting your server resources. You can send anything (raw bytes or strings) up to the max size of the payload allowed my Microsoft.
If yo have any more questions, don't hesitate to ask.
Bottom line: separate the PUSH sending, make it async, don't you ever forget that...
Your PHP script that continually pings the database for changes...THAT is what will eat up your system resources. Push notifications go hand in hand with Event Driven Programming. This means that ideally, your code shouldn't continuously ping your DB. Rather, when something happens (ie, an "event"), THEN your code does something...like contact your phone via push notification.
Your steps for push notifications are more or less correct, but are incomplete. Step 4: the server contacts the client via the notify url (which you have). Step 5 is that the client then contacts the server to actually pull down the information it needs. That is: The new information is not provided to the client via the notify url. Once the client has its new information, then the program continues as normal (populates a list, downloads skynet, etc.)
Your third step is very wasteful and not practical if your app is installed on more than a few devices.
Instead, each device should be subscribed to types of server updates it cares about. Your server's DB will have a mapping from each type of update you support to the list of notification channel URLs of devices that care about this update type.
When your server detects an update of type X, it would send a notification to all devices subscribed to that type of update.

APNS Push Requests are successfully sent but passes are not updating

I have an app set up to generate passbook passes. The successfully install on the device and I can do manual (pull-down) updates.
Next I began to implement APNS. I'm using the enhanced request method to connect to the production environment, sending in an empty payload (as required) and it returns no error codes when I request a push notification, but my pass never updates and I see no requests hitting my server. I'm using my own device to test until I can get see an update for myself. No pass updates are received.
I then implemented the Feedback service in the hope that it might tell me something. I noticed this. If I pass in the push token, I receive a response which indicates that the device is not receiving notifications (even though the pass is set for automatic updates). The pass is not updated.
I'd appreciate any info into why the the push notifications do not seem to be arriving.
Thanks.
-Erich
One gotcha to check is that you are not using the sandbox APNS server. All Passbook push requests should be sent to the live APNS server.
Try enabling the additional logging option from the PassKit section of the Developer Settings on your device then connecting your device to Xcode and monitoring the console as you send the push. If the push is received, then you should be able to see your device requesting the serials to be updated from your webservice and you should also see your server's response.
Assuming you send a serial and that it matches the serial installed on your device, you should then see the device requesting the updated .pkpass bundle.
If no push is received, try toggling automatic updates on and off while monitoring the device console. It could be that the device is not receiving a valid registration (201) response or that you are using a stale token - you'll be able to see these via the console.

Resources