2010-01-20 7 views

Répondre

0

J'ai même problème, mais résolu maintenant en éditant cette ligne que je méconnais ...

$output = json_encode($payload);

à

$payload = json_encode($payload);

Le premier donnera erreur strlen mais sur mon serveur l'erreur ne pas générer. J'ai eu une erreur strlen lors de l'exécution sur l'hôte local après avoir échoué sur le serveur réel.

J'ajoute aussi un passpharse ssl pour le local_cert, car mon fichier pem a un mot de passe. Ci-dessous le code final qui fonctionne ... Veuillez remplacer your_token_hex_string et votre_passphrase avec vos propres informations.

$device = 'your_token_hex_string'; 
$payload['aps'] = array('alert' => 'This is the alert text', 'badge' => 1, 'sound' => 'default'); 
$payload = json_encode($payload); 

$options = array('ssl' => array(
    'local_cert' => 'apns_dev.pem', 
    'passphrase' => 'your_passphrase' 
)); 

$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, $options); 
$apns = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $error, $errorString, 60, STREAM_CLIENT_CONNECT, $streamContext); 

$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '', $device)) . chr(0) . chr(strlen($payload)) . $payload; 
fwrite($apns, $apnsMessage); 
fclose($apns);
7

Créer une fonction commune pour la notification push passer les params suivantes dans la fonction devicetoken, un message et des paramètres supplémentaires selon vos besoins d'application. si vous utilisez le fichier pem du développeur, alors vous devez utiliser "gateway.sandbox.push.apple.com:2195" et si vous utilisez le fichier panm de distributeur, vous devez utiliser "gateway.push.apple.com:2195"

public function pushtoios($devicetoken, $message, $params = array()) { 
    $passphrase = 'apple'; 
    $ctx = stream_context_create(); 
/*Development pam file*/ 
    //stream_context_set_option($ctx, 'ssl', 'local_cert', your path.'apns-dev.pem'); 
/*Distributer pam file*/ 
    stream_context_set_option($ctx, 'ssl', 'local_cert', your path.'apns-distr.pem'); 
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase); 

/*For Development pam file*/ 
    //$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT, $ctx); 

/*For Distributer pam file*/ 
    $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 amarnew: $err $errstr" . PHP_EOL); 

    $body['aps'] = array(
     'alert' => $message, 
     'sound' => 'default' 
    ); 
    $body['type'] = $params['type']; 
    $body['params'] = $params; 
    $payload = json_encode($body); 
    $msg = chr(0) . pack('n', 32) . pack('H*', $devicetoken) . pack('n', strlen($payload)) . $payload; 

    $result = fwrite($fp, $msg, strlen($msg)); 
    if (!$result) { 
     return false; 
    } else { 
     return true; 
    } 
    fclose($fp); 
} 
+0

Super, c'est correct en effet! –

Questions connexes