国内第三方移动推送对接调查:Android、IOS、Flutter,各种云推送、个推、极光、统一推送联盟

前言

第三方移动推送对接,刚开始是移动端发起的。在开会讨论这个对接时,心里突然很迷茫,为什么要做第三方移动推送对接?我们自己为什么不能做移动推送?

话说,项目里目前所使用的推送就是自己做的。但是在App离线情况下,消息就收不到了。想起来了,这是最最重要的问题,是为了在离线的情况下,App还能收到通知和消息。如果不是因为这个,这个对接可以不做。

因为手机端的app层不出穷太多了,为了给手机省电,用户会主动把运行在前端的app给咔嚓掉…虽然咔嚓掉,但是在有信息的情况下,用户还是希望能够收到信息。所以,很多自主研发的App都选择第三方移动推送,保证用户在离线的情况下也能够收到通知或信息。选择第三方移动推送,对于中小型App来说,绝对是一件省心、省钱、节约时间的好事儿。


一、来自小组成员的争议

目前国内市场上第三方移动推送服务犹如雨后春笋般一个接一个:极光、个推、阿里云移动推送、腾讯云移动推送、华为云移动推送、百度云移动推送、MobPush、小米移动推送,还有几年前就已经名声在外的统一推送联盟。这些都是程序员口中津津乐道的移动推送服务。

到底使用哪一家移动推送,团队成员各有异议。看了几本关于Android开发的书,其中一个有十几年Android开发经验的作者建议使用腾讯信鸽的推送,它的推送服务相对健全,对接的厂商涵盖较多。统一推送联盟,虽然几年前就被大家所熟知,但是不知道目前是什么情况。老板最关心的是价格,巴不得团队成员能够自主开发。

还有个同事,建议直接对接厂商,很不赞同,一个厂商一个厂商的对接过去,这要花费多久?真不确定,肯定会延迟项目进度的。

既然如此,异议如此多,那就做个调查吧!

二、开启调查

把大家所关心的事项都列进去:是否收费、对接难易度,对接文档是否健全,离线后是否能够收到通知,每个厂商是否需要单独对接等等。

移动推送服务参考文档地址
MobPush推送一、官网:https://mob.com/mobService/mobpush
二、开发者平台:https://new.dashboard.mob.com/#/mobPush/pushSet
三、移动端对接文档地址:
1、flutter:https://mob.com/wiki/detailed?wiki=MobPushForFlutterfenlei&id=136
2、Android:https://mob.com/wiki/detailed?wiki=MobYXXYMobpushAndroid&id=136
3、ios:https://mob.com/wiki/detailed?wiki=MobTechprivacypushios&id=136
四、服务器对接参考地址
https://mob.com/wiki/detailed?wiki=MobPushRestAPIfenlei1333&id=136
五、补充文档:
https://www.mob.com/wiki/detailed?wiki=MobPush_chanpinjianjie&id=136
极光推送一、官网:https://www.jiguang.cn
二、开发者平台:https://www.jiguang.cn/accounts/login/form?nextUrl=%2Faccounts%2Fplatform
三、移动端对接文档地址:
1、Android:https://docs.jiguang.cn//jpush/client/Android/android_api/
2、IOS: https://docs.jiguang.cn//jpush/client/iOS/ios_api/
3、flutter端对接引用插件(jpush_flutter)参考链接:
https://pub.flutter-io.cn/packages/jpush_flutter/install
https://www.jianshu.com/p/c58e1f923d32
四、服务器对接参考地址:
https://docs.jiguang.cn//jpush/server/push/rest_api_v3_push/
https://docs.jiguang.cn//jpush/server/server_sdk/
友盟推送一、官网:https://www.umeng.com/
二、开发者平台:https://www.umeng.com/push
三、移动端对接文档地址:
1、Android:https://developer.umeng.com/docs/67966/detail/173238
2、IOS:https://developer.umeng.com/docs/67966/detail/207215
3、flutter端:https://developer.umeng.com/docs/67966/detail/216307
四、服务器对接参考地址:
https://developer.umeng.com/docs/67966/detail/149296#h1-u670Du52A1u7AEFu4EE3u7801u8C03u7528u793Au4F8B13
百度云推送一、官网:http://push.baidu.com/
二、开发者平台:http://push.baidu.com/console/app
三、移动端对接文档地址:
1、Android:http://push.baidu.com/doc/android/api
2、IOS:http://push.baidu.com/doc/ios/api
3、flutter端:暂未找到;
三、多厂商集成:http://push.baidu.com/doc/guide/manufacturer
四、服务器对接参考地址:http://push.baidu.com/doc/java/api
个推一、官网:https://www.getui.com
二、开发者平台:https://www.getui.com/push
三、移动端对接文档地址:
1、Android端:https://docs.getui.com/getui/mobile/android/androidstudio/
2、IOS端:https://docs.getui.com/getui/mobile/ios/xcode/
3、flutter端:https://pub.flutter-io.cn/packages/flutter_getui;https://github.com/GetuiLaboratory/getui-flutter-plugin
4、多厂商集成:https://docs.getui.com/getui/mobile/vendor/vendor_open/
四、服务器对接参考地址:
https://docs.getui.com/getui/server/rest_v2/introduction/
腾讯云信鸽一、官网:https://intl.cloud.tencent.com/zh/product/tpns?lang=zh
二、开发者平台:https://intl.cloud.tencent.com/zh/product/tpns?lang=zh
三、移动端对接文档地址:
1、Android端:https://intl.cloud.tencent.com/zh/document/product/1024/35769
2、IOS端:https://intl.cloud.tencent.com/zh/document/product/1024/35770
3、flutter端:https://pub.flutter-io.cn/packages/tpns_flutter_plugin
4、多厂商集成:https://intl.cloud.tencent.com/zh/document/product/1024/35286
四、服务器对接参考地址:
https://intl.cloud.tencent.com/zh/document/product/1024/33755
五、收费地址:https://intl.cloud.tencent.com/zh/document/product/1024/36877
华为云移动推送一、官网:https://developer.huawei.com/consumer/cn/hms/huawei-pushkit/
二、开发者平台:https://developer.huawei.com/consumer/cn/hms/huawei-pushkit/
三、移动端对接文档地址:
1、Android端:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/android-app-quickstart-0000001071490422
2、IOS端:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/ios-dev-progress-0000001062221191
3、flutter端:https://pub.flutter-io.cn/packages/huawei_push
4、多厂商集成:暂未找到;
四、服务器对接参考地址:
https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/android-server-dev-0000001050040110
小米移动推送一、官网:https://dev.mi.com/console/appservice/push.html
二、开发者平台:https://admin.xmpush.xiaomi.com/zh_CN/app/unauth
三、移动端对接文档地址:
1、Android:https://dev.mi.com/console/doc/detail?pId=100
2、IOS:https://dev.mi.com/console/doc/detail?pId=98
3、flutter端对接引用插件:
https://pub.flutter-io.cn/packages/xiao_mi_push_plugin/install
https://blog.csdn.net/u013491829/article/details/109330207
四、服务器对接参考地址:
https://dev.mi.com/console/doc/detail?pId=1278
https://dev.mi.com/console/doc/detail?pId=1163
统一推送联盟参考文档:
https://mp.weixin.qq.com/s/P3b6YvwHalzp2f-a6EaNag
https://mp.weixin.qq.com/s/ZZVgfnprOg8jALkfh8Wn1w
https://www.mobileservice.cn/
https://push.mobileservice.cn/index.html

三、调查结果

通过调查发现,每个第三方推送都有免费额度,但是想要高质量的离线推送,还是要收费的。也就是说服务质量和收费是绑定的。如果想要免费的,那就别考虑离线到达率了。

每个第三方移动推送支持的厂商支都不少,基本上涵盖了市面上流行的厂商:华为、小米、魅族、OPPO、VIVO、FCM、IOS。统一推送联盟支持的厂商最多,达到15个左右,把市面上的厂商包含个够,但还在内测中,推送的对接并未对外开放。

对于是否单独对接SDK,除了华为移动推送对接外,第三方推送已经把每个厂商的SDK都集成了,所以代码不需要单独写对接代码,只需要到对应的厂商平台申请一下权限,配置一下相关参数即可。

对于离线推送,每个第三方移动推送,都会有一个第三方通道,这个第三方通道只能接收在线时的通知和消息。离线消息,只能走厂商通道,这个没得选。

对接文档,每家都有,示例demo也有。但是某些语言可能没有,比如flutter,可能某些第三方正在集成中。如果是使用Flutter开发的移动端,这个第三方移动推送就可以暂不考虑。

看了一下华为的对接demo,单是移动端的对接代码就有数百行,如果再加上其他厂商的,​脑补一下对接代码,那绝对有一定的工作量和后期维护量。被第三方集成的,简简单单,加一下配置就可以了,所以还是不建议​直接对接厂商。

总结

每个第三方移动推送都会有些概念让新手搞不懂,文档需要反复研读,最好多看几家文档,比对一下,也就明白了。

比如说,从服务器端发送的信息,分两种类型,一种是通知,在手机通知栏展示的,App离线和在线的情况下,手机都需要接收得到的;另一种是消息,是在App在线情况下推送的,无需在通知栏展示,App接收后默默地处理的。

在手机通知栏展示的,有些叫通知,有些叫离线通知。App在线可以接收到的信息,各家又各不相同,有些叫透传消息,有些叫在线消息。

对于离线通知,必须通过厂商推送,每家厂商又各有各的限制,对标题、内容,每部手机接收数量也都是有上限的。既然厂商通道的资源那么宝贵,各种限制,所以对于消息,或者说透传消息,可以考虑走第三方通道。当然,这个达到一定数量,需要向第三方移动推送交费的。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是Flutter集成极光推送的步骤: 1. 在极光官网注册账号并创建应用,获取AppKey。 2. 在Flutter项目中添加极光推送插件,如:jpush_flutter。 3. 在AndroidManifest.xml文件中添加以下代码: ```xml <!-- 极光推送权限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 极光推送服务 --> <service android:name="cn.jpush.android.service.PushService" android:enabled="true" android:exported="false" android:process=":pushcore" > <intent-filter> <action android:name="cn.jpush.android.intent.REGISTER" /> <action android:name="cn.jpush.android.intent.REPORT" /> <action android:name="cn.jpush.android.intent.PushService" /> <action android:name="cn.jpush.android.intent.PUSH_TIME" /> </intent-filter> </service> <receiver android:name="cn.jpush.android.service.PushReceiver" android:enabled="true" android:exported="false" > <intent-filter android:priority="1000"> <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> <category android:name="你的包名" /> </intent-filter> <intent-filter> <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED_PROXY" /> <category android:name="你的包名" /> </intent-filter> <intent-filter> <action android:name="cn.jpush.android.intent.REGISTRATION" /> <category android:name="你的包名" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.USER_PRESENT" /> <category android:name="你的包名" /> </intent-filter> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <category android:name="你的包名" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED" /> <data android:scheme="package" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.PACKAGE_REMOVED" /> <data android:scheme="package" /> </intent-filter> </receiver> ``` 4. 在iOS项目中,到极光官网下载JPush SDK并导入到项目中,在AppDelegate.m文件中添加以下代码: ```objective-c #import "JPUSHService.h" // iOS 10 及以上需导入 UserNotifications.framework #import <UserNotifications/UserNotifications.h> // Override point for customization after application launch. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 初始化 JPush SDK [JPUSHService setupWithOption:launchOptions appKey:@"your_appkey" channel:nil apsForProduction:NO]; return YES; } // 注册APNs成功并上报DeviceToken - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [JPUSHService registerDeviceToken:deviceToken]; } // 实现注册APNs失败接口 - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error); } // 添加处理APNs通知回调方法 #ifdef NSFoundationVersionNumber_iOS_9_x_Max // iOS 10之前收到通知 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { // Required, iOS 7 Support [JPUSHService handleRemoteNotification:userInfo]; completionHandler(UIBackgroundFetchResultNewData); } // iOS 10之前收到本地通知 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { // Required, iOS 7 Support [JPUSHService showLocalNotificationAtFront:notification identifierKey:nil]; } // iOS 10及以上收到通知 - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler { NSDictionary * userInfo = notification.request.content.userInfo; if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { [JPUSHService handleRemoteNotification:userInfo]; } completionHandler(UNNotificationPresentationOptionAlert | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound); } // iOS 10及以上收到本地通知 - (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler { NSDictionary * userInfo = response.notification.request.content.userInfo; if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { [JPUSHService handleRemoteNotification:userInfo]; } completionHandler(); } #endif ``` 5. 在Flutter代码中,初始化JPush并监听推送事件: ```dart import 'package:jpush_flutter/jpush_flutter.dart'; // 初始化JPush JPush jpush = new JPush(); // 监听推送事件 jpush.addEventHandler( onReceiveNotification: (Map<String, dynamic> message) async { print("Flutter onReceiveNotification: $message"); }, onOpenNotification: (Map<String, dynamic> message) async { print("Flutter onOpenNotification: $message"); }, onReceiveMessage: (Map<String, dynamic> message) async { print("Flutter onReceiveMessage: $message"); }, ); // 启动JPush jpush.setup( appKey: "your_appkey", // 极光官网申请的AppKey channel: "developer-default", // 渠道,默认值为“developer-default” production: false, // 是否生产环境 debug: true, // 是否开启调试模式 ); ``` 以上就是Flutter集成极光推送的步骤,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值