2013-07-18 106 views
2

我想使用推送通知使用Api,我沒有收到任何錯誤消息,我沒有得到任何迴應。使用推送通知使用Api

我已經檢查Apple Push Notification Service with PHP Script

,並相應地應用在我的代碼更改,但仍然沒有工作。

我沒能獲得如何得到serverId,我在

$device = 'fbb5a9c71066794d57fee33b4005a89f1bb8941a68660fd6e91f466be1299ab6'; // My iphone deviceToken 
$payload['aps'] = array(
    'alert' => 'This is the alert text', 
    'badge' => 1, 
    'sound' => 'default' 
); 

$payload['server'] = array(
    'serverId' => 1, 
    'name' => 'keyss.in' 
); 

$payload = json_encode($payload); 

$apnsCert = 'apple_push_notification_production.pem'; 

$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 

$apns = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); 

$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device)) . chr(0) . chr(strlen($payload)) . $payload; 
fwrite($apns, $apnsMessage); 

//socket_close($apns); seems to be wrong here ... 
fclose($apns); 

使用獲取的錯誤:

警告:stream_socket_client():無法連接到SSL:/ /gateway.sandbox.push.apple.com:2195(連接超時)

警告:fwrite()期望參數1是資源,布爾給定

警告:FCLOSE()預計參數1是資源,布爾給

回答

6

,因爲你使用的是舊的二進制通知格式你沒有得到任何迴應:

$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device)) . chr(0) . chr(strlen($payload)) . $payload; 

爲了得到答覆(反應只在一個錯誤的情況下返回),使用增強的格式:

$apnsMessage = pack("C", 1) . pack("N", $apple_identifier) . pack("N", $apple_expiry) . pack("n", 32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n", strlen($payload)) . $payload; 

你可以看到示例代碼here

+0

現在什麼是$ apple_identifier和$ apple_expiry? – Happy

+0

@Happy'apple_identifier'是您分配給消息的4字節標識符。 'apple_expiry'是一個4字節的整數,它決定了APNS服務器在放棄之前會嘗試向設備發送通知的時間。當您收到錯誤響應時,它將包含導致錯誤的通知的4字節標識符。 – Eran