9

Sto usando this tutorial per imparare la notifica push.Notifica push non ricevuta su iphone

<?php 

// Put your device token here (without spaces): 
$deviceToken = '1675ba8bb005740bb514222227f861c30230a81e6eed6bb6b8f353c57831341d'; 

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

// Put your alert message here: 
$message = 'My first push notification!'; 

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

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

// Open a connection to the APNS server 
$fp = stream_socket_client(
'ssl://gateway.sandbox.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)); 
echo 'result =' . $result. PHP_EOL; 
if (!$result) 
echo 'Message not delivered' . PHP_EOL; 
else 
echo 'Message successfully delivered' . PHP_EOL; 

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

Ho anche configurato l'app per la notifica push. Dopo aver configurato per push, ho anche ricreato i profili di provisioning, il precedente ne cancella uno, installa il nuovo profilo. Eseguo l'app che mi fornisce id del dispositivo e quindi collego sia la sandbox del server che la produzione per inviare notifiche push con i relativi profili push ma non riesco ancora a ricevere notifiche push sul mio dispositivo.

Inoltre installo ipusher sul mio dispositivo e controllo la notifica push. vengono da quella applicazione.

Una cosa strana che noto è che cambio il mio identificatore dell'applicazione e utilizzare qualsiasi altra applicazione id poi gettone dispositivi rimangono stesso

Ora il mio problema è che non ricevo la notifica push sul mio dispositivo.


Il problema non è nelle mie profili. Può essere che l'errore è il codice php che sto usando perché quando uso gli apns facili sul server remoto, quindi invia le notifiche push. Le notifiche ricevute erano da 6 a 7 ore. Penso che questo sia dovuto a problemi di rete sul mio dispositivo. Ma ora funziona bene dopo 2 giorni sul profilo di produzione. Ora la notifica non richiede tempo per la consegna sul mio dispositivo, ma ci sono da 30 secondi a 5 minuti su alcuni dispositivi.


Non ci può essere un problema di più se non si ricevono notifiche push sul dispositivo da altre applicazioni troppo, allora si dovrebbe verificare il DNS per la connessione.

+2

Questa parte di implementazione lato server riguarda la parte dell'applicazione iPhone. Puoi controllare questo tutorial http://mobiforge.com/developing/story/programming-apple-push-notification-services http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part- 12 – iamsult

+0

seguo il raywenderlich per l'implementazione iphone. per ottenere il token del dispositivo –

+0

Il problema non è nei miei profili. Può essere che l'errore è il codice php che sto usando perché quando uso gli apns facili sul server remoto, quindi invia le notifiche push. Le notifiche ricevute hanno avuto un tempo compreso tra 6 e 7 ore. Penso che questo sia dovuto a problemi di rete sul mio dispositivo. Ma ora funziona bene dopo 2 giorni sul profilo di produzione. Ora la notifica non richiede tempo per la consegna sul mio dispositivo, ma ci sono da 30 secondi a 5 minuti su alcuni dispositivi. –

risposta

2

Okay, finalmente ho avuto il mio problema. Il problema non è nel codice in realtà il problema è nel valore DNS errato impostato nel mio iphone. Iphone posiziona automaticamente l'IP del mio router per il campo DNS. Ora fornisco il valore DNS del mio fornitore di servizi, quindi funziona perfettamente. Ora sto ricevendo messaggi Push non appena li ho inviati.

Spero che aiuti gli altri.

1

Controlla il tuo certificato di notifica push. il certificato è stato associato a una chiave privata?

In caso contrario, ricreare il certificato di notifica push con la chiave privata appropriata generata dalla catena di chiavi.

prega di dare un'occhiata al tutorial qua sotto:

Apple Push Notification Tutorial:

grazie,

MinuMaster

2

Implementare il servizio di feedback sul lato server e controllare anche sul lato server che entro quanto durata tutto il token del dispositivo viene inviato ad APNS. Dal servizio di feedback avremo modo di sapere quanti dispositivi hanno ricevuto la notifica. Se tutti i token del dispositivo vengono inviati uno alla volta agli APN e gli APN non inviano alcun elenco tramite il servizio di feedback, non è possibile gestire la durata per ricevere notifiche sui dispositivi.

1

Utilizzare UrbanAirShip. Secondo me è la migliore soluzione lato server poiché include notifiche Push-alike per Android (C2DM) e Blakberry.

Prova a trovare le differenze tra questi file e comprenderli. Potrebbe essere una soluzione al tuo problema.Qui è il mio codice:

<?php 

$message = 'Hello'; // $_GET or $_POST 
$badge = 3; // int 
$sound = 'default'; // string - sound name 
$development = true; // boolean 

$payload = array(); 
$payload['aps'] = array('alert' => $message, 'badge' => intval($badge), 'sound' => $sound); 
$payload = json_encode($payload); 

$apns_url = NULL; // Set Later 
$apns_cert = NULL; // Set Later 
$apns_port = 2195; 

if($development) 
{ 
    $apns_url = 'gateway.sandbox.push.apple.com'; 
    $apns_cert = '/path/apns.pem'; // relative address to an App Specific Certificate  file 
} 
else 
{ 
    $apns_url = 'gateway.push.apple.com'; 
    $apns_cert = '/path/cert-prod.pem'; 
} 

$stream_context = stream_context_create(); 
stream_context_set_option($stream_context, 'ssl','local_cert',$apns_cert); 

$apns = stream_socket_client('ssl://'.$apns_url.':'.$apns_port,$error,$error_string,2,STREAM_CLIENT _CONNECT,$stream_context); 

// You will need to put your device tokens into the $device_tokens array yourself 
$device_tokens = array(); // tokens!!! 

foreach($device_tokens as $device_token) 
{ 
    $apns_message = chr(0).chr(0).chr(32).pack('H*',str_replace(' ','',$device_token)).chr(0).chr(strlen($payload)).$payload; 
    fwrite($apns, $apns_message); 
} 

@socket_close($apns); 
@fclose($apns); 
?> 
8

innanzitutto assicurarsi che si sta utilizzando:

  • L'applicazione viene compilata con disposizione di debug/release
  • portachiavi ha il certificato di notifica devlopment/produzione spinta

quindi utilizzare il seguente codice (stato testato entrambi produzione & dev)

<?php 
// Comment these lines in production mode 
ini_set('display_errors','on'); 
error_reporting(E_ALL); 


// Apns config 

// true - use apns in production mode 
// false - use apns in dev mode 
define("PRODUCTION_MODE",false); 

$serverId = 1; 
$serverName = 'my-server-domain.com'; 

if(PRODUCTION_MODE) { 
$apnsHost = 'gateway.sandbox.push.apple.com'; 
} else { 
$apnsHost = 'gateway.push.apple.com'; 
} 

$apnsPort = 2195; 
if(PRODUCTION_MODE) { 
// Use a development push certificate 
$apnsCert = $_SERVER['DOCUMENT_ROOT'].'/apns/apns-dominos-development.pem'; 
} else { 
// Use a production push certificate 
$apnsCert = $_SERVER['DOCUMENT_ROOT'].'/apns/apns-dominos-production.pem'; 
} 


// --- Sending push notification --- 

// Insert your device token here 
$device_token = "<dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8 dc6127d8>"; // Some Device Token 


// Notification content 

$payload = array(); 

//Basic message 
$payload['aps'] = array(
'alert' => 'testing 1,2,3..', 
'badge' => 1, 
'sound' => 'default', 
); 
$payload['server'] = array(
'serverId' => $serverId, 
'name' => $serverName 
); 
// Add some custom data to notification 
$payload['data'] = array(
'foo' => "bar" 
); 
$payload = json_encode($payload); 

$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 
stream_context_set_option($streamContext, 'ssl', 'passphrase', ""); 


$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error,  $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); 


$deviceToken = str_replace(" ","",substr($device_token,1,-1)); 
echo $deviceToken; 
$apnsMessage = chr(0) . chr(0) . chr(32) . pack('H*', str_replace(' ', '',  $deviceToken)) . chr(0) . chr(mb_strlen($payload)) . $payload; 
fwrite($apns, $apnsMessage); 


//socket_close($apns); 
fclose($apns); 

?> 
+0

Cosa stai facendo in questa linea? e perché? $ deviceToken = str_replace ("", "", substr ($ device_token, 1, -1)); – RamshaS

+0

rimuovendo gli spazi e il prefisso "<" e il suffisso ">". Il token del dispositivo è alfanumerico, senza spazi o altri caratteri – Tamir

Problemi correlati