Cobub Razor 华为推送插件

它集成了华为的推送功能与Cobub Razor提供的Tag功能,更加方便,快捷,精准的进行推送。
华为联盟开放平台帮助企业的应用通过低成本互联网通道进行消息推送,提供完善、高效、稳定的服务体系解决了互联网云端到手机端的消息互通问题。

1.注册为Cobub用户中心账户

Cobub用户中心是一个面向移动开发者的服务平台,针对移动开发过程中的产品生命周期过程,整合Cobub Razor平台的移动应用数据,提供系列的增值服务。移动开发者在Cobub用户中心可以一站式的解决产品遇到的各种问题。

用户需要注册为Cobub用户中心的正式用户后,方可使用华为推送插件服务。

尚未注册,立即前往Cobub用户中心注册


2.获取授权码并在Cobub Razor授权模块中进行认证

授权码是Cobub Razor与用户中心交互的秘钥,用户需要获取秘钥后方能在Cobub Razor账户授权模块中进行授权。

账户授权后方能使用Cobub用户中心提供的丰富的Cobub Razor扩展功能与增值服务。

获取授权码并在Cobub Razor授权模块中进行认证


3.将华为推送插件代码集成到Cobub Razor中

在Cobub Razor 0.7版本以上,Cobub Razor开放了插件功能. 华为推送插件基于Cobub Razor现有结构编写。并默认集成于Cobub Razor中。

如果用户尚未安装此插件,可以将插件代码下载后拷贝至Cobub Razor applications 目录。

代码集成后,用户在我的插件模块中即可看到当前安装的所有插件列表,找到华为推送插件,并激活。

激活后您即可使用华为推送插件功能。


4.注册华为推送应用

若要使用华为推送插件中的推送,系统需要为每个App(当前只支持Android平台)分配相应的授权Key.获取的授权key需要配置到从Cobub用户中心下载的SDK中。

具体SDK集成指南,请详见 华为推送SDK集成指南


5.华为推送SDK集成指南

在集成华为推送插件之前,确保数据库相关表的建立,可以到这里下载相关的sql文件,导入到你的数据库中,创建相关表(注意修改表sql里的前缀razor_,以保持和你自己数据库中表前缀一致)。
下载下来的华为推送SDK为.rar文件,在本地解压后,进入“微内核SDK\Doc”目录,参考Doc目录下的《华为PushSDK集成说明.pdf》文档集成华为推送SDK

集成步骤
1.集成jar包:
    将获取到cobub razor的ums.jar添加到你创建应用的libs目录下。
在项目上右键选择Build Path->Configure build path..—>左侧选择 Java Build Path—>选择Libraries选择卡—>Add JARs.. —>选择当前项目的Libs目录,选中jar包,然后点击OK. 如图:
payload
2.修改华为推送SDK项目包名与您创建应用的包名相一致。
3.配置AndroidManifest.xml文件。
* 添加授权
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="com.android.mylauncher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.READ_LOGS"/>
* 加入服务声明
<receiver android:name="PACKAGENAME.receiver.MyReceiver" />
<intent-filter/>
<action android:name="com.huawei.android.push.intent.REGISTRATION" />
<action android:name="com.huawei.android.push.intent.RECEIVE" />
<action android:name="com.huawei.intent.action.PUSH_STATE" />
<action android:name="com.huawei.android.push.plugin.RESPONSE" />
</intent-filter>
</receiver>

备注:Push相关的android组件需要添加到业务的AndroidManifest.xml, Push相关android组件运行在另外一个进程是为了防止Push服务异常而影响主业务

PushSDK:PushSDK接收外部请求事件入口

<receiver android:name="com.huawei.deviceCloud.microKernel.push.EventReceiver" android:process=":pushservice" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="com.huawei.android.push.intent.REFRESH_PUSH_CHANNEL" />
<action android:name="com.huawei.android.push.intent.REGISTER" />
<action android:name="com.huawei.intent.action.PUSH" />
<action android:name="com.huawei.intent.action.PUSH_ON" />
<action android:name="com.huawei.android.push.PLUGIN" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
<meta-data android:name="CS_cloud_version" android:value="\u0032\u0035\u0031\u0033" />
</receiver>

PushSDK:Push服务

<service android:name="com.huawei.deviceCloud.microKernel.push.PushMKService" android:process=":pushservice" >
</service>

PushSDK:富媒体呈现页面,用于呈现服务器下发的富媒体消息

<activity android:name="com.huawei.deviceCloud.microKernel.push.RichPushActivity" android:process=":pushservice" android:configChanges="orientation|screenSize" android:theme="@android:style/Theme.Translucent" >
<intent-filter>
<action android:name="com.huawei.android.push.intent.RICHPUSH" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

PushSDK:用于标识Appid信息

<meta-data android:name="APPKEY" android:value="5" >
</meta-data>

PushSDK:用于标识渠道信息

<meta-data android:name="CHANNEL" android:value="push" >
</meta-data>

UMS appkey

<meta-data android:name="UMS_APPKEY" android:value="APPKEY">
</meta-data>
4.添加SendMapping.java映射文件:将SendMapping.java文件放在'..\src\项目名'目录下

