web-dev-qa-db-fra.com

Les notifications push APNS ne fonctionnent pas en production

J'ai créé une application pour envoyer des notifications à distance à partir d'un serveur Web. Lorsque j'ai testé l'application en mode développement, toutes les notifications sont arrivées correctement sur le téléphone, après la sortie de l'AppStore, l'application n'a plus reçu de notifications.

Voilà ce que j'ai fait:

  1. Création d'une clé privée pour la production et une pour le développement.
  2. Généré sur mon ID d'application deux certificats SSL en passant le précédent CertFile généré. Je suis sûr à 100% d'avoir généré correctement 2 clés et de les avoir transmises correctement pour télécharger le certificat SSL depuis le Dev Center sous AppID.
  3. Création d'un fichier .pem pour le développement et un pour la production (en convertissant le fichier .p12 extrait de mon KeyChain etc etc).
  4. Création de 2 profils d'approvisionnement différents, l'un pour le développement et l'autre pour la production, connecté à l'AppID de l'étape 1.
  5. Signé l'application dans les paramètres de génération avec les profils d'approvisionnement appropriés créés à l'étape 4.
  6. Création d'une application Web pour intercepter et stocker les jetons des utilisateurs.
  7. Création d'une page php pour tester l'envoi de notifications push.

Voici ce que j'ai testé:

  1. Test du fichier .pem généré par le développement avec telnet sur le lien du bac à sable avec une réponse réussie.
  2. Test du fichier .pem généré par la production avec telnet sur le lien de production avec une réponse réussie.
  3. Je suis sûr à 100% d'avoir stocké sur mon application web le jeton de développement de mon iPhone.
  4. Je suis sûr à 100% d'avoir stocké sur mon serveur d'applications Web le jeton de production de mon iPhone.
  5. Je suis sûr à 100% de transmettre avec ma page php le bon message à Apple Server (à la fois pour le développement et la production).
  6. La page php renvoie toujours un message réussi de Apple Server (à la fois pour le développement et la production).

Voici comment je signe l'application sur Xcode:

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

Voici le code de la page php pour envoyer des notifications:

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

Conclusions: J'ai l'application de test sur mon PC qui reçoit des notifications push APNS. J'ai exactement la même application publiée sur l'App Store qui ne reçoit pas de notifications APNS Push.

J'ai vraiment fait tout ce qui était en mon pouvoir pour résoudre ce problème et lire environ des milliers de pages de forums, stackoverflow et Apple Documentations.

Je suis prêt à rendre hommage à tous ceux qui m'aident à trouver la solution à mon problème!

22
prelite

Le lien que vous avez mentionné est le lien Sandbox APNS. Le lien APNS de production est conforme à Apple documentation est:

Vous accédez à l'environnement de production sur gateway.Push.Apple.com , outbound TCP port 2195.

Peu de choses à vérifier:

  1. Votre AppId est activé pour la distribution APNS.
  2. Vous avez créé le certificat SSL de distribution APNS et vous l'avez installé sur votre machine de génération (pour la soumission sur l'App Store).
  3. Vous avez installé le certificat SSL à l'étape 2 sur votre serveur.
  4. Vous n'êtes pas par erreur en utilisant le certificat SSL de développement APNS.
16
gagarwal

Le jeton d'appareil pour la production et le bac à sable sont différents pour le même appareil.

Essayez donc d'obtenir un jeton d'appareil en utilisant des certificats Adhoc ou Distribution et utilisez le jeton généré en production, cela a fonctionné pour moi.

13
Ravindra Naik

Je viens de rencontrer le même problème. Les notifications push arrivent en mode développement, pas en production. J'ai aussi tout vérifié plusieurs fois et j'étais sûr que tout allait bien.

Mais ce n'était pas le cas. C'était la toute première étape du processus. Création du csr. J'étais sûr que je n'avais pas à créer de fichier csr pour le développement et la production et j'ai fini par utiliser le même fichier csr pour les deux certificats. N'a pas fonctionné ...

Peut-être que quelqu'un à l'avenir fera la même erreur et économisera du temps maintenant.

2
butters