T#016 – Implementiamo le Push Notifications
Oggi vedremo come implementare le notifiche push nelle nostre applicazioni. Ringraziamo lo sviluppatore Cristian Gintili, creatore delle applicazioni Million, Clienti e Genoa (che potete trovare su App Store), il quale ci ha concesso la pubblicazione di questa utilissima guida disponibile anche sul suo sito personale iCGdev.
La prima cosa da fare per poter utilizzare le notifiche push nella propria applicazione iPhone, è creare i profili ed i certificati. Accedere quindi all’iPhone Developer Program Portal ed andare nella sezione App IDs. Non è possibile utilizzare un profilo con wild-card (ovvero con l’asterisco), per cui se non avete già un profilo senza wild-card, dovete crearne uno nuovo cliccando su New App ID.
Dopo aver creato l’App ID, cliccate su Configure e create il certificato SSL seguendo la procedura guidata (molto semplice). Al termine del procedimento, scaricate il certificato appena creato (file con estensione .cer).
Ora dovete installare il certificato appena scaricato: doppio click su di esso ed il certificato verrà importato nel Portachiavi. Nel Portachiavi, andate nella categoria “I miei certificati” e noterete un certificato chiamato “Apple Development Push Services“, cliccateci sopra col tasto destro del mouse e cliccate su Esporta. Salvate il file con il nome apns-dev-cert.p12 Tornate al certificato “Apple Development Push Services” ed espandetelo cliccando sulla freccia grigia alla sua sinistra. Noterete una chiave, cliccateci sopra col tasto destro del mouse ed esportatela salvandola col nome apns-dev-key.p12.
Aprite il terminale e posizionatevi nella cartella dove avete esportato i file sopra citati. Date i seguenti comandi, uno dopo l’altro (inserendo la password e la passphrase dove richiesto):
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12 openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12 openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem
Tra tutti i file generati, a voi interessa il file apns-dev.pem che dovrete “uppare” sul vostro server. L’installazione dei certificati è terminata. Ora dovete installare i profili. Tornate nell’iPhone Developer Program Portal ed andate nella sezione Provisioning. Create un nuovo profilo e scaricatelo. Importatelo in Xcode utilizzando la stessa procedura che avete usato per gli altri profili.
Questa procedura va eseguita due volte: una per i certificati e profili per il development (ovvero quando testate l’applicazione) e una per la distribution (ovvero quando inviate l’applicazione alla Apple).
N.B. Il certificato ed il profilo valgono solo per una singola applicazione. Per cui se volete inserire le push notifications in più applicazioni, dovrete installare più certificati e profili.
Ora viene la parte della programmazione, che si divide in ulteriori due parti: server e client.
Per utilizzare le Notifiche Push, dovete disporre di un vostro server remoto sempre accessibile, nel quale dovrete eseguire uno script (o un demone, un processo, un’applicazione, ecc ecc) che si occuperà di comunicare con i server della Apple.
Di seguito vi posto uno script PHP che, ogni volta che viene richiamato, invia una richiesta al server della Apple, il quale poi si occuperà di inviare la notifica all’iPhone dove è installata la vostra applicazione.
<?php $deviceToken = $token; // token dell’iPhone a cui inviare la notifica // Passphrase for the private key (ck.pem file) // $pass = ”; // Get the parameters from http get or from command line $message = ‘Testo Notifica Push’; $badge = 1; $sound = ‘default’; // Construct the notification payload $body = array(); $body['aps'] = array(’alert’ => $message); if ($badge) $body['aps']['badge'] = $badge; if ($sound) $body['aps']['sound'] = $sound; /* End of Configurable Items */ $ctx = stream_context_create(); stream_context_set_option($ctx, ’ssl’, ‘local_cert’, ‘apns-dev.pem’); // assume the private key passphase was removed. // stream_context_set_option($ctx, ’ssl’, ’passphrase’, $pass); $fp = stream_socket_client(’ssl://gateway.sandbox.push.apple.com:2195′, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); if (!$fp) { print “Failed to connect $err $errstrn”; return; } else { print “Connection OK\n”; } $payload = json_encode($body); $msg = chr(0) . pack(’n',32) . pack(’H*’, str_replace(’ ’, ”, $deviceToken)) . pack(’n',strlen($payload)) . $payload; print “sending message :” . $payload . “\n”; fwrite($fp, $msg); fclose($fp); ?>
Questo file lo potete e dovete modificare a vostro piacimento, oppure potete utilizzare un altro tipo di sistema per creare uno script lato server. Dovete “uppare” sul vostro server, sia lo script qui sopra (od un altro al suo posto) sia il certificato apns-dev.pem creato in precedenza.
N.B.: per il development, dovete utilizzare il server ssl://gateway.sandbox.push.apple.com:2195 per testare le push notifications, mentre per la distribution dovete utilizzare il server ssl://gateway.push.apple.com:2195
La programmazione lato server è terminata, ora non resta che occuparci della parte client, ovvero la parte che riguarda la vostra applicazione.
A questo punto abbiamo due cose da fare:
- abilitare le notifiche push
- prelevare il token del device.
La Apple raccomanda di prelevare il token ogni volta che viene avviata l’applicazione. Questo perchè, in caso di ripristino, il token cambia, per cui, se non lo aggiornate, le notifiche push non arriveranno più su quel device.
Per abilitare le notifiche push, inserite la seguente stringa nel metodo applicationDidFinishLaunching nell’appDelegate:
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge];
Dopodichè, sempre nell’appDelegate, impostate i seguenti metodi:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken{ // Qui registrate e/o inviate il token } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)err{ // Qui intercettate eventuali errori avvenuti se la registrazione fallisce }
La parte client è già bella che finita!
Bene, questo è tutto quello che c’è da sapere sull’implementazione delle Push Notifications nelle vostre applicazioni.
| Stampa l'articolo | Questo articolo è stato pubblicato da Staff devAPP il 8 dicembre 2009 alle 07:30, ed è archiviato come Tutorial Pratici. Puoi seguire i commenti a questo post attraverso RSS 2.0. Puoi pubblicare un commento o segnalare un trackback dal tuo sito. |























circa 7 mesi fa
circa 7 mesi fa
Interessantissimo come sempre!
Ci sono un paio di punti che non mi sono chiari…
1.
Nello script php la prima variabile $deviceToken = $token
Non mi è ben chiaro il valore di $token da dove è derivato.
2.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken{
// Qui registrate e/o inviate il token
}
Come si registra il token? Con che tipo di richiesta viene inviato?
3.
Attenzione agli apici, singoli e doppi, probabilmente derivati da un file word, vanno sostituiti con i più comuni ‘ e “.
circa 7 mesi fa
1. E’ il valore che tu dovrai registrare sul tuo server (in un database, file, ecc ecc). Con lo script non fai altro che recuperarlo.
2. Devi salvare il token sul tuo server. Quindi dovrai richiamare una pagina sul server passandogli il token e tramite uno script (php o altro) lo salvi (in un database, file, ecc ecc).
Una cosa che non ho specificato (perchè già presente sulla documentazione ufficiale apple): il token va registrato senza spazi ed i simboli “” (quindi basta fare un trimming ed un replace).
circa 7 mesi fa
capisco,
Mi dispiace ma con xcode sono alle prime armi quindi direi che alcuni passaggi sono fondamentali, come la necessita di possedere una cartella in scrittura e/o creare uno script che utilizzi l’ftp e/o necessità di un db sul server.
Magari non tutti gli xcoder conoscono anche un linguaggio di scripting o come funziona un server web.
Credo che il bello di questo sito è la semplicità delle informazioni.
Naturalmente è una mia opinione personale, quindi da prendere con le pinze!
Con quali metodi può inviare xcode la richiesta e/o token al server?
Prendo come esempio che utilizzi un GET (es. index.php?deviceToken=token) quindi di seguito la prima riga:
$deviceToken = $_GET['deviceToken'];
Amo le conversazioni costruttive ed è solo per capire meglio come agire.
p.s.
Gli apici che vengono mostrati in stile sql nel codice vengono modificati direttamente da wordpress quindi non è frutto di un file word
circa 7 mesi fa
Purtroppo in una guida come questa non si possono trattare tutti gli argomenti, come i webserver e l’invio di una richiesta GET ad un server remoto. Per due motivi principali:
1. Viene troppo dispendioso e dispersivo
2. Google (per i web server) e la documentazione Apple (per le richeste get/post) spiegano già ampiamente l’argomento.
Comunque, nella fattispecie, per inviare il token tramite richiesta GET, è sufficiente utilizzare gli oggetti NSURLRequest ed NSURLConnection
circa 7 mesi fa
Ti ringrazio!
circa 5 mesi fa
Una collezione completa di classi PHP per interagire con Apple Push Notification Service è disponibile su Google Code: http://code.google.com/p/apns-php/
circa 4 mesi fa
Grazie per la segnalazione, faremo presto un articolo su questa collezione che inseriremo nella sezione “Materiale OpenSource”
circa 2 mesi fa
Una cosa da aggiungere importantissima…
———————————————————-
Non tutti i server apachi/php possono far girare il suddetto script! in pratica bisogna che siano attive le estensioni SSL per richiamare tramite socket un indirizzo ssl://gateway.push.apple.com:2195 o ssl://gateway.sandbox.push.apple.com:2195 per la distribuzione…
Alla fine sono riuscito a far funzionare le push notification dentro all’app PuntiPatentePlus, ma ho dovuto rimediare un server installato privatamente perchè sui miei domini di register.it non c’è stato verso di farli andare!!!! Idem su quelli di aruba sia su macchine windows che linux… quindi il mio consiglio è… prima di addentrarvi e sviluppare fare qualche test sui domini a disposizione!
ciao
Gino