2015-07-13 23 views
5

Tôi đang làm việc để nhận thông báo nền để hoạt động trên iOS với GCM - thông báo không phải nền đã hoạt động. Dưới đây là các bước của tôi để tích hợp các thông báo nền:Thông báo đẩy iOS GCM không nhận được trong nền sử dụng người gửi PHP và Swift

  1. Enable thẻ từ xa thông báo trong UIBackgroundmodes
  2. Thêm chìa khóa nội dung có sẵn để tải thông báo của tôi.
  3. Viết ứng dụng: didRecieveRemoteNotification: fetchCompletionHandler: trong ủy quyền của tôi.

Đây là mã cho hàm đại biểu:

func application(application: UIApplication, 
    didReceiveRemoteNotification userInfo: [NSObject : AnyObject], 
    fetchCompletionHandler handler: (UIBackgroundFetchResult) -> Void) { 
     println("Notification received2: \(userInfo)") 

     GCMService.sharedInstance().appDidReceiveMessage(userInfo); 

     NSNotificationCenter.defaultCenter().postNotificationName(messageKey, object: nil, 
      userInfo: userInfo) 
     handler(UIBackgroundFetchResult.NoData);  
} 

Đây là mã cho kịch bản php trên server:

<?php 
$regId = $_GET["regId"]; 
$message = $_GET["message"]; 

$data = array('price' => $message, 'sound' => 'default', 'body' => 'helloworld', 'title' => 'default', 'badge' => 12, 'content-available' => 1); 

$ids = array($regId); 

sendGoogleCloudMessage( $data, $ids); 

function sendGoogleCloudMessage($data, $ids) 
{ 

    $apiKey = THE-API-KEY-THAT-I-AM-USING; 

    $url = 'https://android.googleapis.com/gcm/send'; 

    $post = array(
       'registration_ids' => $ids, 
       'data'    => $data, 
       'content-available' => 1, 
    ); 

    $headers = array(
        'Authorization: key=' . $apiKey, 
        'Content-Type: application/json' 
       ); 

    $ch = curl_init(); 

    curl_setopt($ch, CURLOPT_URL, $url); 

    curl_setopt($ch, CURLOPT_POST, true); 

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post)); 

    $result = curl_exec($ch); 

    if (curl_errno($ch)) 
    { 
     echo 'GCM error: ' . curl_error($ch); 
    } 

    curl_close($ch); 

    echo $result; 
} 
?> 

Tôi đã cố gắng gửi cờ nội dung có sẵn thông qua cả mảng "dữ liệu" bên trong và mảng "post" bên ngoài, mà tôi đã chỉ ra bằng cách thêm nó vào cả hai.

Hàm fetchCompletionHandler không nhận được tin nhắn, nhưng chờ cho đến khi ứng dụng hoạt động trở lại và được ứng dụng bình thường nhận được: chức năng didRecieveRemoteNotification. Điều gì có thể là lý do mà thông báo của tôi không nhận được thông qua chức năng nền?

Trả lời

2

Bạn nên cung cấp content_available để GCM, không nội dung có sẵn (như trong APN) và bạn sẽ có thể nhận được thông báo đẩy ở chế độ nền.

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

T.B. - Ít hơn năm phút trước, tôi đã có cùng một vấn đề. Chúng ta nên đọc kỹ tài liệu ...

+0

Cảm ơn rất nhiều! Điều này chắc chắn là một vấn đề - tuy nhiên, khi tôi thêm đúng thẻ, bây giờ không phải của các chức năng nhận cuộc gọi. Bất kỳ ý tưởng tại sao? –

+1

@JohnSzymanski bạn cũng nên thêm thẻ 'fetch' vào UIBackgroundModes. –

+0

Dường như không thay đổi gì cả. . . –

Các vấn đề liên quan