Oppo收不到推送及推送自动清空的解决,快速上手

2020-03-14 03:05 来源:未知

推送消息之所以被自动情况是因为:设置了省电模式!!!!

二.1、前提

想要使用FCM,需要满足如下几个条件

  • 设备必须是android4.0以上,Google Play Services 必须是 11.2.0以上版本
  • Android SDK Manager 必须有Google Play services SDK
  • Android Studio必须是1.5以上版本

其中的难处,就是用户手机必须可以连得上Google Play Services ,这个问题嘛,交给历史,如果你的app是面向境外的,那么一切是如此地丝滑。

3.第三步:在安卓的mainfast的配置文件中的key以及message_secret必须和网页中生成的一致

 

美高梅网投平台 1

image.png

前言

面对通话的通知需求,对方呼入,响起铃声和震动,提醒用户,对方挂断之后,铃声震动停止,普通的APNS通知,已经不能达到我们想要的效果,所以需要一种可以用通知就唤醒我们APP的技术,然后使用我们自己的代码进行本地通知,控制通知的出现和消失,苹果的解决方案就是VOIP,PushKit推送。

PushKit是苹果在iOS8之后推出的新框架,iOS10之后,苹果更是禁止VOIP应用在后台使用socket长链接,PushKit可以说是为了VOIP而生,满足实时性的同时,还能达到省电的效果,搭配苹果自己的CallKit,可以呈现出类似原生电话通话的效果。PushKit区别与普通APNs的地方是,它不会弹出通知,而是直接唤醒你的APP,进入回调,也就是说,可以在没点击APP启动的情况下,就运行我们自己写的代码,当然,推送证书和注册、回调的方法也和APNs不同,具体操作如下

参考链接: 该链接中沙发层回复可参考

二、接入FCM

6.由于是开发服务器端调用友盟推送,所以必须设置服务器的ip地址,下图告诉你如何查看本机的外网ip地址

 

美高梅网投平台 2

image.png

以上都是些设置,介绍一下消息推送所使用的一些场景
后台开启一个定时任务,比如每天晚上10点像全体用户发送推送消息。单点发送可以根据唯一的devicetoken发送消息给用户,因此可以把这个token和数据库中用户名进行绑定,根据用户名查询出token给指定用户发送即可。

其他代码可以通过下面的友盟推送java服务端代码以及友盟推送安卓客户端代码查看,这里主要对其进行了封装,各位可以看下有什么更好的方法封装,可以指出。

YoumengAndroidMain是主调用类

package youmeng;


import java.util.HashMap;
import java.util.Map;

import pushandroid.YoumengAndroidPush;

public class YoumengAndroidMain {
    public static void main(String[] args) {
        //1.广播,通过友盟推送给所有人发送信息
//      try {
//          YoumengAndroidMain yoMain = new YoumengAndroidMain();//这个在框架里可以直接用注入
//          Map mapAndroidAll = new HashMap<String, String>();
//          mapAndroidAll.put("appkey", "59e76d978f4a9d6888000113");  
//          mapAndroidAll.put("mastersecret", "6darv0eftbwqgzfprg40muvyzfpjrhpe");   
//          mapAndroidAll.put("ticker", "2017年10月19日ticker");
//          mapAndroidAll.put("title", "2017年10月19日title");
//          mapAndroidAll.put("text", "2017年10月19日text");
//          Map map = new HashMap<String, String>();
//          map.put("extrafieldkey", "key");
//          map.put("extrafieldvalue", "value");
//          mapAndroidAll.put("extrafield", map);
//          yoMain.sendYoumengAndroidAll(mapAndroidAll);
//      } catch (Exception e) {
//          System.out.println("发送失败");
//      }

        //2.通过友盟给指定用户推送
        try {
            YoumengAndroidMain yoMain = new YoumengAndroidMain();//这个在框架里可以直接用注入
            Map mapAndroidAll = new HashMap<String, String>();
            mapAndroidAll.put("appkey", "59e76d978f4a9d6888000113");  
            mapAndroidAll.put("mastersecret", "6darv0eftbwqgzfprg40muvyzfpjrhpe");   
            mapAndroidAll.put("devicetoken", "Am5T2vzQBapWZ1bBfdNKKk6-PTBcV2gZPPX8i5V4r9dO");
            mapAndroidAll.put("ticker", "2017年10月19日ticker");
            mapAndroidAll.put("title", "2017年10月19日title");
            mapAndroidAll.put("text", "2017年10月19日text");
            Map map = new HashMap<String, String>();
            map.put("extrafieldkey", "key");
            map.put("extrafieldvalue", "value");
            mapAndroidAll.put("extrafield", map);
            yoMain.sendYoumengAndroidUnicast(mapAndroidAll);
        } catch (Exception e) {
            System.out.println("发送失败");
        }
    }


