Skip to content

一、集成友盟推送

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一致 【很重要】

40240887.png

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 63481227.png 所需lib和so 63945588.png

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>

Released under the MIT License.