Добрый день, Хабражитель.
Наверное, все знают, что в iOS есть такой полезный сервис, как Push-уведомления.
Я тоже был в курсе, но пока не столкнулся с реальным его применением, даже не знал, что с ним столько нюансов.
В этой теме вы узнаете два аспекта этого сервиса: что вам нужно делать в xCode и как самим отправлять push-сообщения через php-сервер.
Ниже под катом описание того, как все это работает. Я столкнулся с Push совсем недавно, когда разрабатывал свое новое приложение — Семейные расходы .
Там я собирался использовать Push для уведомления пользователя о запросе синхронизации.
Push-уведомления бывают двух типов: локальные и удаленные.
В этой статье мы не будем рассматривать локальные.
Они имеют достаточно простой механизм реализации и подробно описаны в ссылках.
Механизм удаленного Push-уведомления заключается в следующем.
- При запуске приложения вызывается метод DidRegisterForRemoteNotificationsWithDeviceToken, который при наличии подключения к Интернету возвращает 64-значную строку Token. В этой конструкции есть нюанс: она почему-то идет с символами «<” and “> » в начале и конце и пробелы в середине.
Поэтому стоит очистить линию от этих символов.
- Токен необходимо отправить на ваш сервер, на котором он хранится.
По сути, это уникальный адрес приложения и устройства.
Затем через него отправляются push-уведомления.
Код ниже представляет собой именно механизм, описанный в пунктах 1 и 2.
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { NSMutableString *tokenString = [NSMutableString stringWithString: [[deviceToken description] uppercaseString]]; [tokenString replaceOccurrencesOfString:@"<" withString:@"" options:0 range:NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString:@">" withString:@"" options:0 range:NSMakeRange (0, tokenString.length)]; [tokenString replaceOccurrencesOfString:@" " withString:@"" options:0 range:NSMakeRange (0, tokenString.length)]; NSLog(@"Token: %@", tokenString); if (tokenString) { [[NSUserDefaults standardUserDefaults] setObject:tokenString forKey:@"token"]; } NSString *urlFormat = @" http://your.domain.com/regDevice.phpЭdeviceToken=%@ "; NSURL *registrationURL = [NSURL URLWithString:[NSString stringWithFormat: urlFormat, tokenString]; NSMutableURLRequest *registrationRequest = [[NSMutableURLRequest alloc] initWithURL:registrationURL ]; [registrationRequest setHTTPMethod:@"PUT"]; NSURLConnection *connection = [NSURLConnection connectionWithRequest:registrationRequest delegate:self ]; [connection start]; [registrationRequest release]; }
- При необходимости наш сервер инициирует отправку Push-уведомления, адресом получателя которого является Токен.
Для этого на сервере должен быть Push-сертификат, который можно получить разработчик.
apple.com в разделе «Портал обеспечения» -> «Идентификаторы приложений» -> «Настроить» напротив вашего идентификатора приложения.
Подробно описывать этот процесс я не буду, потому что там же есть пошаговая инструкция по созданию сертификата.
Но этот сертификат не совсем подходит для нашего сервера.
Его еще необходимо обработать и объединить с вашим сертификатом разработчика.
Подробную пошаговую инструкцию можно найти здесь Здесь .
На своем сервере я использовал ApnsPHP — класс с открытым исходным кодом для взаимодействия со службой push-уведомлений Apple. Все очень просто и удобно.
Самое главное, что оно начинается с полпинка.
code.google.com/p/apns-php Также есть пример проекта для xCode с механизмом обработки входящих Push-сообщений.
В общем, это почти все.
Теперь нюансы, с которыми я столкнулся.
Для отправки сообщений в Apple было предусмотрено два сервера: ssl://gateway.push.apple.com:2195 ssl://gateway.sandbox.push.apple.com:2195
Первый используется для готовых продуктов, а второй — для тестирования, в «песочнице».
Если вы тестируете приложение в режиме отладки и с профилем обеспечения разработчика, используйте песочницу при тестировании на сервере.
Если вы делаете Ad Hoc-релиз, то есть подписываете приложение сертификатом для распространения, то песочница перестанет работать.
Пишу об этом, потому что долго не мог понять, почему это не работает. Также существует специальный механизм очистки базы токенов от адресов, которые больше не действительны.
Например, если приложение было удалено с устройства.
Для этого вы можете использовать ApnsPHP; для этого тоже есть механизмы.
Надеюсь, я достаточно просто описал механизм.
УПД.
Просто экспериментировал.
Оказалось, что для конкретного устройства, а может и для одного разработчика, существует только один Токен.
Потому что с разными идентификаторами пакета я получаю один и тот же токен.
А вот в какое приложение его отправить - это определяется сертификатом, который есть на сервере.
Теги: #push #iOS #iphone #Я пиарюсь
-
Eboostr: Readyboost Для Windows Xp
19 Oct, 24 -
Сравнение Гибких Методологий
19 Oct, 24 -
Загрузка Моделей, Черт
19 Oct, 24