    /**
     * 广播,通过友盟给所有人发送信息,在定时任务中定时执行全员发送
     * appkey,mastersecret是必传字段,ticker,title,text,extrafieldkey,extrafieldvalue是选填字段
     */
    public void sendYoumengAndroidAll(Map model) throws Exception{
        YoumengAndroidPush youMain = new YoumengAndroidPush();//到框架里的时候用@Component放到工厂里,用Autoriwed注入
        youMain.sendAndroidBroadcast(model);
    }

    /**
     * 通过友盟发送给指定用户,这个根据devicetoken给指定的app发送消息,这个devicetoken在给用户注册的时候可以记录下来,存到数据库
     * 这个token可以跟用户名进行绑定,根据用户名去查找token,这样就可以给指定用户发送消息了
     */
    public void sendYoumengAndroidUnicast(Map model) throws Exception{
        YoumengAndroidPush youmengPush = new YoumengAndroidPush();
        youmengPush.sendAndroidUnicast(model);
    }

}

YoumengAndroidPush.java主要通过httpclient将参数封装传到友盟进行推送。

package pushandroid;

import java.util.Map;

import pushandroid.android.AndroidBroadcast;
import pushandroid.android.AndroidUnicast;

public class YoumengAndroidPush {
    private String timestamp = null;
    private PushClient client = new PushClient();
    /**
     * 像所有的用户推送消息
     * appkey和mastersecret为必填项,ticker,title,text,extrafield为选填
     * 群发
     */
    public void sendAndroidBroadcast(Map model) throws Exception {
        if(null == model)
            return;
        if(null == model.get("appkey") || null == model.get("mastersecret"))
            return;
        String appkey = (String) model.get("appkey");
        String masterSecret = (String) model.get("mastersecret");
        AndroidBroadcast broadcast = new AndroidBroadcast(appkey,masterSecret);
        String ticker = (String) (model.get("ticker") == null?"测试":model.get("ticker"));
        String title = (String) (model.get("title")==null?"测试":model.get("title"));
        String text = (String) (model.get("text")==null?"测试,您好":model.get("text"));
        broadcast.setTicker(ticker);
        broadcast.setTitle(title);
        broadcast.setText(text);
        broadcast.goAppAfterOpen();
        broadcast.setDisplayType(AndroidNotification.DisplayType.NOTIFICATION);
        broadcast.setProductionMode();
        if(null != model.get("extrafield")){
            Map map = (Map) model.get("extrafield");
            String extrafieldkey = (String) (map.get("extrafieldkey")==null?"":map.get("extrafieldkey"));
            String extrafieldvalue = (String) (map.get("extrafieldvalue")==null?"":map.get("extrafieldvalue"));
            broadcast.setExtraField(extrafieldkey, extrafieldvalue);
        }
        client.send(broadcast);
    }

    /**
     * 单点发送,通过友盟推送给指定用户,这个token可以跟用户名进行绑定,根据用户名去查找token,这样就可以给指定用户发送消息了
     * appkey,mastersecret,devicetoken是必传字段,ticker,title,text,extrafieldkey,extrafieldvalue是选填字段
     */
    public void sendAndroidUnicast(Map model) throws Exception {
        if(null == model)
            return;
        if(null == model.get("appkey") || null == model.get("mastersecret") || null==model.get("devicetoken"))
            return;
        String appkey = (String) model.get("appkey");
        String masterSecret = (String) model.get("mastersecret");
        AndroidUnicast unicast = new AndroidUnicast(appkey,masterSecret);
        String ticker = (String) (model.get("ticker") == null?"测试":model.get("ticker"));
        String title = (String) (model.get("title")==null?"测试":model.get("title"));
        String text = (String) (model.get("text")==null?"测试,您好":model.get("text"));
        String devicetoken = (String) model.get("devicetoken");//上面已经判断过空的情况
        unicast.setDeviceToken( devicetoken);
        unicast.setTicker(ticker);
        unicast.setTitle(title);
        unicast.setText(text);
        unicast.goAppAfterOpen();
        unicast.setDisplayType(AndroidNotification.DisplayType.NOTIFICATION);
        unicast.setProductionMode();
        if(null != model.get("extrafield")){
            Map map = (Map) model.get("extrafield");
            String extrafieldkey = (String) (map.get("extrafieldkey")==null?"test":map.get("extrafieldkey"));
            String extrafieldvalue = (String) (map.get("extrafieldvalue")==null?"helloworld":map.get("extrafieldvalue"));
            unicast.setExtraField(extrafieldkey, extrafieldvalue);
        }
        client.send(unicast);
    }
    public static void main(String[] args) {
    }



}

