Przykładowy kod Apple PNS (push notification services)

Czy istnieje przykładowy projekt pokazujący, jak korzystać z APN na iPhonie i jak skonfigurować rzeczy? Obecnie przeglądam dokumentację, ale byłoby miło mieć jakiś działający kod, który można rozdzielić i zobaczyć, jak to wszystko działa razem?

Nie mogę znaleźć niczego za pomocą google lub w iphone dev center.

Author: Janak Nirmal, 2009-06-27

10 answers

Najgorszą częścią konfiguracji usługi powiadomień push jest aprowizacja. Główną przeszkodą, na którą natknąłem się było to, że jest certyfikat i klucz w .plik CER można pobrać ze strony Apple, napisałem usługę systemową w C#, który wysyłał powiadomienia i połączenia nadal nie powiodło się, ponieważ wyeksportowałem certyfikat, a nie klucz.

Nie pamiętam, kto to pierwotnie napisał, oto trochę kodu w Pythonie, który pomógł mi, gdy byłem najpierw testowanie usługi powiadomień. Podoba mi się, ponieważ jest bardzo prosty i działa dobrze podczas testów.

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()

Istnieje również klejnot rails o nazwie apn_on_rails, który wydaje się działać całkiem dobrze, jeśli tworzysz aplikację rails, właśnie widziałem ją dzisiaj i byłem w stanie wysyłać powiadomienia z konsoli.

Po stronie iPhone ' a wystarczy zadzwonić do następujących, aby zarejestrować wszystkie rodzaje powiadomień:

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

Aby otrzymać token urządzenia, musisz zaimplementuj następujące metody delegowania:

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

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

Podczas testowania możesz po prostu wrzucić urządzenie do konsoli za pomocą NSLog, a następnie wkleić je do skryptu Pythona powyżej, w produkcji oczywiście będziesz musiał skonfigurować jakąś metodę, aby dostać token na swoje serwery.

Również w produkcji musisz odpytywać usługę opinii Apple i usuwać tokeny urządzeń od użytkowników, którzy usunęli Twoją aplikację.

 59
Author: jessecurry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-08 22:49:10

Dobrym miejscem na początek jest Miejski sterowiec lotniczy . Możesz skonfigurować bezpłatne konto podstawowe, które wykona całą pracę po stronie serwera, polegającą na wysyłaniu powiadomień push na serwery Apple. Wykonują również świetną robotę, przeprowadzając Cię przez wszystkie kroki potrzebne do pracy aplikacji z ich usługą i mają doskonały przykładowy kod, który pokazuje, jak zarejestrować aplikację do powiadomień.

Nie mam z nimi nic innego jak bycie szczęśliwym użytkownikiem ich obsługa.

 15
Author: Scott K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-20 05:39:44

Na wypadek, gdyby to pomogło, napisałem bibliotekę Pythona, PyAPNs, do interakcji z usługą powiadomień Push po stronie serwera:

Http://github.com/simonwhitaker/PyAPNs

 14
Author: Simon Whitaker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-28 16:58:43

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

Ten bardzo mi pomógł w tworzeniu kodu po stronie dostawcy na serwerze linux z PHP.

 12
Author: Mladen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-05 09:51:07

Naprawdę nie ma zbyt wiele kodu do napisania po stronie iPhone ' a. Musisz zdobyć unikalny token iPhone ' a lub iPoda Touch, a następnie przekazać ten token na serwer. Uzyskanie tokenu wymaga wywołania aplikacji UIApplication, ale nie ma predefiniowanego sposobu, aby dostać się do serwera. Jedna z moich aplikacji wykonuje Post HTTP do skryptu PHP, który umieszcza token w bazie danych.

Jeśli jesteś ciekawy Aprowizacji i konfiguracji certyfikatów itp..., możesz sprawdzić Apple Push Notification Service Programming Guide.

 5
Author: Ben Gotow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-27 16:35:47

Wiem, że jest to bardzo stare pytanie i otrzymał wiele odpowiedzi, ale znalazłem tutorial Rey Wenderlich bardzo przydatne i chciał podzielić się nim dla początkujących APNS. Jest to bardzo przydatne i bardzo łatwe do zrozumienia.

 4
Author: Aditya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-03 11:52:52

Wiem, że było późno, ale powinieneś zobaczyć monopush project. Wydaje się, że będą one stanowić nowy sposób integracji push, a także szczegółowe statystyki, w tym statystyki na mapie.

 3
Author: fyasar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-02 10:41:28

Zajrzyj na fora w iPhone dev center, podobno jest wiele przykładów kodu po stronie serwera, aby porozmawiać z serwerem push Apple.

 2
Author: Kendall Helmstetter Gelner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-27 16:28:18

Oto przetestowana wersja testowego skryptu jessecurry php5. Używa "enhanced message format " i próbuje wyłapać i wyświetlić błędy z apple. Może to wskazywać, co jest nie tak z wiadomościami.

// 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
Author: Simon Epskamp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-08 13:44:59

Wypróbuj projekt NWPusher na Githubie. Zapewnia aplikacje OS X i iOS do ręcznego wysyłania powiadomień push lub można użyć dołączonej biblioteki Objective-C bezpośrednio.

 1
Author: leo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-27 08:41:32