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

时间:2015-06-17 13:32:05

标签: ios objective-c iphone push-notification google-cloud-messaging

我正在研究基于Java REST的Web服务,我正在尝试通过Google Cloud Messaging将消息从Java API发送到iOS设备。出于学习目的,我使用了iOS的谷歌示例代码,我可以在应用程序位于前台时发送消息,但当应用程序在后台时它无法正常工作。我尝试了几个“content_available”标志的变种,负责从后台调用应用程序。当应用程序处于前台时,它运行良好。我正试图在应用程序处于后台时显示通知。

totla_count += choose(2, a.size - x)

这是我用于接收通知的iOS应用代理代码,该代码基本上是带有用于显示通知的添加代码的Google示例代码

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();

我尝试将通知中的数据作为JSON字符串发送,其中包含“content_available”,“content-available”和值变体的各种变体// [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]]; } '1'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”的部分内容,请搜索页面以获取相关信息。

1 个答案:

答案 0 :(得分:5)

我通过彻底引用文档解决了这个问题,我的新工作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();
}