友盟推送java服务端代码

友盟推送安卓客户端代码

 

原文链接:

 

关注我的公众号,都是满满的干货!

 

 

美高梅网投平台 3

孙坚.gif

1.注册推送证书

美高梅网投平台 4image.png

和注册普通的证书方法相同,我们只要类型选择VoIP Services Certificate注册就好,VoIP的证书只用一个生产环境(Production)的,开发环境(Development)也可以使用,不必纠结。

大致按如下步骤操作关闭省电模式即可:设置--电量和存储--电量管理--关闭超级省电

Firebase,Firebase是一家实时后端数据库创业公司,它能帮助开发者很快的写出Web端和移动端的应用。自2014年10月Google收购Firebase以来,用户可以在更方便地使用Firebase的同时,结合Google的云服务。

Google在今天2016的I/O大会上发表新版Firebase,Firebase是专为行动应用开发者所提供的后端服务平台(Backend as a Services,BaaS)。新版Firebase增加了免费的数据分析工具、云端讯息推播、通知系统、当机报告、远端配置及动态连结等功能,是继2014年10月Google收购Firebase后,18个月以来的一次大改版。

5.第五步:设置推送消息

 

美高梅网投平台 5

image.png

 

美高梅网投平台 6

image.png

Response Code : 400
{"ret":"FAIL","data":{"error_code":"2027"}}
Failed to send the notification!
2027是签名失败,我以为需要在安卓app打包的时候需要用
于是我进行签名打包,但是依然无作用

 

美高梅网投平台 7

image.png

 

美高梅网投平台 8

image.png

3.代码配置

工程和证书得设置好之后,就是我们代码的编写了:

 import PushKit

在AppDelege里倒入PushKit框架

let pushRegistry = PKPushRegistry.init(queue: DispatchQueue.main)pushRegistry.delegate = selfpushRegistry.desiredPushTypes = [PKPushType.voIP]

在didFinishLaunchingWithOptions使用代码注册,然后我们就要实现这个PKPushRegistryDelegate的回调方法

extension AppDelegate: PKPushRegistryDelegate { func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType) { let device = NSData(data: credentials.token) let deviceId = device.description.replacingOccurrences(of:"<", with:"").replacingOccurrences(of:">", with:"").replacingOccurrences(of:" ", with:"") print_debug("pushkit设备token:"   deviceId) } func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) { print_debug("收到pushkit推送!") print_debug(payload.dictionaryPayload) } }

(PS:print_debug是我写的一个只在开发环境打印的函数)在func pushRegistry(_ registry: PKPushRegistry, didUpdate credentials: PKPushCredentials, for type: PKPushType)方法里,我们可以拿到PushKit的推送token,然后上传给我们自己的服务器使用;func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType)方法是收到推送的回调,我们可以在这里做一个本地通知来通知用户来电,也可以通过PushKit推送挂断信息来消除通知。当然,我们的代码完全可以不放在回调里做,因为有PushKit推送消息进来的时候,APP已经在后台启动了,就是说我们写在didFinishLaunchingWithOptions里面的代码已经全部执行了,所以我们的APP的正常生命周期已经开始了,这样我们的可操作性就大了很多,(某种意义上,我们可以使用PushKit在用户不知道的情况下唤醒APP,有点作弊的感觉),就写到这里,PushKit的使用就是这么简单。

最近用Xcode9开启新的工程,继续使用PushKit,遇到极其坑爹的问题,因为Xcode9的Background Modes里面取消了勾选voip的选项,结果导致pushkit注册不成功,无法获取到pushkit的token,爬了坑之后才发现这个问题,解决方法是在info.plist文件里手动添加App provides Voice over IP services

美高梅网投平台 9image.png

欢迎更正错误和交流,回复评论和私信皆可
TAG标签:

版权声明:本文由美高梅网投平台发布于新闻中心,转载请注明出处:Oppo收不到推送及推送自动清空的解决,快速上手