一、集成友盟推送
1. 准备工作
1.注册友盟开发账号 2.上传应用 获取AppKey和Umeng Message Secret 3.下载友盟SDK 4.新建cordova插件【怎么新建cordova插件可以参考:新建cordova插件.md】 5.查看文档的开发流程 参考:https://developer.umeng.com/docs/66632/detail/66744
二、集成开发
1. 新建ionic项目
2. 修改config.xml中的id和name,这边的id需要跟友盟上传的应用id一致 【很重要】
3. 加入安卓或者ios平台
4. 将插件集成进ionic 项目中
5. 用Android Studio打开android平台代码,查看插件是否已经成功加入。
6. 加入所需lib和so包、自定义Application
注意开发文档中提到的:初始化方法由基础组件包提供,要使用PushSDK,必须在工程的自定义Application类的 onCreate() 方法中调用基础组件包提供的初始化函数
跟其他的推送不一样,友盟规定了app启动就必须注册友盟通知,就没有其他的第三方推送说的,启动app之后开启通知的说法。 根据要求新建UMApplication继承Application,在onCreate方法里完成友盟的注册功能,具体实现如下:
java
package com.ai.ced.umpush;
import android.app.Application;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.util.Log;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.message.IUmengRegisterCallback;
import com.umeng.message.PushAgent;
/**
* Created by yd on 2019/3/11.
*/
public class UMApplication extends Application {
private static final String TAG = UMApplication.class.getSimpleName();
private SharedPreferences.Editor editor;
@Override
public void onCreate() {
super.onCreate();
// 将token 保存进token.xml文件中
SharedPreferences tokenSP = getSharedPreferences("token", 0);
editor = tokenSP.edit();
String appKey = "";
String message_secret = "";
try {
ApplicationInfo appInfo = this.getPackageManager()
.getApplicationInfo(this.getPackageName(),PackageManager.GET_META_DATA);
appKey = appInfo.metaData.getString("UM_APPKEY");
message_secret = appInfo.metaData.getString("UM_MESSAGE_SECRET");
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
// 在此处调用基础组件包提供的初始化函数 相应信息可在应用管理 -> 应用信息 中找到 http://message.umeng.com/list/apps
// 参数一:当前上下文context;
// 参数二:应用申请的Appkey(需替换);
// 参数三:渠道名称;
// 参数四:设备类型,必须参数,传参数为UMConfigure.DEVICE_TYPE_PHONE则表示手机;传参数为UMConfigure.DEVICE_TYPE_BOX则表示盒子;默认为手机;
// 参数五:Push推送业务的secret 填充Umeng Message Secret对应信息(需替换)
UMConfigure.init(this, appKey, "Umeng", UMConfigure.DEVICE_TYPE_PHONE, message_secret);
PushAgent mPushAgent = PushAgent.getInstance(this);
//注册推送服务,每次调用register方法都会回调该接口
mPushAgent.register(new IUmengRegisterCallback() {
@Override
public void onSuccess(String deviceToken) {
//注册成功会返回device token
Log.v(TAG,"推送服务注册成功");
Log.v(TAG,"my device token = " + deviceToken);
// 保存token
editor.putString("token",deviceToken);
editor.commit();
}
@Override
public void onFailure(String s, String s1) {
Log.v(TAG,"推送服务注册失败");
Log.v(TAG,"s=" + s);
Log.v(TAG,"s1=" + s1);
}
});
}
}
配置自定义的Application 所需lib和so
7. 开发UMPushPlugin
java
package com.ai.ced.umpush;
import android.app.Activity;
import android.util.Log;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.message.IUmengCallback;
import com.umeng.message.PushAgent;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* This class echoes a string called from JavaScript.
*/
public class UMPushPlugin extends CordovaPlugin {
public static final String TAG = "UMPushPlugin";
public static Activity activity;
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
Log.d(TAG,"execute");
activity = this.cordova.getActivity();
if (action.equals("stopUMPushSDK")){
this.stopUMPushSDK("",callbackContext);
}
return false;
}
/**
* 关闭通知
* @param message
* @param callbackContext
*/
private void stopUMPushSDK(String message, CallbackContext callbackContext){
// 获取推送实例
PushAgent mPushAgent = PushAgent.getInstance(activity);
// 关闭推送
mPushAgent.disable(new IUmengCallback() {
@Override
public void onSuccess() {
Log.d(TAG,"关闭推送成功");
}
@Override
public void onFailure(String s, String s1) {
Log.d(TAG,"关闭推送失败");
}
});
}
}
8. 配置权限
xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_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.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_ADDED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_INSTALL" />
<uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
9. 配置UM_APPKEY 、UM_MESSAGE_SECRET
xml
<meta-data android:name="UM_APPKEY" android:value="5c7f92043fc1953c52000818" />
<meta-data android:name="UM_MESSAGE_SECRET" android:value="a7c455d1f0bc94547ac2f4dcb67108d7" />
10. 配置所需service、provider
xml
<service android:exported="true" android:name="com.taobao.accs.ChannelService" android:process=":channel">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.SERVICE" />
</intent-filter>
<intent-filter>
<action android:name="com.taobao.accs.intent.action.ELECTION" />
</intent-filter>
</service>
<service android:exported="true" android:name="com.taobao.accs.data.MsgDistributeService">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.RECEIVE" />
</intent-filter>
</service>
<receiver android:name="com.taobao.accs.EventReceiver" android:process=":channel">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver android:name="com.taobao.accs.ServiceReceiver" android:process=":channel">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.COMMAND" />
</intent-filter>
<intent-filter>
<action android:name="com.taobao.accs.intent.action.START_FROM_AGOO" />
</intent-filter>
</receiver>
<service android:name="com.taobao.accs.internal.AccsJobService" android:permission="android.permission.BIND_JOB_SERVICE" android:process=":channel" />
<service android:name="com.taobao.accs.ChannelService$KernelService" android:process=":channel" />
<service android:exported="true" android:name="org.android.agoo.accs.AgooService">
<intent-filter>
<action android:name="com.taobao.accs.intent.action.RECEIVE" />
</intent-filter>
</service>
<service android:exported="true" android:name="com.umeng.message.UmengIntentService" android:process=":channel">
<intent-filter>
<action android:name="org.agoo.android.intent.action.RECEIVE" />
</intent-filter>
</service>
<receiver android:exported="true" android:name="com.taobao.agoo.AgooCommondReceiver" android:process=":channel">
<intent-filter>
<action android:name="${applicationId}.intent.action.COMMAND" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<service android:exported="true" android:name="com.umeng.message.UmengMessageIntentReceiverService" android:process=":channel">
<intent-filter>
<action android:name="org.android.agoo.client.MessageReceiverService" />
</intent-filter>
</service>
<receiver android:exported="false" android:name="com.umeng.message.NotificationProxyBroadcastReceiver" />
<service android:exported="false" android:name="com.umeng.message.UmengMessageCallbackHandlerService">
<intent-filter>
<action android:name="com.umeng.messge.registercallback.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.enablecallback.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.disablecallback.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.message.handler.action" />
</intent-filter>
<intent-filter>
<action android:name="com.umeng.message.message.sendmessage.action" />
</intent-filter>
</service>
<service android:exported="false" android:name="com.umeng.message.UmengDownloadResourceService" />
<provider android:authorities="${applicationId}.umeng.message" android:exported="false" android:name="com.umeng.message.provider.MessageProvider">
<grant-uri-permission android:pathPattern=".*" />
</provider>