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.
$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.












27 Responses to “T#016 – Implementiamo le Push Notifications”
8 Dicembre 2009
HackYouriPhone🙂 Questa te l’ho trovata io 🙂
9 Dicembre 2009
walterInteressantissimo 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 “.
9 Dicembre 2009
iCGdev1. 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).
9 Dicembre 2009
waltercapisco,
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 🙂
9 Dicembre 2009
iCGdevPurtroppo 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
10 Dicembre 2009
walterTi ringrazio! 🙂
3 Marzo 2010
DuccioUna collezione completa di classi PHP per interagire con Apple Push Notification Service è disponibile su Google Code: http://code.google.com/p/apns-php/
3 Marzo 2010
Staff devAPPGrazie per la segnalazione, faremo presto un articolo su questa collezione che inseriremo nella sezione “Materiale OpenSource” 😉
4 Marzo 2010
ApnsPHP: Classi PHP per le Apple Push Notification (OpenSource) | devAPP[…] Se questo è quello che cercate, vi consiglio di visitare questo utilissimo link, segnalatoci da un nostro utente (Duccio): […]
29 Maggio 2010
GinoUna 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
24 Settembre 2010
sarnieriSu ioProgrammo di questo mese (settembre 2010) ho scritto un lungo articolo sulle push notification, completo di esempio funzionante lato client e lato server!
21 Ottobre 2010
iCiccioCiao, sto seguendo questa guida per creare notifiche push del mio sito WP, ma mi blocco ai comandi al terminale, infatti il primo comando è OK, ma il secondo
openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem
mi da errore:
Error opening input file apns-dev-key.p12
apns-dev-key.p12: No such file or directory
Come mai?
21 Ottobre 2010
iCiccioScusate ho risolto, solo che ho scoperto che con ARUBA si fa poco, non avendo il supporto SSL… UFFF
Consigli??
22 Maggio 2011
FabioSalve, ho implementato le notifiche nella mia app di test, solo che non capisco come poter fare per conoscere i device token a cui inviare le notifiche…
se setto a mano il device token tutto funziona, ma per automatizzare la cosa come posso fare?
28 Maggio 2011
Installoso AppsincoQuotone!! Anche io vorrei saperlo|
14 Settembre 2011
MatteoCome faccio dall’App a memorizzare il token dell’iphone su DataBase??
13 Dicembre 2011
SadSoulUn semplice domanda, tutto funziona in fase di test, ma una volta che l’APP è approvata, bisogna modificare oltre all’indirizzo di invio, anche il certificato .pem, giusto? Io ho utilizzato le stesse linee di comando per apns-dev.pem, ma il risultato è che i device si registrano correttamente, token salvati, ma notifica push non arriva, qualcuno sa darmi qualche dritta?
Grazie!
9 Gennaio 2012
Dario De NicolaSalve, ho un server dedicato su aruba con estensione ssl, ma non riesco a far funzionare lo script lato server per far partire le notifiche, in particolare mi dà errore nel momento in cui si connette al server apple, senza indicarmi nè numero nè messaggio di errore.
Avete idea di quale possa essere il problema?
Domanda: sul server va istallato il certificato usato per la connessione o basta semplicemente uploadarlo?
Grazie
27 Gennaio 2012
Failed to register with error: Error Domain=NSCocoaErrorDomain Code=3000 | iOS Dev Blog[…] completezza, il codice da inserire nel metodo application:didFinishLaunchingWithOptions: dell’AppDelegate […]
29 Gennaio 2012
Installare il certificato per le Push Notification | iOS Dev Blog[…] una annotazione riguardante l’utile articolo di devAPP sulle Notifiche Push. Quando si parla di installare il certificato ci si riferisce, una volta […]
7 Febbraio 2012
GiulianoSalve,
Ho pronto al seguire il tutorial ma mi sono perso a questo punto:
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.
Espandetelo cosa significa? Ho provato ad aprirlo ma non vedo nessuna chiave. Potreste aiutarmi con questo passaggio?
Grazie Giuliano
21 Febbraio 2012
danielascusa due domande:
nei certificati quando esporto il primo e cli cambio il nome in apns-dev-cert.p12 mi da errore e dice che non può avere estensione .p12 bensì cer. !
seconda cosa quando faccio :
Tornate al certificato “Apple Development Push Services” ed espandetelo cliccando sulla freccia grigia alla sua sinistra…
non ho nessuna freccia grigia per visualizzare la chiave…. come posso fare ?
Grazie Daniela
11 Marzo 2012
danielaNon c’è nessuno che lo sa?
Grazie
2 Aprile 2012
ValerioRagazzi io sto provando a far funzionare queste benedette notifiche da diversi giorni…ho continui problemi con il server che non è abilitato alla comunicazione sicura SSL…acquistando un certificato da qualche autorità (vedi ENTRUST citata nella guida della Apple) pensate che riesca a risolvere la situazione?
thanks all!!!
23 Agosto 2012
AchilleCiao, poichè il deviceuuid è stato non solo deprecato ma sembra che apple non accetti più app che ne fanno uso, volevo sapere se è obbligatorio o può essere rimosso dal codice. Da un’occhiata veloce al codice mi sembra che non serva per inoltrare la push ai server apple.
6 Novembre 2012
AdriatikOvviamente devi inviare il deviceToken ad un server il quale lo registra in db. Così facendo, al momento in cui si desidera inviare una notifica push a tutti i devices, basterà fare un ciclo di tutti i deviceToken.
20 Novembre 2012
AlessandroCiao, ho seguito la guida e mi ha aiutato un po’ a iniziare … premesso che su mountain laion nel portachiavi non mi fa vedere la seconda chiave ma solo il certificato… la buona notizia è che posso esportarlo direttamente in pem … speriamo bene …
La domanda ora è un’altra… il mio server (hostingsolutions) mi blocca gli stream e sono costretto ad usare cURL al posto di stream_context_create e compagnia. Qualcuno hai idea di come effettuare la conversione?