Moodle Mobile Push Notifications
- 1 Goal
- 2 How it works
- 3 Deliverables
- 4 Risks
- 5 Improvement
Moodle Mobile should receive Moodle messages as push notifications on iOS and Android.
How it works
The generic way
- User runs the mobile app.
- User accepts to receive push notification.
- User logins on a Moodle site.
- App registers the device on airnotifier (Apple device token + site url).
- App registers the device on the Moodle site (Apple device ID (or an Airnotifier device ID if it's more secured/generic) to be able to receive the notification and the device name to be able to disable the device)
- User enables airnotifier notification in her/his Moodle profile.
- Moodle sends a message to Airnotifier server throughout its Airnotifier messaging provider.
- Airnotifier dispatches the message to the correct notification system.
- The user device receives the push notification.
- The app opens on a specific page (following the parameters payload).
- Moodle runs Airnotifier messaging provider installation process.
- Airnotifier messaging provider requests an access key from the Airnotifier server - Moodle site temporarily opens an access point to confirm its site url.
- Airnotifer server has successfully identified the site url, it return the access key (the site can send messages and broadcast).
Apple use case
We start from the mobile device, when user launch the app, app should register it's device token to AirNotifier and Moodle at the same time, to register with AirNotifier, we could be sure the token is valid, the invalid token would disturb TCP connection with apple push notification server, so it's very important we do this. To register with Moodle, so moodle site could associate this token with user ID, when something interesting happened to this user, Moodle site will be able to send notification to certain device
Registering token on AirNotifier: Send POST HTTP request to http://server.name/tokens with app name (it's moodle) and app access key in HTTP header, and token in HTTP body Registering token on Moodle: Sending user ID and token, this should be done by new web service, we probably need a new table to record user tokens, NOTE, user may has multi mobile devices, so it's one-many relationship AirNotifier will issue access key to moodle installations, they share one app name: moodle, we need an admin panel in moodle to set this access key, this access keys only allow sending notifications and broadcasts, they don't have permission to register tokens, we only allow tokens being registered from mobile devices
iPhone app use a separate access key, which will be used to register device token
So we got user's device tokens in Moodle database, when somethings happened, for instance, a new instant message sent to a user who has mobile device registered. We will look for messaging processor in Moodle, this message processor is in charge of sending push notification request to AirNotifier, it will send POST HTTP request to http://server.name/notification with token and message digest in HTTP body, app name (it's moodle) and access key in http header
The message processor should be a new output type message plugin besides email, jabber and and popup In user settings page, user should have options to choose whether or not to send notification to certain devices. Broadcast, moodle site may want to broadcast messages to all registered mobile devices, it's inefficient to send individual notification to AirNotifier, it can be done by using http://server.name/broadcast service, moodle site only send one POST request to this endpoint with access key and app name in HTTP header and md5($CFG->wwwroot) in HTTP body, the hashed wwwroot is the default channel subscribed by all devices registered in AirNotifier, it will take care of broadcasting
- push notification support on the mobile app - the app receives the push notification and behaves correctly.
- The Airnotifier server - it sends notification to APNS / GCM.
- The Airnotifier provider - it sends Moodle messages to Airnotifier - MDL-36445
Airnotifier messaging provider
In your messaging setting page you can select which of your devices can receive push notifications. MDL-36445 The provider has usual messaging provider settings.
To install the server follow: https://github.com/dongsheng/airnotifier/wiki/Installation
Need to be done:
- feedback - MOBILE-191
- load stress - Done
- IP banning - Done MOBILE-192
- Site broadcast (site keys) MOBILE-395
- DDOS attacks
- iOS support - Done
- Android support MOBILE-396
App push notification support in the mobile app
- Get the token from Apple (through phonegap PushPlugin)
- Send the token to Airnotifier server (+ site url). See https://github.com/dongsheng/airnotifier/blob/master/test/token_create.sh. Currently it's not possible to link the site url to the token.
- send the token by web service to the Moodle site.
The app is closed or is running in the background
It's a normal OS notification. The user can open the app from it. We need to define what happens when we open the app.
The app is opened
The app displays a notification popup. Or better, it's a small temporary notification message at the top that retarct by itself - less intrusive.
These risks have been raised by Dan in MDL-36445:
- Have we load tested it with large numbers of users/notifications?
- What is stopping someone downloading Moodle getting the keys to DOS our push notification service (surely blacklisting us with apple)
- If someone gains access to device ids, could they then use our service to spam users?
- Are we checking the 'feedback service' and removing devices which no longer exist, apple ominously writes "Note: APNs monitors providers for their diligence in checking the feedback service and refraining from sending push notifications to nonexistent applications on devices."
See Apu's comment in https://tracker.moodle.org/browse/MDL-36445?focusedCommentId=200343&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-200343. Specially the mention about language.