@DefinedOne
2015-07-24T02:36:04.000000Z
字数 4672
阅读 2958
android
消息推送
友盟
个推
比较
2015-06-23 ~ 2015-07-14
随着 iPhone 和安卓手机这类智能手机的兴起,现在完全可以绕过运营商,通过标准 TCP/IP 网络直接向这些手机发送消息。这些消息就称为推送消息。
推送消息是通过 Apple 和 Google 掌控的互联网服务器发送的。推送消息从根本上就是设计用于与应用程序通信的。它们可以发送文本、多媒体文件和特定于应用程序的数据,例如警告声音和显示在应用程序图标上的标记等。推送通知非常适合智能手机应用,但与基于运营商的移动消息传递相比,它们的普及性和可靠性都较差。
友盟(Umeng)以移动应用统计分析的服务为起点成立公司,移动应用统计分析和移动游戏统计分析服务的竞争力比较强,消息推送平台的服务质量有待我们亲测。
个推(GeTui)被称作国内最专业的第三方消息推送技术服务商。
目前的几个主要的大的推送方,可以划分为两类:一类是像个推、极光这样的只做推送,以推送为唯一业务与核心竞争力的,另一类是像百度、信鸽(腾讯)、小米、华为这样背靠大山,依托自己已有的生态系统与数据的推送商。
*数据来源:2014-个推官方网站动态
友盟推送完全免费。
新注册个推的开发者所在公司是初创企业,即可免费使用。
初创企业的具体定义,满足其中之一即可:
当您不满足以上初创企业的标准,可申请成为个推的付费用户,详情可咨询个推商务(tonglj@getui.com)或查看个推微信公众号(getui2010)。
常用功能 | 友盟 | 个推 |
---|---|---|
通知消息 | √ | √ |
透传消息 | √ | √ |
SDK休眠 | √ | √ |
用户贴标签 | √ | √ |
用户关系映射 | Alias? | √ |
统计分析 | √ | √ |
通知消息:发送后会在系统通知栏收到展现,同时响铃或振动提醒用户.
透传消息:发送后不会在系统通知栏展现,SDK将消息传给第三方应用后需要开发者写展现代码才能看到.
摘自:个推SDK常见问题2015
透传消息
透传消息,即自定义消息,个推只负责消息传递,不做任何处理,客户端在接收到透传消息后需要自己去处理消息的展示方式或后续动作。
透传消息类型
透传消息类型,即setTransmissionType(),是消息模版里的一个参数,判断“是否立即打开应用”。
包括1和2两种类型:
1为强制打开应用,客户端SDK接收到消息后会立即启动客户端应用;
2为等待客户端应用启动。
目前这两种类型的功能只支持Android,iOS不支持,所以iOS填写几都可以。
*注意:如果群推时,Android和iOS都推送,就要写成类型2了,这样的话,Android客户端接收到消息后就不会直接启动应用。
接收“透传消息”的案例
在第三方应用中接收透传消息(Payload Message),需要新建BroadcastReceiver子类。
需要AndroidManifest.xml中配置该类的完整路径,一般为:包名.类名。
示例:
比如示例代码中包名:com.getui.demo,类名:PushDemoReceiver。则其完整路径是:com.getui.demo.PushDemoReceiver(包名.类名)
则在AndroidManifest.xml中配置该类的完整路径如下:
<!-- 配置第三方Receiver -->
<receiver
android:name="com.getui.demo.PushDemoReceiver"
android:exported="false" >
<intent-filter>
<!-- 替换为action android:name="com.igexin.sdk.action.第三方应用APPID" -->
<action android:name="com.igexin.sdk.action.etVyv7RHJ28BqN3KKCtKJ6" />
</intent-filter>
</receiver>
BroadcastReceiver子类PushDemoReceiver示例代码如下:
package com.getui.demo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.igexin.sdk.PushConsts;
public class PushDemoReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Log.d("GetuiSdkDemo", "onReceive() action=" + bundle.getInt("action"));
switch (bundle.getInt(PushConsts.CMD_ACTION)) {
case PushConsts.GET_MSG_DATA:
// 获取透传(payload)数据
byte[] payload = bundle.getByteArray("payload");
if (payload != null)
{
String data = new String(payload);
Log.d("GetuiSdkDemo", "Got Payload:" + data);
// TODO:接收处理透传数据
}
break;
//添加其他case
//.........
default:
break;
}
}
}
*具体代码可参照DEMO中的com.getui.demo.PushDemoReceiver类
状态:开启、休眠、关闭、终止;
public void stopService(Context context)
指定者:
接口 PushManager 中的 stopService
public boolean setSilentTime(Context context,int beginHour,int duration)
参数:
beginHour–开始时间,设置范围在0-23小时之间
Duration–持续时间,设置范围在0-23小时之间。持续时间为0则不静默。
返回值:
true:设置成功
false:设置失败
举例:
比如设置beginHour为15,Duration为10小时,则在15:00-次日1:00这10个小时内SDK将不会联网。
public void turnOnPush(Context context)
补充:
优先级高于stopService,如果当前是stopService状态,调用turnOnPush之后
仍然可以正常推送。
public void turnOffPush(Context context)
public boolean isPushTurnedOn(Context context)
返回值:
true:当前推送已打开
false:当前推送已关闭
个推的用户分类功能:
分类后,服务端可以根据用户的类型推送消息;
为用户设置标签
public int setTag(Context context,Tag[] tag)
指定者:
接口 PushManager 中的 setTag
参数:
context–上下文
tag-标签,参见Tag
返回值:
0:成功
20001:tag数量过大(单次设置的tag数量不超过100)
20002:设置频率过快(频率限制每小时一次)
20003:标签重复
20004:aidl服务未绑定
20005:setTag异常
*注:标签的设定,一定要在获取到Clientid之后才可以设定。标签的设定,服务端限制一天只能成功设置一次
在您应用程序主Activity里导入PushManager如下所示:
import com.igexin.sdk.PushManager;
然后在您应用程序启动初始化阶段,初始化SDK:
PushManager.getInstance().initialize(this.getApplicationContext());
该方法必须在Activity或Service类内调用。一般情况下,可以在Activity的onCreate()方法中调用。
由于应用每启动一个新的进程,就会调用一次Application的oncreat方法。而个推SDK是一个独立的进程,会导致在一个应用中至少调用2次Application的onCreate(),这样会影响应用的处理逻辑,所以不建议在Application继承类中调用。
为保证意外情况导致初始化失败,建议应用程序每次启动时都调用一次该初始化接口。
在应用的主Activity onCreate()
函数中开启推送服务
PushAgent mPushAgent = PushAgent.getInstance(context);
mPushAgent.enable();
可以通过接口mPushAgent.disable();
来关闭客户端的通知服务。
通过mPushAgent.isEnabled()
来查询状态。 状态表示有没有启用/关闭推送功能, 不表示推送后台服务的运行状态。
*注意
如果你的应用继承了Application, 不要在Application onCreate()
中调用 mPushAgent.enable();
,由于SDK 设计的逻辑, 这会造成循环。
在所有的Activity 的onCreate() 函数添加
PushAgent.getInstance(context).onAppStart();
*注意
如果不调用此方法,将会导致按照"几天不活跃"条件来推送失效。可以只在应用的主Activity中调用此方法,但是由于SDK的日志发送策略,不能保证一定可以统计到日活数据。
作者 DefinedOne