仓库地址: https://pub.dartlang.org/packages/dalipush
因为阿里的推动对小米和华为的离线推送兼容的比较好, 因此, 我使用 flutter 将阿里推送封装了一下, 效过图, 如下所示, 这里是战士的将进程杀死之后, 小米设备收到的推送效果.
小米里面推送示例
HOW TO USE
一, 资源申请
1, 首先, 你需要到阿里云上面去申请一个 appid, 申请地址: 阿里云 https://emas.console.aliyun.com/
2, 注意, 如果你需要小米, 华为离线推送的话, 需要参考这里 参考, 注意, 华为的离线推送测试一定要等到审核通过之后
二, Andriod 方面
1, 写一个 application 继承自 FlutterApplication
注意, 这个是阿里推送的要求
移动推送的初始化必须在 Application 中, 不能放到 Activity 中执行. 移动推送在初始化过程中将启动后台进程 channel, 必须保证应用进程和 channel 进程都执行到推送初始化代码. 如果设备成功注册, 将回调 callback.onSuccess() 方法. 但如果注册服务器连接失败, 则调用 callback.onFailed 方法, 并且自动进行重新注册, 直到 onSuccess 为止.(重试规则会由网络切换等时间自动触发.) 请在网络通畅的情况下进行相关的初始化调试, 如果网络不通, 或者 App 信息配置错误, 在 onFailed 方法中, 会有相应的错误码返回, 可参考错误处理.
- public class FApp extends io.flutter.App.FlutterApplication {
- private static final String TAG = "FApp";
- @Override
- public void onCreate() {
- super.onCreate();
- initCloudChannel(this);
- ////// 注意, 下面是小米华为的辅助通道, 是一种黑科技, 可以在进程杀死的情况下, 收到推送消息, 所谓的离线推送,
- ///// 如果需要, 注意读一下下面一节, 服务端代码那块, 如果不需要, 直接注释 2 行, 可以满足 App 在线收到通知
- // 注册方法会自动判断是否支持小米系统推送, 如不支持会跳过注册.
- MiPushRegister.register(this, "2882303761517882020", "5671788227020");
- // 注册方法会自动判断是否支持华为系统推送, 如不支持会跳过注册.
- HuaWeiRegister.register(this);
- //GCM/FCM 辅助通道注册, 这个地方打开的情况我没测试, 不过, GCM 你懂的.
- // GcmRegister.register(this, sendId, applicationId); //sendId/applicationId 为步骤获得的参数
- }
- /**
- * 初始化云推送通道
- *
- * @param applicationContext
- */
- private void initCloudChannel(Context applicationContext) {
- PushServiceFactory.init(applicationContext);
- CloudPushService pushService = PushServiceFactory.getCloudPushService();
- pushService.register(applicationContext, new CommonCallback() {
- @Override
- public void onSuccess(String response) {
- Log.d(TAG, "init cloudchannel success");
- }
- @Override
- public void onFailed(String errorCode, String errorMessage) {
- Log.d(TAG, "init cloudchannel failed -- errorcode:" + errorCode + "-- errorMessage:" + errorMessage);
- }
- });
- }
- }
2, 服务端代码, 离线推送是需要后端配合的, 后台按照阿里推送的文档部署好了之后, 你可以做成管理端, 并封装这样的一个接口, 来推送消息.
- // 服务端配置如下:
- PushRequest pushRequest = new PushRequest();
- // 其余设置省略
- // ...
- // 0: 表示消息 (默认为 0), 1: 表示通知
- pushRequest.setType(1);
- // 标题
- pushRequest.setTitle("hello");
- // 内容
- pushRequest.setBody("PushRequest body");
- // 点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开 AndroidActivity "URL" : 打开 URL "NONE" : 无跳转
- pushRequest.setAndroidOpenType("APPLICATION");
- // 设置辅助弹窗打开 Activity, 注意, 这里我配置为了, com.brzhang.dalipush.PopupPushActivity
- pushRequest.setAndroidPopupActivity("com.brzhang.dalipush.PopupPushActivity");
- // 设置辅助弹窗通知标题
- pushRequest.setAndroidPopupTitle("hello2");
- // 设置辅助弹窗通知内容
- pushRequest.setAndroidPopupBody("PushRequest body2");
- // 设定 Android 类型设备通知的扩展属性
- pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
请你们的后端开发注意, 这里的 setAndroidPopupActivity 可默认配置为
"com.brzhang.dalipush.PopupPushActivity", 我的插件中集成了这个 activity, 当然, 你完全可以替换为自己的 activity, 只需要在 Android 目录下去
3, 修改 build.gradle 文件
- defaultConfig {
- // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId "com.brzhang.sophixtest"
- minSdkVersion 16
- targetSdkVersion 27
- versionCode flutterVersionCode.toInteger()
- versionName flutterVersionName
- testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
- manifestPlaceholders = [
- ALIPUSH_PKGNAME : applicationId,
- ALIPUSH_APPKEY : "24xxxx5693", //ALIPush 上注册的包名对应的 appkey.
- ALIPUSH_APPSECRET: "dd973xxxxxxxxxxxf575aee1ab1", //appsecret.
- ]
- //todo
- // ndk {
- // // 选择要添加的对应 CPU 类型的. so 库.
- // abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'armeabi-v8a'
- // }
- }
主要是两个地方注意: 一个是 applicationId, 这里要填你在阿里上申请的 appid 相关的那个包名 二个是 manifestPlaceholders, 这里也注意填写你自己的阿里云 key,secret.
4, 请注意, 不要使用我的 appid 到你的项目中, 你用了也没办法推送, 因为, 要等登陆我的账号去发推送消息啊.
三, iOS 方面.
iOS 使用起来就没有那么复杂了, 唯一的是: iOS 需要去配置 APNS 推送证书, 可以参考阿里推送 iOS 配置文档, 到苹果开发者中心申请的步骤也是繁琐的一逼, 不过, 搞过一次之后, 你就会发现非常简单, 最后导出的 p12 文件交给阿里 push 就好.
然后, 你的 iOS 工程中的配置, 可以参考本项目 example 目录下的配置,
1,appDelegate.m 文件
2,AliyunEmasServices-info.plist 的导入
3,pod 文件编写
大概经历这些步骤, cmd+r
就 ok 了.
来源: https://www.qcloud.com/developer/article/1360493