我正在实施Google Cloud Messaging服务。只要我的应用程序在前台,一切都正常运行。但是,如果我将应用程序置于后台或完全停止,我将不再收到推送通知。我已经遍布GCM guide,Apple developer pages和许多SO帖子。
在我的info.p-list文件中,我检查了Background fetch
和Remote notifications
。我无法弄清楚我错过了什么。
这是AppDelegate中触发消息处理的方法。它主要来自谷歌。他们提出的关于“这只适用于应用程序启动GCM服务”的评论意味着需要发生其他事情,但我只是不知道它是什么。我甚至没有生成NSLog输出(即该方法根本没有触发)。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))handler
{
NSLog(@"Notification received: %@", userInfo);
//EDIT: looks like this line needs to go!!!!
// This works only if the app started the GCM service
//[[GCMService sharedInstance] appDidReceiveMessage:userInfo];
// Handle the received message
if (application.applicationState == UIApplicationStateActive) {
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:title
message:message
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles: nil];
[alert show];
} else {
if([application currentUserNotificationSettings].types & UIUserNotificationTypeAlert) {
UILocalNotification * localNotification = [[UILocalNotification alloc] init];
localNotification.alertBody = message;
localNotification.alertTitle = title;
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:2];
[application presentLocalNotificationNow:localNotification];
}
}
handler(UIBackgroundFetchResultNoData);
}
我还需要在此处添加其他内容吗?我还需要做什么?我受到了阻碍。谢谢。
编辑 - 部分成功
好的,我发现了这一行:
[[GCMService sharedInstance] appDidReceiveMessage:userInfo];
负责在应用程序处于后台时停止接收通知。评论它解决了这个问题(这让我有点紧张,因为我不知道那条线的意义是什么!)。
但是,当应用程序完全停止时,我仍然无法收到这些通知。
编辑2 试图实施阿里的建议,但现在我很困惑。当我阅读GCM文档时,我一直依赖于格式化我的PHP脚本的那个是名为Send Downstream Messages的文件,我认为它是通用的,可以发送到Android或iOS(GCM服务器可以处理任何差异, 也许?)。它适用于Android消息,适用于iOS,除了我在应用程序停止时描述的问题。
Ali让我觉得iOS需要不同的HTTP格式,因为他指向文档Set Up a Client App on iOS,我一直在虔诚地关注我的Objective-C代码。它描述了略微不同,但可能是HTTP格式的关键要求。具体来说,网址更改为https://gcm-http.googleapis.com/gcm/send
,您可以向邮件正文添加其他键值对content_type:true
。
问题是,一旦我这样做,我就不会收到任何消息。我真的需要做出这些改变吗?或许我只是把它们搞错了。这是我的iOS PHP脚本:
<?php
function send_to_ios_devices($link, $api_access_key, $club_id, $notification) {
$headers = array(
'Authorization: key=' . $api_access_key,
'Content-Type: application/json'
);
$registration_ids = array();
$sql = "SELECT gcm_registration_token
FROM USERS
WHERE device='ios' AND club_id=$club_id";
$result = mysqli_query($link, $sql);
while($row = mysqli_fetch_assoc($result)){
$reg_id = $row['gcm_registration_token'];
if ($reg_id != -1) array_push($registration_ids, $reg_id);
}
$fields = array(
'registration_ids' => $registration_ids,
'content_available' => 'true', //<--ADDED THIS LINE
'notification' => $notification
);
$ch = curl_init();
//curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send' );
curl_setopt( $ch,CURLOPT_URL, 'https://gcm-http.googleapis.com/gcm/send' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );
$result = curl_exec($ch );
curl_close( $ch );
$recipients = count($registration_ids);
echo "Push notification sent to " . $recipients . " ios recipient(s).<br>";
}
?>