Domanda Codice di esempio di Apple PNS (push notification services)


Esiste un progetto di esempio che mostra come utilizzare APNS sull'iPhone e come impostare le cose? Attualmente sto guardando la documentazione, ma sarebbe bello avere un codice funzionante da selezionare e vedere come funziona tutto insieme?

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


51
2018-06-27 11:10


origine


risposte:


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 l'abbia scritto originariamente, 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 di rails chiamata apn_on_rails che sembra funzionare piuttosto bene se stai sviluppando un'applicazione di rails, l'ho appena visto oggi ed è stato in grado di inviare notifiche dalla console.

Per quanto riguarda l'iPhone, devi solo richiamare quanto segue per registrarti a tutti i tipi di notifiche:

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

Per ricevere il token del dispositivo dovrai implementare i seguenti metodi delegati:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error

Durante i test, puoi semplicemente avviare il deviceToken nella console con NSLog, quindi incollarlo nello script python di cui sopra, in produzione dovrai ovviamente impostare un metodo per ottenere il token sui tuoi 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.


59
2017-09-28 02:16



Un buon punto di partenza è Dirigibile urbano. È 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 se non quella di essere un utente felice del loro servizio.


16
2017-12-20 05:39



Nel caso in cui aiuti, ho scritto una libreria Python, PyAPNs, per interagire con il Push Notification Service sul lato server:

http://github.com/simonwhitaker/PyAPNs


14
2017-08-28 16:58



http://blog.boxedice.com/2009/07/10/how-to-build-an-apple-push-notification-provider-server-tutorial/

Questo mi ha aiutato molto a creare codice lato provider su server Linux con PHP.


12
2017-10-05 09:51



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 sei interessato al provisioning e alla configurazione dei certificati, ecc., Puoi consultare la Guida alla programmazione del servizio di notifica push Apple.


5
2018-06-27 16:35



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

Saluti,

Aditya


4
2017-07-09 06:06



So che era tardi, ma dovresti vedere MonoPush progetto. Sembra che forniranno una nuova integrazione di modalità push e statistiche dettagliate, comprese le statistiche sulla mappa.


3
2018-06-02 10:41



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.


2
2018-06-27 16:28



Ecco una versione php5 testata dello script di test di jessecurry. Usa il 'formato di messaggio migliorato', e cerca di catturare e visualizzare gli errori di 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
2017-08-08 13:39