代码: package PACKAGENAME; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.util.Log; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; import org.json.JSONException; import org.json.JSONObject; import com.wbtech.ums.UmsAgent; import com.wbtech.ums.common.CommonUtil; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; public class SendMapping extends BroadcastReceiver { public static String NAME = "BroadcastReceiver2SendMapping"; boolean isGetCobubBroadcoast = false; boolean isGetHuaWeiBroadcoast = false; String serviceURL = "http://push.cobub.com/index.php?/api/huawei/postmapping"; public SendMapping() { } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Log.d(NAME,"SendMapping onReceive"); //注册 receiver // SendMapping receiver = new SendMapping(); // IntentFilter filter = new IntentFilter(); // filter.addAction("cobub.razor.message"); // filter.addAction("com.huawei.android.push.intent.REGISTRATION"); // registerReceiver(receiver, filter); String action = intent.getAction(); SharedPreferences sp= context.getSharedPreferences("cobub_huawei_sharepreference", 0); if(action.equals("cobub.razor.message")){ String deviceid = intent.getStringExtra("deviceid"); Log.d("postdata ", "get deviceid : "+deviceid); sp.edit().putString("deviceid", deviceid).commit(); isGetCobubBroadcoast = true; } if(action.equals("com.huawei.android.push.intent.REGISTRATION")){ String deviceToken; try { deviceToken = new String(intent.getByteArrayExtra("device_token"), "UTF-8"); sp.edit().putString("deviceToken", deviceToken).commit(); Log.d("postdata ", "get deviceToken : "+deviceToken); isGetHuaWeiBroadcoast = true; } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(isGetCobubBroadcoast&& isGetHuaWeiBroadcoast){ final JSONObject obj = new JSONObject(); String deviceid = sp.getString("deviceid", ""); String deviceToken = sp.getString("deviceToken", ""); try { obj.put("deviceToken", deviceToken); obj.put("deviceid", deviceid); obj.put("app_key", CommonUtil.getAppKey(context)); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.d("postdata ", "post deviceid and deviceToken"); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub post(serviceURL,obj.toString()); isGetCobubBroadcoast = false; isGetHuaWeiBroadcoast = false; } }).start(); } } public static int post(String url, String data) { String returnContent = ""; HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); Log.d("postdata", "SMpost"+url+" "+data); try { StringEntity se = new StringEntity("content="+data, HTTP.UTF_8); se.setContentType("application/x-www-form-urlencoded"); httppost.setEntity(se); HttpResponse response = httpclient.execute(httppost); int status = response.getStatusLine().getStatusCode(); Log.d("postdata ", "status==="+status); String returnXML = EntityUtils.toString(response.getEntity()); returnContent = URLDecoder.decode(returnXML); switch (status) { case 200: { Log.d("postdata ", "status===200"); JSONObject obj = new JSONObject(returnContent); return obj.getInt("flag"); } default: Log.d("postdata ", "status="+status); break; } } catch (Exception e) { e.printStackTrace(); JSONObject jsonObject = new JSONObject(); try { jsonObject.put("err", e.toString()); returnContent = jsonObject.toString(); } catch (JSONException e1) { e1.printStackTrace(); } } Log.d("postdata ", "post deviceid error deviceToken"); return 0; } }


5. 初始化SDK
在您应用程序主Activity里导入MessageManager如下所示:
com.wbtech.ums.UmsAgent;
然后在您应用程序启动初始化阶段,初始化SDK:
UmsAgent.setBaseURL("http://localhost/cobub/razor/web/index.php?");
UmsAgent.update(this);
UmsAgent.onError(this);
UmsAgent.setDefaultReportPolicy(this, 1);
UmsAgent.bindUserIdentifier(this, "xd..");
UmsAgent.postClientData(this);
//注册 receiver
SendMapping receiver = new SendMapping();
IntentFilter filter = new IntentFilter();
filter.addAction("cobub.razor.message");
filter.addAction("com.huawei.android.push.intent.REGISTRATION");
registerReceiver(receiver, filter);
该方法必须在Activity或Service类内调用。一般情况下,可以在Activity的onCreate()方法中调用
为保证意外情况导致初始化失败,建议应用程序每次启动时都调用一次该初始化接口。

注意:

PACKAGENAME替换为当前项目的包名.

APPKEY替换为cobub razor 创建应用时获取到的appkey.


6.使用华为推送服务

完成前面步骤后,您即可使用插件的推送服务。

进入插件华为推送首页,插件会读取所有当前系统中的Android应用列表。

在每个应用后都有推送这个操作。点击进入推送详细界面,根据要求选择标签或者整个APP推送,填写相关内容并进行推送。


7.查看华为推送报告

进入插件中的推送报告模块,用户可以查看用户推送的报告。注:系统只支持30日内推送报告查询服务。用户可通过右上角选择时间段。

推送报告显示了所有激活的APP的推送报告,点击单个APP查看单个应用的推送报告。


8.账户与结算

华为推送插件按月结算,系统会每个月根据用户上个月的用户所有APP在线用户总数来进行结算。

华为推送插件的收费是按照当月在线人数结算,与推送次数无关。

为保证推送服务正常进行,请到个人中心账户充值模块预先充值。


如何获取Package Name?

应用标识(Package Name),常以com开头

方法:

1. 手机上打开你的应用
2. 点击设置 -> 应用程序 -> 管理应用程序 -> 正在运行,在列表中找到你的程序
3. 在进程中可以看到应用的应用标识(Package Name)