Подтвердить что ты не робот

Пример кода Apple PNS (push notification services)

Есть ли пример проекта, показывающий, как использовать APNS на IPhone и как настраивать вещи? В настоящее время я смотрю документацию, но было бы неплохо, если бы какой-то рабочий код разобрал и посмотрел, как все работает вместе?

Я не могу найти ничего, используя Google или в центре iphone dev.

4b9b3361

Ответ 1

Худшая часть настройки службы push-уведомлений - это подготовка. Основным камнем преткновения, с которым я столкнулся, было то, что у вас есть сертификат и ключ в файле .cer, который вы загружаете с сайта Apple, я написал системную службу на С#, на которой были отправлены уведомления, а соединения не сработали, потому что я экспортировал сертификат а не ключ.

Я не помню, кто изначально написал это, вот немного кода на питоне, который помог мне, когда я впервые тестировал службу уведомлений. Мне это нравится, потому что это очень просто и хорошо работает во время тестирования.

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\ Down!',
          'sound':'k1DiveAlarm.caf',
          'badge':42,
          },
     'test_data': { 'foo': 'bar' },
     }

# Certificate issued by apple and converted to .pem format with openSSL
# Per Apple 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()

Там также есть рельсы gem, называемые apn_on_rails, которые, похоже, работают очень хорошо, если вы разрабатываете приложение rails, я только что видел его сегодня и смог отправлять уведомления с консоли.

На стороне iPhone вам просто нужно вызвать следующее для регистрации для всех типов уведомлений:

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

Чтобы получить токен устройства, вам необходимо реализовать следующие методы делегирования:

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

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

Во время тестирования вы можете просто нажать на устройство DeviceNoken на консоль с помощью NSLog, а затем вставить его в python script выше, в процессе производства вам, очевидно, потребуется настроить некоторый метод для получения маркера на ваших серверах.

Кроме того, в процессе производства вам потребуется запросить службу обратной связи Apple и удалить токены устройств у пользователей, которые удалили ваше приложение.

Ответ 2

Хорошим местом для начала является Urban Airship. Вы можете создать бесплатную базовую учетную запись, которая будет выполнять всю серверную работу по отправке push-уведомлений на серверы Apple. Они также отлично справляются с выполнением всех шагов, необходимых для работы вашего приложения со своим сервисом, и имеют отличный примерный код, который показывает, как регистрировать ваше приложение для уведомлений.

У меня нет другой принадлежности к ним, кроме как счастливого пользователя их службы.

Ответ 3

В случае, если это помогает, я написал библиотеку Python, PyAPN, для взаимодействия с Push Notification Service на стороне сервера:

http://github.com/simonwhitaker/PyAPNs

Ответ 5

На стороне iPhone действительно мало кода для написания. Вам нужно получить уникальный токен iPhone или iPod Touch, а затем передать этот токен на ваш сервер. Получение маркера требует вызова UIApplication, но нет предопределенного способа получить его на вашем сервере. Одно из моих приложений выполняет HTTP POST для PHP script, который помещает токен в базу данных.

Если вам интересно узнать о настройке и настройке сертификатов и т.д., вы можете ознакомиться с руководством по программированию службы Apple Push Notification.

Ответ 6

Я знаю, что это очень старый вопрос и получил много ответов, но я нашел учебник Rey Wenderlich очень полезный и хотел поделиться им для начинающих APNS. Это очень полезно и очень легко понять.

Приветствия,

Адитья

Ответ 7

Я знаю, что было поздно, но вы должны увидеть проект MonoPush. Похоже, что они будут обеспечивать новый подход к интеграции, а также подробную статистику, включая статистику по карте.

Ответ 8

Посмотрите на форумах в iPhone dev center, предположительно, есть много примеров кода на стороне сервера, чтобы поговорить с Apple push server.

Ответ 9

Здесь протестирована версия теста jessecurry версии php5 script. Он использует расширенный формат сообщений и пытается поймать и отобразить ошибки из яблока. Это может указывать на то, что не так с вашими сообщениями.

// 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);
    }
}

Ответ 10

Попробуйте NWPusher проект на GitHub. Он предоставляет приложениям OS X и iOS для отправки push-уведомлений вручную или вы можете напрямую использовать встроенную библиотеку Objective-C.