今天,我们来聊聊移动端原生开发。本篇文章涉及Android/iOS两大移动端,将从产品优势和使用方式两大角度解读阿里云移动研发平台(EMAS)。
一、产品优势
阿里云平台所提供的移动研发平台,英文简称为EMAS,意为Enterprise Mobile Application Studio。从名称上看,该能力有企业级的运行承载能力。官网上对其定义描述如下:
移动研发平台(Enterprise Mobile Application Studio,简称EMAS),面向企业服务市场,期望把阿里巴巴近十年在移动互联网行业沉淀的DevOps研发支撑能力、移动APP基础中间件能力开放给客户,帮助传统企业快速完成业务移动化的转型升级目标。
我自己体验后,得到的结论是:和传统移动开发产品相比,该平台可以使企业级移动客户端的开发过程大大简化。我们先来看看它到底都能做些什么吧。
EMAS主要能力有以下七个:
-
移动推送
在实现高效、精确、实时的移动推送的同时,极大地降低了开发成本。 -
HTTPDNS
面向移动开发者推出的一款域名解析产品,具有域名防劫持、精准调度的特性。 -
移动热修复
阿里巴巴首创Hotpatch技术,提供细粒度热修复能力,无需等待,实时修复应用线上问题。 -
移动测试
帮助客户发现APP中的各类隐患,减少用户流失,提高APP质量和市场竞争力。 -
移动数据分析
移动开发者实现基于大数据技术的精细化运营、提升产品质量和体验、增强用户黏性。 -
移动用户反馈
可以快速发送文字、图片、语音进行意见反馈和报告Bug。 -
移动崩溃分析
将Android和iOS平台常见APP的崩溃问题进行归类分析,帮助企业快速发现定位问题。
看到这,您可能会有疑问:现有的产品已经有这些能力了,比如友盟可以做推送和用户分析,腾讯Bugly可以做崩溃反馈……
可是,集成多个SDK势必造成产品安装包大小的增加,不同平台在实际使用时也较为分散,写代码的程序员的工作量也会随之增加……这其实都还是次要的。
下面从移动推送能力为切入视角,我们做一次平台间的对比。首先来看极光推送。
可以看到,相较免费版,不仅无法享受厂商通道,而且推送次数被限制在一天10条内。
再来看腾讯的信鸽推送,和极光推送类似地,厂商通道也只有付费版才可以享受,免费试用将会受到如下图所示的限制:
最后,我们来看看EMAS的收费标准:
- 对于免费的用户:
注意:这里说的是每个月,对于每个App,去重设备数小于5万台的情况,都是免费使用的。
- 对于收费用户,预付费和后付费两种方式,具体如下:
再说产品功能,独有的短信补发特性可以在推送无法到达时,切换为短信下发,进一步确保消息送达。此外,集成EMAS推送能力的App将和阿里系的App共享推送通道。无需新启动常驻内存进程,只要淘宝、天猫能收到消息,我们的App就也可以正常收到推送。不仅保证了消息送达率,还优化了App的内存占用率。
最后,由于EMAS不仅有移动推送的能力,还涵盖了前文中提到的诸多能力,从集成方式上看,可以说是一次集成,能力全能。解放开发者的同时减少App安装包大小。
下面,我们就来看看怎样集成EMAS能力。
二、集成EMAS
集成EMAS的方法非常简单,在阿里云控制台添加产品后,根据指导可以下载一个名为aliyun-emas-services.json的文本文件,这个文件中包含了各种能力的使能开关和appKey等配置信息,其片段如下所示:
{
"config": {
"emas.appKey":"xxxxxx",
"emas.appSecret":"xxxxxx",
"emas.packageName":"com.example.demo",
"hotfix.idSecret":"xxxxxx",
"hotfix.rsaSecret":"xxxxxx",
"httpdns.accountId":"xxxxxx",
"httpdns.secretKey":"xxxxxx",
"appmonitor.tlog.rsaSecret":"xxxxxx"
},
"services": {
"hotfix_service":{
"status":1,
"version":"3.2.14"
},
"ha-adapter_service":{
"status":1,
"version":"1.1.3.2-open"
},
"feedback_service":{
"status":1,
"version":"3.3.1"
},
...
传统集成方式中,AndroidManifest.xml中的各种meta标签数据现在改由这个json文件配置,且各种key是自动填好的,下载后就能直接用,一般不用做任何修改;下面的services节点是每个能力的开关,当status为1时为启用相应的能力,言简意赅。
接着,创建一个继承自Application类的Java类,对要使用的能力进行初始化。这一步骤需要查阅相应的能力的产品文档。比如,我们要集成推送能力,相应代码如下:
private void initPushService(final Context applicationContext) {
PushServiceFactory.init(applicationContext);
final CloudPushService pushService = PushServiceFactory.getCloudPushService();
pushService.register(applicationContext, new CommonCallback() {
@Override
public void onSuccess(String response) {
Log.d(TAG, "初始化推送能力成功");
}
@Override
public void onFailed(String errorCode, String errorMessage) {
Log.d(TAG, "初始化推送能力失败,错误码:" + errorCode + ",详细信息:" + errorMessage);
}
});
}
接着,在创建一个继承自MessageReceiver类的Java类,用于处理收到的推送消息。这里我们将这个类命名为EmacReceiver.java,完整代码如下:
public class EmacReceiver extends MessageReceiver {
public static final String TAG = EmacReceiver.class.getName();
@Override
public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
Log.d(TAG, "Receive notification, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);
}
@Override
public void onMessage(Context context, CPushMessage cPushMessage) {
Log.d(TAG, "onMessage, messageId: " + cPushMessage.getMessageId() + ", title: " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());
}
@Override
public void onNotificationOpened(Context context, String title, String summary, String extraMap) {
Log.d(TAG, "onNotificationOpened, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
}
@Override
protected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {
Log.d(TAG, "onNotificationClickedWithNoAction, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
}
@Override
protected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {
Log.d(TAG, "onNotificationReceivedInApp, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap + ", openType:" + openType + ", openActivity:" + openActivity + ", openUrl:" + openUrl);
}
@Override
protected void onNotificationRemoved(Context context, String messageId) {
Log.d(TAG, "onNotificationRemoved");
}
}
最后,在AndroidManifest.xml中声明这个Receiver即可:
<receiver
android:name=".EmacReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" />
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" />
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.sdk.android.push.RECEIVE" />
</intent-filter>
</receiver>
到此,设备就可以正常收到消息了。当然,我们还可以进一步配置,以便支持各厂商自有推送通道。这里就不再赘述了,具体请各位移步阿里云EMAS官网查看文档。官网链接:https://www.aliyun.com/product/emas
文章的最后,放一张EMAS的产品架构全图(其中的某些功能将在未来逐步可用)。