2009-06-27 16 views
50

Esiste un progetto di esempio che mostra come utilizzare APNS sull'iPhone e come configurare le cose? Attualmente sto guardando la documentazione, ma sarebbe bello avere un codice funzionante da selezionare e vedere come funziona tutto insieme?Codice di esempio Apple PNS (servizi di notifica push)

Non riesco a trovare nulla utilizzando google o nel centro dev di iphone.

+2

Controlla qui http://arashnorouzi.wordpress.com/2011/03/31/sending-apple-push-notifications-in-asp-net-part-1/ è esattamente quello che stai cercando. – Moon

+0

@ froh42 Hai qualche codice soddisfacente? Voglio anche codice di esempio per l'implementazione passo dopo passo. Se avete quindi si prega di fornire a me. Grazie in anticipo. –

risposta

59

La parte peggiore della configurazione del servizio di notifica push è il provisioning. Il principale ostacolo che ho riscontrato è che c'è un certificato e una chiave nel file .cer scaricato dal sito di Apple, ho scritto un servizio di sistema in C# che ha inviato notifiche e le connessioni continuavano a mancare perché avevo esportato il certificato e non la chiave.

Non ricordo chi ha scritto in origine questo, ecco un po 'di codice in Python che mi ha aiutato quando stavo testando il servizio di notifica. Mi piace perché è molto semplice e funziona bene durante i test.

import socket, ssl, json, struct 

# device token returned when the iPhone application 
# registers to receive alerts 

deviceToken = 'XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX' 

thePayLoad = { 
    'aps': { 
      'alert':'Oh no! Server\'s Down!', 
      'sound':'k1DiveAlarm.caf', 
      'badge':42, 
      }, 
    'test_data': { 'foo': 'bar' }, 
    } 

# Certificate issued by apple and converted to .pem format with openSSL 
# Per Apple's Push Notification Guide (end of chapter 3), first export the cert in p12 format 
# openssl pkcs12 -in cert.p12 -out cert.pem -nodes 
# when prompted "Enter Import Password:" hit return 
# 
theCertfile = 'cert.pem' 
# 
theHost = ('gateway.sandbox.push.apple.com', 2195) 

# 
data = json.dumps(thePayLoad) 

# Clear out spaces in the device token and convert to hex 
deviceToken = deviceToken.replace(' ','') 
byteToken = bytes.fromhex(deviceToken) # Python 3 
# byteToken = deviceToken.decode('hex') # Python 2 

theFormat = '!BH32sH%ds' % len(data) 
theNotification = struct.pack(theFormat, 0, 32, byteToken, len(data), data) 

# Create our connection using the certfile saved locally 
ssl_sock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM), certfile = theCertfile) 
ssl_sock.connect(theHost) 

# Write out our data 
ssl_sock.write(theNotification) 

# Close the connection -- apple would prefer that we keep 
# a connection open and push data as needed. 
ssl_sock.close() 

C'è anche una gemma rotaie chiamato apn_on_rails che sembra funzionare abbastanza bene se si sta sviluppando un'applicazione Rails, ho appena visto oggi ed è stato in grado di inviare le notifiche dalla console.

Sul lato iPhone avrete solo bisogno di chiamare il seguente per registrare per tutti i tipi di notifiche:

[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert]; 

Per ricevere il token dispositivo è necessario implementare i seguenti metodi delegato:

Durante il test, è possibile avviare il dispositivo con il dispositivo Talk in console con NSLog, quindi incollarlo nello script python di cui sopra, in produzione ovviamente sarà necessario impostare un metodo per ottenere il token sui server.

Inoltre, in produzione dovrai consultare il servizio di feedback di Apple e rimuovere i token dispositivo dagli utenti che hanno rimosso la tua app.

+1

Controlla la risposta di Simon qui sotto: ha racchiuso il codice Python in una bella libreria che puoi trovare qui: http://github.com/simonwhitaker/PyAPNs –

+1

Per la cronologia, è stato appena eseguito correttamente questo codice. –

+1

ATTENZIONE: questo codice è per la versione 0 del protocollo. Apple è ora disponibile alla versione 2. –

2

Cerca nei forum nel centro dev di iPhone, presumibilmente ci sono molti esempi di codice lato server per parlare con il server push di Apple.

5

Non c'è molto codice da scrivere sul lato iPhone. Devi ottenere il token univoco dell'iPhone o dell'iPod Touch e quindi inoltrare quel token al tuo server. Ottenere il token richiede una chiamata a UIApplication ma non c'è un modo predefinito per farlo sul tuo server. Una delle mie app esegue un POST HTTP a uno script PHP che mette il token in un database.

Se si è interessati al provisioning e alla configurazione dei certificati, ecc., È possibile consultare la Guida alla programmazione del servizio di notifica push Apple.

+0

