我正在研究基于
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
解决方法
我通过完全引用文档解决了这个问题,我的新工作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(); }