2014-03-28 3 views
18

웹 서버에서 원격 알림을 보내려면 앱을 만들었습니다. 개발 모드의 앱을 테스트했을 때 모든 알림이 휴대 전화에 올바르게 도착했습니다. AppStore가 출시 된 후 앱에서 더 이상 알림을받지 못했습니다.APNS 푸시 알림이 프로덕션에서 작동하지 않습니다.

여기에 내가 무슨 짓을했는지입니다 :

  1. 는 생산 및 개발을위한 하나에 대한 개인 키를 만들었습니다.
  2. Generate 된 이전 CertFile 생성자를 전달하여 내 App ID에 두 개의 SSL 인증서 생성. 나는 정확하게 2 키를 생성하고 AppID에 따라 Dev Center에서 SSL 인증서를 올바르게 전달하기 위해 100 % 확실하게 전달했습니다.
  3. 내 키 체인 등에서 추출한 .p12 파일을 변환하여 개발 용 파일과 제작 용 파일을 생성했습니다. 단계의 AppID가 연결
  4. 만든 2 개의 다른 프로비저닝 프로파일 개발을위한 하나 생산 한 1
  5. 는에 만든 4 단계
  6. 에서 만든 올바른 프로비저닝 프로파일과 웹 응용 프로그램을 빌드 설정에서 응용 프로그램을 서명 사용자 토큰을 잡아서 저장합니다.
  7. 푸시 알림 보내기를 테스트하는 PHP 페이지를 만들었습니다.

은 여기 내가 테스트 한 것입니다 :

  1. 는 테스트 개발이 .PEM이 succesfull 대답 샌드 박스의 링크를 텔넷으로 파일을 생성합니다.
  2. 생산 링크를 테스트하여 성공적으로 생산 링크에서 텔넷으로 .pem 파일을 생성했습니다.
  3. 저는 제 웹 애플 리케이션에 내 iPhone의 개발 토큰을 저장했는지 100 % 확신합니다.
  4. 나는 내 웹 응용 프로그램 서버에 내 iPhone의 생산 토큰을 저장했는지 100 % 확신합니다.
  5. 저는 Apple 서버 (개발 및 프로덕션 용)에 올바른 메시지를 내 PHP 페이지와 함께 전달할 것입니다.
  6. PHP 페이지는 항상 Apple 서버 (개발 및 프로덕션 모두)에서 성공적인 메시지를 반환합니다.

    $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>"; 
    } 
    ?> 
    

    :

    enter image description here enter image description here enter image description here 여기 enter image description here

    알림을 보낼 수있는 PHP 페이지의 코드입니다 : 여기

내가 엑스 코드에 응용 프로그램을 등록하는 방법입니다 결론 : 나는 Test Ap를 가지고있다. PC에서 APN 푸시 알림을받는 p. APNS 푸시 알림을받지 않는 앱 스토어에서 정확히 동일한 앱을 출시했습니다.

저는이 문제를 해결하고 포럼, 스택 오버 플로우 및 Apple Documentations에 대한 약 천 페이지를 읽는 데 필요한 모든 것을 저의 힘으로 만들었습니다.

내 문제에 대한 해결책을 찾는 데 도움이되는 여러분 모두를 기쁘게 생각합니다.

+0

귀하의 정보를 위해서, PHP 스크립트는 토큰이 잘못되었거나 만료 되더라도 "Message successfully delivered"를 반환합니다. – rjobidon

답변

15

언급 한 링크는 샌드 박스 APNS 링크입니다.

당신은 , 아웃 바운드 TCP 포트 2195

몇 가지 확인하는 gateway.push.apple.com에서 프로덕션 환경에 액세스 : 인 애플 documentation에 따라 생산 APNS 링크는

  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. 아니요 ... 텔넷 및 애플 서버가 성공적으로 응답 한 인증서를 시도했습니다 ... – prelite

+0

내가 한 것에 대한 자세한 정보를 추가 했습니까? – prelite

11

프로덕션 및 샌드 박스의 장치 토큰은 동일한 장치에 대해 다릅니다.

따라서 Adhoc 또는 배포 인증서를 사용하여 장치 토큰을 얻고 프로덕션 환경에서 생성 된 토큰을 사용하면이 작업이 효과적입니다.

1

나는 그냥 같은 문제를 발견했다. 푸시 알림은 프로덕션이 아닌 개발 모드에 있습니다. 나는 또한 모든 것을 몇 번 확인하고 모든 것이 잘되었다고 확신했다.

하지만 그렇지 않았습니다. 그것은 그 과정의 첫 걸음이었습니다. csr 만들기. 나는 Development and Production을 위해 csr 파일을 만들 필요가 없었으며 두 인증 모두에 동일한 csr 파일을 사용하도록했다. 일하지 않았어 ...

미래의 누군가가 같은 실수를하고 언젠가는 시간을 절약 할 것입니다.

관련 문제