Ben, sì, non sembra complicato dalla documentazione e sono anche sicuro che risolverò il provisioning (non l'ho ancora visto ...) Sarebbe stato bello avere un passaggio passo passo su come impostare le cose. – froh42

16

Un buon punto di partenza è Urban Airship. È possibile impostare un account di base gratuito che eseguirà tutto il lavoro sul lato server dell'invio di notifiche push ai server Apple. Fanno anche un ottimo lavoro per guidarti attraverso tutti i passaggi necessari per far funzionare la tua applicazione con il loro servizio e avere un eccellente codice di esempio che mostra come registrare la tua applicazione per le notifiche.

Non ho altra affiliazione con loro oltre ad essere un utente felice del loro servizio.

+0

Attualmente sto percorrendo questa rotta poiché la maggior parte dell'hosting condiviso non consente la connessione alle porte personalizzate di Apple per le notifiche push. Ricordo di aver visto un programma Python per Google App Engine prima del quale invia richieste REST a Urban Airship (utile per le notifiche basate su cron) ma non riesco a trovarlo al momento. Per favore fatemi sapere se vi capita di imbattervi. Grazie! –

+0

Sì, il loro servizio funziona bene. Si sono espansi in un vero servizio store-and-forward chiamato AirMail che elimina gran parte del lavoro dal back-end: tutto ciò che deve fare ora è inviare JSON con HTML incorporato ai server di Urban Airship; si occupano di inviare le notifiche e di fornire l'HTML quando richiesto. –

+0

Ehi, per favore, puoi aiutarmi a implementare Urban Airship API nella mia app per iPhone? vedere quale problema sto ottenendo è: http: // StackOverflow.it/questions/5634125/having-problem-with-urbanairship-notification-iphone Spero che tu stia avendo qualche soluzione. grazie – Devang

3

So che era in ritardo, ma si dovrebbe vedere il progetto MonoPush. Sembra che forniranno una nuova integrazione di modalità push e statistiche dettagliate, comprese le statistiche sulla mappa.

14

In caso aiuta, ho scritto una libreria Python, PyAPNs, per interagire con il servizio di notifica push sul lato server:

http://github.com/simonwhitaker/PyAPNs

+0

Eccellente, grazie Simon! –

4

So che questa è una domanda molto vecchio e ha ho ricevuto molte risposte ma ho trovato molto utile il tutorial di Rey Wenderlich e ho voluto condividerlo per i principianti di APNS. È molto utile e molto facile da capire.

Cheers,

Aditya

1

Ecco una versione PHP5 testata di test-sceneggiatura di jessecurry. Utilizza "enhanced message format" e tenta di rilevare e visualizzare errori da Apple. Questo potrebbe dare un'indicazione su cosa c'è di sbagliato nei tuoi messaggi.

// Settings 
$deviceToken = 'xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx'; 
$apnsCert = 'apns-dev.pem'; 
$apnsHost = 'gateway.sandbox.push.apple.com'; 
$apnsPort = 2195; 

// Prepare payload 
$payload = 
array(
    'aps' => array(
     'alert' => 'Hi, this is an alert!', 
     'badge' => 8 
    ) 
); 
$payload = json_encode($payload); 
print($payload . "\n"); 

// Connect to Apple Push Notification server 
$streamContext = stream_context_create(); 
stream_context_set_option($streamContext, 'ssl', 'local_cert', $apnsCert); 
$apns = stream_socket_client('ssl://' . $apnsHost . ':' . $apnsPort, $error, $errorString, 2, STREAM_CLIENT_CONNECT, $streamContext); 
if (!$apns) { 
    die('Error creating ssl socket'); 
} 
// Don't block on reading from the socket 
stream_set_blocking ($apns, 0); 

// Send payload in enhanced message format (http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingWIthAPS/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1) 
$apnsMessage = 
    // Command "1" 
    chr(1) 
    // Identifier "88" 
    . pack('N', 88) 
    // Expiry "tomorrow" 
    . pack('N', time() + 86400) 
    // Token length 
    . chr(0) . chr(32) 
    // Device token 
    . pack('H*', str_replace(' ', '', $deviceToken)) 
    // Payload length 
    . chr(0) . chr(strlen($payload)) 
    // Actual payload 
    . $payload . $payload; 
fwrite($apns, $apnsMessage); 

// Pause for half a second to check if there were any errors during the last seconds of sending. 
usleep(500000); 

checkAppleErrorResponse($apns); 

// Close connection -- apple would prefer that we keep 
// a connection open and push data as needed. 
fclose($apns); 

function checkAppleErrorResponse($apns) 
{ 
    $responseBinary = fread($apns, 6); 
    if ($responseBinary !== false && strlen($responseBinary) == 6) 
    { 
     print(
      "\n" 
      .'Error message recieved from Apple.'."\n" 
      .'For the meaning, refer to: "Provider Communication with Apple Push Notification Service"'."\n" 
     ); 
     $response = unpack('Ccommand/Cstatus_code/Nidentifier', $responseBinary); 
     var_dump($response); 
    } 
} 
1

Prova il progetto NWPusher su GitHub. Fornisce le app OS X e iOS per inviare notifiche push manualmente, oppure è possibile utilizzare direttamente la libreria Objective-C inclusa.

Problemi correlati