Чтение онлайн

ЖАНРЫ

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

Теперь напишем несложный PHP-сценарий для отправки простого пуш-уведомления на устройство. Но прежде чем мы двинемся дальше, необходимо получить маркер пуш-уведомлений, действующий на нашем устройстве. Мы должны получить его в таком формате, который понятен PHP. iOS инкапсулирует маркер пуш-уведомления в экземпляр NSData, но PHP неизвестно, что такое NSData. Нам нужно преобразовать этот маркер в строку, которую мы сможем использовать в нашем PHP-сценарии. Для этого считываем весь маркер байт за байтом и преобразуем каждый байт в шестнадцатеричное строковое представление:

— (void) application:(UIApplication *)application

didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{

/* Каждый
байт данных будет преобразован в свое шестнадцатеричное

значение, например 0x01 или 0xAB. При этом часть 0x отбрасывается.

Итак, для представления 1 байта нам потребуются два символа, поэтому

здесь указано * 2 */

NSMutableString *tokenAsString = [[NSMutableString alloc]

initWithCapacity: deviceToken.length * 2];

char *bytes = malloc(deviceToken.length);

[deviceToken getBytes: bytes];

for (NSUInteger byteCounter = 0;

byteCounter < deviceToken.length;

byteCounter++){

char byte = bytes[byteCounter];

[tokenAsString appendFormat:@"%02hhX", byte];

}

free(bytes);

NSLog(@"Token = %@", tokenAsString);

}

Запустите ваше приложение и убедитесь, что маркер устройства выводится на консоль, вот так:

Token = 05924634A8EB6B84437A1E8CE02E6BE6683DEC83FB38680A7DFD6A04C6CC586E

Отметьте себе этот маркер устройства, так как мы будем пользоваться им в PHP-сценарии:

<?php

/* При разработке мы пользуемся защищенной версией APNS. При подготовке

приложения для использования в реальных условиях измените это значение

на ssl://gateway.push.apple.com:2195 */

$apnsServer = 'ssl://gateway.sandbox.push.apple.com:2195';

/* Убедитесь, что это значение совпадает с паролем, который вы задали

для закрытого ключа при экспорте в.pem-файл, когда использовали openssl

в системе OS X */

$privateKeyPassword = '1234';

/* Если хотите, запишите здесь собственное сообщение */

$message = 'Welcome to iOS 7 Push Notifications';

/* Запишите здесь маркер вашего устройства */

$deviceToken =

'05924634A8EB6B84437A1E8CE02E6BE6683DEC83FB38680A7DFD6A04C6CC586E';

/* Замените эту информацию именем файла, указанного в файле вашего

сценария. В этом файле должны содержаться сгенерированные вами ранее

сертификат
и закрытый ключ */

$pushCertAndKeyPemFile = 'PushCertificateAndKey.pem';

$stream = stream_context_create;

stream_context_set_option($stream,

'ssl',

'passphrase',

$privateKeyPassword);

stream_context_set_option($stream,

'ssl',

'local_cert',

$pushCertAndKeyPemFile);

$connectionTimeout = 20;

$connectionType = STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT;

$connection = stream_socket_client($apnsServer,

$errorNumber,

$errorString,

$connectionTimeout,

$connectionType,

$stream);

if (!$connection){

echo «Failed to connect to the APNS server. Error no = $errorNumber<br/>»;

exit;

} else {

echo «Successfully connected to the APNS. Processing…</br>»;

}

$messageBody['aps'] = array('alert' => $message,

'sound' => 'default',

'badge' => 2,

);

$payload = json_encode($messageBody);

$notification = chr(0).

pack('n', 32).

pack('H*', $deviceToken).

pack('n', strlen($payload)).

$payload;

$wroteSuccessfully = fwrite($connection, $notification,

strlen($notification));

if (!$wroteSuccessfully){

echo «Could not send the message<br/>»;

}

else {

echo «Successfully sent the message<br/>»;

}

fclose($connection);

Если вы даже не программируете на PHP, внимательно просмотрите этот сценарий и почитайте комментарии к нему. Обязательно замените все значения в этом сценарии теми, что соответствуют вашему приложению. Например, используемый здесь маркер относится к моему устройству. Пользуйтесь маркером своего устройства, который выяснили ранее в этом разделе. У вас будут иные пароли, pem-файлы, скорее всего, будут находиться в других местах. Ради дополнительного упрощения этого раздела я поместил свой PHP-сценарий в тот же каталог, в котором ранее сохранил закрытый ключ и. pem-файл сертификата (PushCertificateAndKey.pem). Поэтому я могу обращаться к. pem-файлу просто по его имени.

Поделиться с друзьями: