应用程序在停止或在后台时未响应收到的推送通知

时间:2015-10-22 19:16:10

标签: ios push-notification google-cloud-messaging

我正在实施Google Cloud Messaging服务。只要我的应用程序在前台,一切都正常运行。但是,如果我将应用程序置于后台或完全停止,我将不再收到推送通知。我已经遍布GCM guideApple developer pages和许多SO帖子。

在我的info.p-list文件中,我检查了Background fetchRemote 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>";
}
?>

2 个答案:

答案 0 :(得分:0)

您必须在您的节中添加"content_available" : "true"才能在ios上唤醒您的应用程序。

在这里,您可以找到完整的doc

答案 1 :(得分:0)

在iOS上,如果应用程序在后台,则由APN决定是否发送通知。如果您的下游消息需要用户操作,您可以使用优先级:“高”,即使应用程序在后台,也会在iOS上发送通知。请注意,在生产中,您应该只对需要用户交互的通知使用高优先级,例如聊天消息。否则请使用“正常”优先级。

查看reference了解更多信息。