阿里云移动研发平台体验报告

今天,我们来聊聊移动端原生开发。本篇文章涉及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的产品架构全图(其中的某些功能将在未来逐步可用)。
阿里云移动研发平台体验报告

阿里云移动研发平台体验报告

上一篇:食堂APP-项目开发及踩坑记录(4)


下一篇:Android-----使用zxing实现二维码扫描