2013-06-14 2 views
1

푸시 알림을 보내는 첫 번째 앱이 아니지만 동시에 모든 사용자에게 알림을 보내는 것은 내 첫 번째 앱입니다.푸시 알림을 제대로 보내는 방법

모든 사용자가 알림을 수신하지는 않지만 일부 설정 만 올바른 것으로 설정되어 있습니다 (즉, 내 앱에 대한 알림이 사용 설정되어 있음). 코드가 올바른 이유는 일부 사용자에게 알림이 전송 되었기 때문입니다. 그래서 내 추측에 따르면 APNS와의 연결은 비동기 적이기 때문에 코드가 "실종"되는 사례가 있습니다. 잘못된 메시지 일 경우 알림을 보내는 대기열이 엉망이됩니다.

여기에 코드입니다 :

function sendNotification(){ 

$sql = "SELECT * FROM users WHERE phone = 'iPhone' AND pushID != ''"; 
try { 
    $db = getConnection(); 
    $stmt = $db->prepare($sql); 
    $stmt->execute(); 
    $users = $stmt->fetchAll(PDO::FETCH_OBJ); 

    $request = Slim::getInstance()->request(); 
    $content = json_decode($request->getBody()); 
    $message = $content->message; 

    foreach($users as $user){ 

      // Put your device token here (without spaces): 
      $deviceToken = $user->pushID; 


      // Put your private key's passphrase here: 
      $passphrase = 'xxxxxxx'; 

      //////////////////////////////////////////////////////////////////////////////// 

      $ctx = stream_context_create(); 
      stream_context_set_option($ctx, 'ssl', 'local_cert', 'xxxxx.pem'); 
      stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

      // Open a connection to the APNS server 
      $fp = stream_socket_client(
       'ssl://gateway.push.apple.com:2195', $err, 
       $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx); 

      if (!$fp) 
       exit("Failed to connect: $err $errstr" . PHP_EOL); 

      echo 'Connected to APNS' . PHP_EOL; 

      // Create the payload body 
      $body['aps'] = array(
       'alert' => $message, 
       'sound' => 'default' 
       ); 

      // Encode the payload as JSON 
      $payload = json_encode($body); 

      // Build the binary notification 
      $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload; 

      // Send it to the server 
      $result = fwrite($fp, $msg, strlen($msg)); 

      if (!$result) 
       echo 'Message not delivered' . PHP_EOL; 
      else 
       echo 'Message successfully delivered' . PHP_EOL; 

      // Close the connection to the server 
      fclose($fp); 

    } 
    $db = null; 
} catch(PDOException $e) { 
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
} 
} 

당신은 내가 아이폰과 내 모든 사용자를 가져오고 내가 그들에게 알림을 보내 볼 수 있듯이. 내 전화는 그 목록의 마지막 사용자이고 나는 그것을 얻지 못했고, 내가 아는 또 다른 사용자는 첫 번째 사용자이고 그녀는 그것을 가지고있다. 배열의 사용자 중 일부가 누락되었거나 처음 절반 만 오류가 표시됩니다.

나는 이것을 위해 Slim을 사용합니다.

당신이 저를 도울 수 있기를 바랍니다, 감사합니다!

답변

2

전송할 장치 토큰 중 일부가 유효하지 않을 수도 있습니다. 하나의 잘못된 기기라도 당신이 겪고있는 것을 설명 할 수 있습니다. 잘못된 장치 토큰으로 알림을 보내면 Apple은 오류 응답을 반환하고 소켓을 닫습니다.

소켓이 닫혔다는 것을 코드가 감지 할 때까지는 유효하지 않은 소켓 이후 많은 알림을 보냈을 가능성이 있습니다 (소켓이 닫히지 않았 음을 감지하기 전에 모든 알림을 전송할 수도 있습니다). 유효하지 않은 통지가 파기 된 후에 전송 된 통지. 이러한 알림은 새 소켓을 만든 후에 Apple에 다시 보내야합니다.

자세한 내용은 this documentPush Notification Throughput and Error Checking 섹션을 읽어 보시기 바랍니다.

프로덕션 토큰은 샌드 박스 환경에서는 유효하지 않으며 그 반대의 경우에도 프로덕션 장치 토큰과 샌드 박스 장치 토큰이 데이터베이스에 포함되어 있지 않은지 확인하십시오.

+0

여기에도 같은 문제가있었습니다. http://stackoverflow.com/questions/17116249/batch-multiple-ios-push-notification-code-works-for-2-devices-but-not-for-1 그것은 실제로 모든 장치에 전송되는 알림을 중지하는 내 db 테이블 맨 위에 하나의 잘못된 장치 토큰이었습니다. –

+0

지금 막 모든 사용자에게 알림을 보내려고했는데 sandox 모드를 사용했는데 오류가 발생했을 것입니다. 내 토큰 중 하나가 개발 중이기 때문에 "메시지가 성공적으로 전송되었습니다"라는 메시지가 나오지 않았기 때문에 실제로 사과가 응답합니다. 하지만 "괜찮아"? – subharb

+0

@subharb 보내는 알림의 수와 전송 속도에 따라 다릅니다. 예를 들어, 동시에 10 개의 알림 (일부 기기에 잘못된 기기 토큰이있는 알림)을 보내면 예외가 표시되지 않고 모든 것이 성공적으로 전송 된 것으로 보입니다. 다음 번에 동일한 소켓을 통해 알림을 보내려고하면 예외가 발생합니다. Apple은 "ALL OK"라고 대답하지 않습니다. 오류가 발생하면 응답을 보냅니다. 향상된 바이너리 형식을 사용해야 만 응답을 보냅니다. 자세한 내용은 내 답변에서 제공 한 링크를 읽으십시오. – Eran

관련 문제