今天的30天挑战系列,我决定扩展昨天发布的PhoneGap程序的推送消息。消息推送允许程序提醒用户,即使程序没在使用的时候。例如,你有一个twitter应用,激活了消息推送,即使这个程序没在运行,如果有人粉了你或者给你留言了,程序也会通知你。
几周前,我读了Jay Balunas一篇很有用的博客,讲述用AeroGear在OpenShift上安装自己的消息推送服务。那时,我没有机会用AeroGear OpenShift, 现在我们可以用它来给昨天发布的阅读器添加推送功能。
AeroGear UnifiedPush Server是一个开源的服务程序,用Java写,允许推送消息到不同的移动设备,可以看成基于不同推送消息技术的抽象化。当前版本支持Apple’s APNs, Google Cloud Messaging和Mozilla’s SimplePush.
我们今天要开发的手机应用是一个对30天学习30种技术挑战的阅读器。用户可以在任何Android, Symbian, webOS, 或者 Windows Phone上安装,可以从http://bit.ly/18dbH8a下载。
这个应用可以做以下:
在昨天的博客里我们已经讨论了前两个需求,今天,我们来添加用例的推送功能,只要有新博客发布了,就提醒给用户。
今天的demo放在github:
day11-30technologies30days-mobile-app-with-push-notification
要添加推送,需要做五个任务。
现在一个个来完成。
在创建AeroGear推送服务程序前,需要先住醋OpenShift账号,它完全免费,红帽给每个用户免费提供了3个Gears来运行程序。目前,这个资源分配合计有每人1.5GB内存,3GB磁盘空间。
验证之后,登陆OpenShift Web平台。
点击Create your first application now,选择AeroGear Push 0.X程序类型。
这个页面要求我们输入程序的详细信息,由于这是一个快速入门的OpenShift程序,所有的配置信息已经为我们准备好了,选择默认配置,点Create Application按钮。
程序建好后,可以在 http://aerogear-{domain-name}.rhcloud.com 看到AeroGear服务,用你的OpenShift域名替换{domain-name}.
打开 http://aerogear-{domain-name}.rhcloud.com/, 会提示登录AeroGear服务。默认账号密码是'admin/123', 登录后,基于安全问题会要求你更改密码。
用新密码登录后,可以看到AeroGear面板。
程序创建后,可以看到详细信息,重要部分的信息是Application ID和Master Secret, 用来发送推送信息。
这个在AeroGear推送服务文档有深入解释,请参考文档。注册好谷歌云信息服务账号后,可以得到Google API key和Project Number.这在下一步要用到。
到AeroGear推送服务添加一个新的数据类型,对于推送程序有不同的数据类型(例如Android, iPad, iPhone free 或者Mobile Web). 数据类型包含了平台的特定属性,比如Google API key(Android)或者PushNetwork URL(SimplePush).
如下填入详细信息,点击Create按钮,输入在第二步接收到的Google API key和Project Number.
用AeroGear推送服务给PhoneGap程序添加推送信息很简单,AeroGear团队提供了一个我们可以安装的PhoneGap插件,运行一下命令安装aerogear-pushplugin.
$ cordova plugin add https://github.com/edewit/aerogear-pushplugin-cordova.git
添加推送信息就如添加几行JavaScript代码一样简单,在app.js文件里,用以下代码替换jQuery ready.
document.addEventListener('deviceready', onDeviceReady, true); function onDeviceReady(){ var aeroConfig = { senderID: "{senderId}", pushServerURL: "{pushServerUrl}", variantID: "{variantId}", variantSecret: "{variantSecret}" }; try { push.register(successHandler, errorHandler, {"badge": "true", "sound": "true", "alert": "true", "ecb": "onNotification", aeroConfig: aeroConfig}); } catch (err) { txt = "There was an error on this page.\n\n"; txt += "Error description: " + err.message + "\n\n"; alert(txt); } homeView(); $('.home').on('tap', renderHomeView); $('.feedback').on('tap', renderFeedbackFormView); } function successHandler(result) { console.log("successfully registered with AeroGear push server : " + result); } function errorHandler(error) { console.log("Error in registering with AeroGear push server : " + error); } function onNotification(e) { showNotification(e.alert); }
以上代码做了以下动作。
昨天我只想关注在PhoneGap上,没有讨论后端应用。我们开发的程序在OpenShift上有一个Java REST 后端,它有几个REST API. 第一个是列出所有博客和创建新博客,第二个是提交反馈。是很简单的Java EE 6 程序。
在发布后端到云裳前,我们需要做以下几步:
sudo gem install rhc
如果你已经安装了,确保那是最新的。要更新rhc,输入
sudo gem update rhc.
想了解rhc command-line 工具,更多帮助参考https://openshift.redhat.com/community/developers/rhc-client-tools-install。
发布后端到OpenShift上只需输入以下命令:
$ rhc create-app 30technologies30days jbosseap mongodb-2.2 --from-code https://github.com/shekhargulati/30technologies30days-backend.git
代码里我们感兴趣的是当发布了一篇博客后应该推送信息,添加在BlogResource,用AeroGear 推送服务REST API封装的AeroGear客户端(今天写的)。
@POST
@Consumes(value = MediaType.APPLICATION_JSON)
public Response create(Blog blog, @Context HttpServletRequest request, @Context HttpServletResponse response) {
BasicDBObjectBuilder basicDBObjectBuilder = BasicDBObjectBuilder.start("title", blog.getTitle())
.add("url", blog.getUrl()).add("publishedOn", blog.getPublishedOn());
String authorization = request.getHeader("authorization");
if (authorization != null && authorization.startsWith("Basic")) {
// do authorization header check
DBCollection collection = db.getCollection("blogs");
collection.save(basicDBObjectBuilder.get());
aerogearClient.sendMessage("New blog published in 30technologies30days challenge");
return Response.created(null).build();
}
return Response.status(Status.UNAUTHORIZED).build();
}
以上代码,我们先从Blog对象获得所有数据,创建BasicDBObject, BasicDBObject是会被写入MongoDB的文档,如果用户被认证了,我们就会在MongoDB里插入博客,在MongoDB插入后,就推送信息给所有手机用户。
现在,在设备上运行以下命令就可以安装和运行程序了。
$ phonegap run android
这就是今天的内容,继续给反馈吧。
原文:https://www.openshift.com/blogs/day-11-aerogear-push-server-push-notifications-made-easy