2014-03-28 81 views
18

我創建了一個應用程序來從Web服務器發送遠程通知。 當我在開發模式下測試應用程序時,所有通知在手機上正確到達,AppStore發佈後應用程序不再收到通知。APNS推送通知不適用於生產

這是我做的:

  1. 創建一個私鑰的生產和一個用於發展。
  2. 通過傳遞前面的CertFile Generated在我的App ID上生成兩個SSL證書。我100%肯定已經正確生成了2個密鑰,並正確傳遞它們以從AppID下的開發人員中心下載SSL證書。
  3. 創建一個文件.pem用於開發,另一個用於生產(通過轉換從我的KeyChain等中提取的文件.p12)。連接到所述的AppID步驟的
  4. 創建2不同的供應簡檔的一個發展,一個用於生產1.
  5. 簽名在生成設置該應用與在步驟4中
  6. 創建的正確部署檔案已建立一個Web應用程序向捕獲和存儲用戶令牌。
  7. 創建一個php頁面來測試推送通知發送。

這是我測試:

  1. 測試的發展產生的。質子交換膜通過telnet文件沙盒鏈路與succesfull回答。
  2. 使用telnet在生產鏈接上測試生成的.pem文件,並獲得成功的答案。
  3. 我100%肯定在我的網絡應用程序中存儲了我的iPhone的開發標誌。
  4. 我100%肯定在我的網絡應用服務器上存儲了我iPhone的生產令牌。
  5. 我100%肯定會通過我的php頁面向蘋果服務器發送正確的消息(包括開發和生產)。
  6. 這個php頁面總是返回來自Apple Server的成功消息(包括開發和生產)。

這裏是我簽署的Xcode應用:

enter image description here enter image description here enter image description here enter image description here

這裏是PHP頁面的代碼來發送通知:

$ctx = stream_context_create(); 

    //stream_context_set_option($ctx, 'ssl', 'passphrase', 'development_pwd'); 
    //stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck_development.pem'); 
    //$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); //test 

    stream_context_set_option($ctx, 'ssl', 'passphrase', 'production_pwd'); 
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck_production.pem'); 
    $fp = stream_socket_client('ssl://gateway.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); //production 

    echo "<p>Connection Open</p>"; 
    if(!$fp){ 
     echo "<p>Failed to connect!<br />Error Number: " . $err . " <br />Code: " . $errstrn . "</p>"; 
     return; 
    } else { 
     echo "<p>Sending notification!</p>";  
    } 

    $i = 0; 

    foreach ($deviceToken as $dt) { 
     $dt = str_replace(' ' , '' , $dt); 
     $msg = chr(0) . pack('n',32) . pack('H*', $dt) . pack('n',strlen($payload)) . $payload; 
     echo "<p>" . $i . " - Message sent: " . $payload . "<br />Token: ". $dt . "<br />***" . $msg . "***</p>"; 
     $result = fwrite($fp, $msg, strlen($msg)); 
     $i++; 
     if (!$result) 
      echo '<p>Message not delivered ' . PHP_EOL . '!</p>'; 
     else 
      echo '<p>Message successfully delivered ' . PHP_EOL . '!</p>'; 
    } 
    fclose($fp); 
    echo "<p>Total Notifications Sent: " . $i . "</p>"; 
    echo "<p>Connection Closed!</p>"; 
} 
?> 

結論: 我有測試Ap在我的PC上接收APNS推送通知。 我有與App Store上發佈的應用程序完全相同的應用程序,它沒有收到APNS推送通知。

我真的做了一切我的力量來解決這個問題,並閱讀大約1000頁的論壇,stackoverflow和蘋果文件。

我願意報告你們誰幫助我找到解決我的問題的人!

+0

對於您的信息,即使令牌錯誤或過期,PHP腳本也會返回「Message successfully delivered」。 – rjobidon

回答

15

您提到的鏈接是Sandbox APNS鏈接。生產APNS鏈接按蘋果documentation是:

您在gateway.push.apple.com, 站TCP端口2195

幾件事情要驗證訪問的生產環境:

  1. 您的AppId已啓用分發APNS。
  2. 您已創建分發APNS SSL證書並安裝在您的構建機器上(用於App Store提交)。
  3. 您已經在服務器上的步驟2中安裝了SSL證書。
  4. 您不會錯誤地使用開發APNS SSL證書。
+0

其實我使用生產鏈接(gateway.push.apple.com),我在第一篇文章中通過粘貼開發文章而犯了一個錯誤。 – prelite

+0

1.啓用2.是3.是4.否...我試着用telnet和蘋果服務器的證書成功響應... – prelite

+0

我添加了更多關於我所做的事的信息,請您幫助我? – prelite

11

對於相同設備,Production和Sandbox的設備令牌不同。

所以嘗試通過使用Adhoc或分發證書獲取設備令牌並在生產中使用生成的令牌,這對我有用。

1

我剛剛遇到同樣的問題。推送通知到達開發模式,而不是生產。我也檢查了幾次,並確定一切都很好。

但事實並非如此。這是這個過程中的第一步。創建csr。我確信我不必爲開發和生產創建一個csr文件,並最終爲兩個certificats使用相同的csr文件。沒有工作...

也許有人在將來會犯同樣的錯誤,並節省一些時間。