Hi,<div><br></div><div>after two weeks of prototyping and evaluating, I started the design phase of the AG Unified Push Server.</div><div><br></div><div>I created a GIST [1] that defines the INITIAL (not final) first DRAFT of the supported use cases. Yes, they are very minimal :), but once we have something running, we can add more features. Please review and comment here...</div>
<div><br></div><div>(COPY AND PAST FROM GIST):</div><div><br></div><div><h1 style="font-size:28px;margin:0px 0px 10px;padding:0px;font-family:Helvetica,arial,freesans,clean,sans-serif">AG Unified Push - Use Cases</h1><p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">
Right now there are the following roles:</p><ul style="margin:15px 0px;padding:0px 0px 0px 30px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px"><li><strong style="margin-top:0px">Developer</strong>: Some one that setup up the backend for different mobile applications, to enable push (e.g. iOS certs or Google API keys(more later)</li>
<li><strong style="margin-top:0px">User</strong>: Install an AG-App on his phone</li><li><strong style="margin-top:0px">Admin</strong> needed? yes, once we have a <em>management user interface</em>. NOT part of the first iteration....</li>
</ul><h2 style="margin:20px 0px 10px;padding:0px;font-size:24px;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(204,204,204);font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="use-cases" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#use-cases" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Use Cases</h2>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">Below are the BASIC use-cases, that the AG Unified Push needs to <em>initially</em> support.</p>
<ul style="margin:15px 0px;padding:0px 0px 0px 30px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px"><li>Enroll AeroGear-Push-User (based on identified roles)</li><li>Remove AeroGear-Push-User</li>
<li>Developer can register mobile App (for different Push Networks, e.g. Apple, Android)</li><li>Developer can unregister mobile App (for different Push Networks, e.g. Apple, Android)</li><li>User registers his phone with the backend (Device Token + APP-ID are send to the backend)</li>
<li>User unregisters his phone with the backend (e.g. app got deinstalled, user deleted etc)</li><li>User receives Push Messages (handled by the native OS, once accepted to receive messages)</li><li>Send push messages, done by a <em style="margin-top:0px">user</em> or a <em>developer</em></li>
</ul><h3 style="margin:20px 0px 10px;padding:0px;font-size:18px;font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="enroll" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#enroll" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Enroll</h3>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">Register different user types (based on desired role) with the AG-Unified-Push server. The <strong>Developer</strong> role always requires a username/password. The <strong>User</strong> is not always required on the server. Some mobile apps don&#39;t know the concept of a logged in user (e.g. Sport Broadcast apps), but others do require a <strong>User</strong> before using the mobile app (e.g. Twitter)</p>
<h3 style="margin:20px 0px 10px;padding:0px;font-size:18px;font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="remove-registered-user" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#remove-registered-user" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Remove registered User</h3>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">It should be possible to remove Users (app users). That can me their account is erased or their device tokes are removed....</p>
<h3 style="margin:20px 0px 10px;padding:0px;font-size:18px;font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="add-mobile-app" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#add-mobile-app" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Add mobile app</h3>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">A registered <strong>Developer</strong> can register multiple Apps with the AeroGear Push Server. Each app has a (generated) AeroGear-Application-Key, besides that, the logical concept of a APP, on the server, requires access to the Push Networks (Google or Apple). Therefore such a registered APP needs a certificate and passphrase (iOS) or a Google API key (Android)</p>
<h3 style="margin:20px 0px 10px;padding:0px;font-size:18px;font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="remove-mobile-app" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#remove-mobile-app" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Remove mobile app</h3>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">A registered <strong>Developer</strong> should be able to remove the apps from the server.</p>
<h3 style="margin:20px 0px 10px;padding:0px;font-size:18px;font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="device-registration" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#device-registration" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Device Registration</h3>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">Once a <strong>User</strong> installs and launches the mobile app, the embedding OS generates a <em>Device-Token</em> (or <em>Registration ID</em> on Android). The mobile Application needs to send this Token/ID and the AeroGear-Application-Key to the AeroGear Server, so that the server can register this phone/app with the particular app, to be able to receive push messages.</p>
<p style="margin:15px 0px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px"><em><strong>Note:</strong> On iOS the user as to agree to receive push messages</em></p><h3 style="margin:20px 0px 10px;padding:0px;font-size:18px;font-family:Helvetica,arial,freesans,clean,sans-serif">
<a name="remove-registered-device" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#remove-registered-device" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Remove registered Device</h3>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">If an app gets uninstalled, the phone is no longer able to receive push messages. Therefore inactive Device-Tokens/Registration-IDs should be removed, on the server. However... there is no harm if invalid keys are used, on the server, when trying to send push messages...</p>
<h3 style="margin:20px 0px 10px;padding:0px;font-size:18px;font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="receives-push-messages" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#receives-push-messages" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Receives Push Messages</h3>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">Every installed app, is able to receive Push Messages through the APIs, offered by the platforms (iOS, Android). Initially there will be NO client SDK.</p>
<p style="margin:15px 0px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px"><em><strong>Note:</strong> On iOS the user as to agree to receive push messages</em></p><h3 style="margin:20px 0px 10px;padding:0px;font-size:18px;font-family:Helvetica,arial,freesans,clean,sans-serif">
<a name="send-push-messages" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#send-push-messages" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Send push messages</h3>
<h4 style="margin:20px 0px 10px;padding:0px;font-size:16px;font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="broadcast" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#broadcast" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Broadcast</h4>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">The Unified Push server acts as a broker to deliver messages (via Native Push) to several devices. Authorized Users (based on their roles) can send push messages to a specific application. For instance a <strong>Developer</strong> that <em>ONLY</em> owns &quot;AeroGear-App1&quot; is only able to broadcast messages to that particular app. He is <em>NOT</em> able to send a message to &quot;AeroGear-App2&quot;...</p>
<h4 style="margin:20px 0px 10px;padding:0px;font-size:16px;font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="filtered-messaging" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#filtered-messaging" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>Filtered messaging</h4>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">Sending message to a specific user.... We need a DSL to filter users etc.... This will be done later...</p>
<h4 style="margin:20px 0px 10px;padding:0px;font-size:16px;font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="in-app-messaging" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#in-app-messaging" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>In-APP messaging</h4>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">Later, there will be an option to have the app also submit push messages, to broadcast to other users of the app (or to a specific user). This will be done later...</p>
<h2 style="margin:20px 0px 10px;padding:0px;font-size:24px;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(204,204,204);font-family:Helvetica,arial,freesans,clean,sans-serif"><a name="api-access" class="anchor" href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c#api-access" style="color:rgb(65,131,196);text-decoration:none;display:block;padding-left:30px"></a>API access</h2>
<p style="margin:0px 0px 15px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px"><em>Initial</em> focus is that the above functionality is <em>ONLY</em> accessable via RESTful/HTTP APIs!</p>
<p style="margin:15px 0px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px">Later we will have a few more SDKs:</p><ul style="margin-top:15px;margin-right:0px;margin-left:0px;padding:0px 0px 0px 30px;font-family:Helvetica,arial,freesans,clean,sans-serif;font-size:13.63636302947998px;line-height:20px;margin-bottom:0px!important">
<li>Client APIs (for Android, iOS)</li><li>Server APIs (send a push message out of your JavaEE app, without submitting (manually) the HTTP calls)</li></ul></div><div><br></div><div><br></div><div><br></div><div><br></div>
<div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>Cheers!</div><div>Matthias</div><div><br>[1] <a href="https://gist.github.com/matzew/7475652fa3b0cbb11c1c">https://gist.github.com/matzew/7475652fa3b0cbb11c1c</a><br>
-- <br>Matthias Wessendorf<br><br>blog: <a href="http://matthiaswessendorf.wordpress.com/">http://matthiaswessendorf.wordpress.com/</a><br>sessions: <a href="http://www.slideshare.net/mwessendorf">http://www.slideshare.net/mwessendorf</a><br>
twitter: <a href="http://twitter.com/mwessendorf">http://twitter.com/mwessendorf</a><br></div>