2016-08-16 286 views
1

我們有一個內置PHP的應用程序,它向Android和iOS發送推送通知。我們的問題是,iOS中有一些設備ID似乎完全停止了我們腳本中所有其他iOS推送通知的發送,他們甚至說它們已經沒有錯誤地發送,但之後它會停止循環中的所有通知。iOS應用程序推送通知

如果我們從我們的數據庫中刪除有問題的設備ID,則發送腳本適用於違規設備後的所有設備。這很奇怪,似乎無法弄清楚爲什麼。

有沒有人有這方面的經驗?與發送到不存在的設備ID有關嗎?是否會阻止蘋果完成特定連接上的腳本?

這裏是我們在PHP腳本發送(這除了適用於所有設備從奇流氓設備ID):

$tHost = 'gateway.push.apple.com'; 
    $tPort = 2195; 
    $tCert = "path_to_our_cert.pem"; 
    $tPassphrase = 'passphrase'; 

    $tAlert = $this->title; //assign a title 
    $tBadge = 8; 
    $tSound = 'default'; 
    $tPayload = $this->body_plain; //assign a body 

      // Create the message content that is to be sent to the device. 
    $tBody['aps'] = array ('alert' => $tAlert,'badge' => $tBadge,'sound' => $tSound,); 
    $tBody ['payload'] = $tPayload; 
    $tBody = json_encode ($tBody); 

    $tContext = stream_context_create(); 
    stream_context_set_option ($tContext, 'ssl', 'local_cert', $tCert); 
    stream_context_set_option ($tContext, 'ssl', 'passphrase', $tPassphrase); 
    $tSocket = stream_socket_client ('ssl://'.$tHost.':'.$tPort, $error, $errstr, 30, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $tContext); 

    if (!$tSocket) exit ("APNS Connection Failed: $error $errstr" . PHP_EOL); 
    //Loop through all devices to send 
    foreach($this->device->devices as $item){ 
     if($item->os != "iOS") continue;     
     if(session::getAdministratorStaffSchoolID() != $item->school_id) continue; 
     $tToken = $item->device_id;//assign the device id 
     $tMsg = chr (0) . chr (0) . chr (32) . pack ('H*', $tToken) . pack ('n', strlen ($tBody)) . $tBody; 
      $tResult = fwrite ($tSocket, $tMsg, strlen ($tMsg)); 
    } 

    fclose ($tSocket); 

有沒有人有這方面的任何想法?

非常感謝

回答

1

所以,只是一個想法,但你使用傳統格式發送通知:

$tMsg = chr (0) . chr (0) . chr (32) . pack ('H*', $tToken) . pack ('n', strlen ($tBody)) . $tBody; 

並且:

錯誤響應。使用傳統格式,如果您發送通知 以某種方式格式錯誤的數據包(例如,有效負載超過 ),則規定的限制APN將通過切斷連接進行響應。它 沒有說明爲什麼拒絕通知。增強型 格式可讓提供商使用任意 標識符標記通知。如果出現錯誤,APN將返回一個包,該包將 將錯誤代碼與標識符相關聯。此響應使 供應商能夠找到並糾正格式錯誤的通知。

https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Appendixes/LegacyFormat.html

所以也許APNS只是未落你聯繫?這就是爲什麼所有剩餘的通知實際上沒有通過。仔細看看這些有效載荷。也許是轉向新格式的好時機。

0

任何錯誤發生時(無效的設備令牌,畸形有效載荷等)AFAIK的APN將盡快關閉連接。發送Push的代碼需要做好準備,從這種情況中恢復,重新連接並重新啓動工作。

看看那裏的3rdParty庫來爲你執行這個工作。你將依靠社區工作。

我可以推介Pushy它是用Java編寫的。我用它在2個不同的項目中,我可以說它工作正常,它是一個非常活躍的項目(有很多討論和更新)。

我不知道其中的任何使用PHP,但有可能是一個