使用content_available将GCM推送到iOS的通知(无法从非活动状态调用)

我正在研究基于 Java REST的Web服务,我正在尝试通过Google Cloud Messaging将消息从Java API发送到iOS设备.出于学习目的,我使用了iOS的谷歌示例代码,我可以在应用程序位于前台时发送消息,但是当应用程序在后台时它无法正常工作.我已经尝试了几个“content_available”标志的变体,它负责从后台调用应用程序.当应用程序处于前台时,它运行良好.我正在尝试在应用程序处于后台时显示通知.
HttpClient client = new DefaultHttpClient();
HttpPost post = null;
try {
    post = new HttpPost("https://android.googleapis.com/gcm/send");
} catch (URISyntaxException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
String regisID="My_iOS_Registration_Id-GVnH1gEsJ";
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
List<NameValuePair> notificationData = new ArrayList<NameValuePair>(1);
notificationData.add(new BasicNameValuePair("title","title"));
JSONObject obj=new JSONObject();
obj.put("title","title");
obj.put("alert","title");
obj.put("sound","default");
obj.put("badge","1");
nameValuePairs.add(new BasicNameValuePair("to",regisID));
nameValuePairs.add(new BasicNameValuePair("notification",obj.toString()));
nameValuePairs.add(new BasicNameValuePair("content_available","true"));

post.setHeader("Authorization","key=MyKey");
try {
    HttpEntity entity = new UrlEncodedFormEntity(nameValuePairs);
} catch (UnsupportedEncodingException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
try {
    post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
HttpResponse response = null;
try {
    response = client.execute(post);
} catch (HttpException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
HttpEntity entity1 = response.getEntity();
try {
    System.out.println("Hi response is : " + EntityUtils.toString(entity1));
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
return response.getStatusLine().toString();

这是我的iOS应用代理代码,用于接收通知,该代码基本上是谷歌示例代码,其中添加了用于显示通知的代码

// [START ack_message_reception]
- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo {
  NSLog(@" foregraound one Notification received: %@",userInfo);
  // This works only if the app started the GCM service
  [[GCMService sharedInstance] appDidReceiveMessage:userInfo];
  // Handle the received message
  // [START_EXCLUDE]
  [[NSNotificationCenter defaultCenter] postNotificationName:_messageKey
                                                  object:nil
                                                userInfo:userInfo];
  // [END_EXCLUDE]


  UILocalNotification *notification = [[UILocalNotification alloc]init];
  notification.repeatInterval = NSDayCalendarUnit;
  [notification setAlertBody:@"Hello world"];
  [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]];
  [notification setTimeZone:[NSTimeZone  defaultTimeZone]];
  [application setScheduledLocalNotifications:[NSArray      arrayWithObject:notification]];
}

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))handler {
  NSLog(@" backgroun one Notification received: %@",userInfo);
  // This works only if the app started the GCM service
  [[GCMService sharedInstance] appDidReceiveMessage:userInfo];
  // Handle the received message
  // Invoke the completion handler passing the appropriate         UIBackgroundFetchResult value
  // [START_EXCLUDE]
  [[NSNotificationCenter defaultCenter] postNotificationName:_messageKey
                                                  object:nil
                                                userInfo:userInfo];
  handler(UIBackgroundFetchResultNoData);
  // [END_EXCLUDE]

  UILocalNotification *notification = [[UILocalNotification alloc]init];
  notification.repeatInterval = NSDayCalendarUnit;
  [notification setAlertBody:@"Hello world"];
  [notification setFireDate:[NSDate dateWithTimeIntervalSinceNow:1]];
  [notification setTimeZone:[NSTimeZone  defaultTimeZone]];
  [application setScheduledLocalNotifications:[NSArray    arrayWithObject:notification]];
}

我尝试将通知中的数据作为JSON字符串发送,其中包含“content_available”,“content-available”和值变体的各种变体,为“1”,true,TRUE.它似乎没有反映我的变化.我已经尝试将“声音”发送为“默认”,正如我在一些应该影响的问题中发现的那样.我已经为Android实现了它,它的工作就像一个魅力.基本上,根据我的知识,我通过gcm文档和APNS文档获得了它应该调用“内容可用”决定的第二种方法,但它不适合我.

以下是使用content_available的Google文档链接.

https://developers.google.com/cloud-messaging/server-ref#downstream

https://developers.google.com/cloud-messaging/server#payload

要查看“content_available”的一部分,请搜索​​页面以获取有关它的信息.

解决方法

我通过完全引用文档解决了这个问题,我的新工作java代码看起来像这样.
JSONObject subobj = new JSONObject();
subobj.put("sound","default");
subobj.put("badge","12");
subobj.put("title","default");

JSONObject obj = new JSONObject();
obj.put("to",regisID);
obj.put("notification",subobj);
obj.put("content_available",new Boolean(true));

post.setHeader("Authorization","key=MyKey");

post.setHeader("Content-Type","application/json");
try {
    HttpEntity entity = new UrlEncodedFormEntity(nameValuePairs);
} catch (UnsupportedEncodingException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...