当前位置: 首页 > 知识库问答 >
问题:

让GCM在后台为iOS设备工作

卢嘉誉
2023-03-14

我正在尝试将GCM用于IOS和Android客户端。当应用程序位于前台时,它似乎可以与IOS配合使用,但是,当应用程序位于后台时,通知中心不会收到消息,并且不会调用带有completionHandler的DidReceiveEmotentification。

我发现一个问题是从GCM到APN的消息格式错误。也就是说,它看起来就是这样:

[message: New message, collapse_key: do_not_collapse, from: **************]

{“aps”:{“内容可用”:1},“数据id”:345}

顺便说一句,在前台应用程序接收消息时,问题只在于后台。关于如何解决问题,使GCM同时适用于ios和android,有什么建议吗?

更新:这就是我在网上发现的:

关于实际通信,只要应用程序在iOS设备的后台,GCM使用APNS发送消息,应用程序的行为类似于使用苹果的通知系统。但是当应用程序处于活动状态时,GCM直接与应用程序通信

因此,我在前台模式下收到的消息:

[消息:新消息,折叠键:请勿折叠,发件人:***********]

是来自GCM的直接消息(APNS根本没有参与此事)。所以问题是:APNS是否重新格式化GCM发送给它的内容,以符合ios通知格式?如果是这样的话,我如何知道APNS实际上做了什么,以及它是否以不同的格式向我发送通知?有没有办法查看APN传入数据的日志

更新:好的,我设法改变了消息的结构,现在在前台模式下,我收到了以下消息:

收到的通知:["ap":{"警报":"简单消息","内容可用": 1},collapse_key:do_not_collapse,来自: **************]

现在它的格式似乎很好,但当应用程序在后台时仍然没有反应。没有调用DidReceiveEmoteNotification completionHandler!我应该寻找什么,哪里会有问题?方括号是否会成为推送通知的问题?更准确地说,ios不会发布来自该传入通知的任何警报/徽章/横幅。

共有1个答案

盖锐进
2023-03-14

每一个可怜的灵魂都在寻找GCM背景神秘的答案。我解决了,问题就在形式上。我发布了正确的格式以及向GCM发送Http请求所需的Java代码,其中包含一些消息。因此Http请求的头中应该有两个字段,即:

Authorization:key="here goes your GCM api key"
Content-Type:application/json for JSON data type

然后,消息体应该是一个json字典,带有键“to”和“notification”。例如:

{
  "to": "gcm_token_of_the_device",
  "notification": {
    "sound": "default",
    "badge": "2",
    "title": "default",
    "body": "Test Push!"
  }
}

下面是一个简单的java程序(仅使用java库),它使用GCM将推送发送到指定的设备:

public class SendMessage {

    //config
    static String apiKey = ""; // Put here your API key
    static String GCM_Token = ""; // put the GCM Token you want to send to here
    static String notification = "{\"sound\":\"default\",\"badge\":\"2\",\"title\":\"default\",\"body\":\"Test Push!\"}"; // put the message you want to send here
    static String messageToSend = "{\"to\":\"" + GCM_Token + "\",\"notification\":" + notification + "}"; // Construct the message.

    public static void main(String[] args) throws IOException {
        try {

            // URL
            URL url = new URL("https://android.googleapis.com/gcm/send");

            System.out.println(messageToSend);
            // Open connection
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            // Specify POST method
            conn.setRequestMethod("POST");

            //Set the headers
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Authorization", "key=" + apiKey);
            conn.setDoOutput(true);

            //Get connection output stream
            DataOutputStream wr = new DataOutputStream(conn.getOutputStream());

            byte[] data = messageToSend.getBytes("UTF-8");
            wr.write(data);

            //Send the request and close
            wr.flush();
            wr.close();

            //Get the response
            int responseCode = conn.getResponseCode();
            System.out.println("\nSending 'POST' request to URL : " + url);
            System.out.println("Response Code : " + responseCode);

            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            //Print result
            System.out.println(response.toString()); //this is a good place to check for errors using the codes in http://androidcommunitydocs.com/reference/com/google/android/gcm/server/Constants.html

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 类似资料:
  • 我尝试了以下各种组合: 在ap有效载荷中传递了一个空警报 一个空的声音通过ap有效载荷 content_available:真 内容可用: 1 优先级设置为高。我的目标功能在后台模式中启用了后台抓取和远程通知。 这是我的有效载荷的样子: 我一打开应用程序,通知就会进来,但不是在后台。 看起来是这样的: [AnyHasable("body"): NTCIP示例单元:现在显示WALNUT TREE(T

  • 我尝试使用GCM发送APN。设备注册OK,GCM和IOS设备令牌被接收。当我尝试发送有效载荷没有"通知"节点: 一切正常。 但是我想处理应用程序在后台时的通知 根据文档,我将有效负载修改为: 第一次尝试: 但没有收到通知。 第二次尝试: 然后应用程序不会收到任何通知,即使我删除了通知节点。所以我必须移除它,重新安装,接收新的代币。 第二期: 我试图检查APN使用NWPusher,但得到错误:无效令

  • 当应用程序关闭时,我无法使通知工作。 我从FCM/GCM(python服务器)发送此消息: 所以curl是这样的: curl-头"授权:key=MYKEY"-头"内容类型:应用/json"https://fcm.googleapis.com/fcm/send-d'{"registration_ids":["APA91bEDB9dVf-..."],"collapse_key":空,"content_

  • 您可以看到,我的JSON中有两个块:一个通知块(在后台接收通知),一个数据块(在前台接收通知)。 我不明白为什么没有收到后台通知。我的怀疑是关于块的顺序(如果我把“数据”块放在“通知”块之前会有问题吗?)。 编辑:有关问题的更多信息。 编辑2: 当应用程序在后台时,不会收到通知,但当我打开应用程序时,会立即收到相同的通知(方法didReceiveRemoteNotification被激发)。

  • 我开发了一个名为MultiCountdown Timer的Android应用程序,在这个应用程序中,我们可以同时启动多个计时器。该应用程序在后台运行,使用前台服务,以便连续运行,并覆盖Android的打瞌睡模式。 这是我在manifest.xml中的活动。 我就是这样称呼我的警报活动的。 这是我在创建中的警报活动 4)使用Don't KillmyApp解决方案在Wake Lock中使用Locati

  • 我正在使用它工作得很好,过了一段时间后它就不能工作了,特别是在设备启动后它不能启动了。我已经给出了listner所需的所有权限,这里是我的代码。 这是正常工作的,但经过一段时间和引导完成后,is不工作,我使用启动,但它仍然不工作