Comments 33
Ох ты ну и статья! Мы используем Appoxee.com, правда, и задачка у нас пока простая — показать сообщение и обратить внимание пользователя на него.
UFO landed and left these words here
В начале же обозначено, что это вольный перевод со ссылкой на источник, нет?
Почему бы не поблагодарить человека за проделанную работу, а потом уже искать к чему придраться?!
Потому, что для переводов есть специальный тип статьи.

Ну а так годнота. Если бы автор оригинала еще больше про свой сервер уведомлений рассказал. Ведь не просто так люди всякие Urbanairship используют.
То есть тот же скайп запущенный или аська на эппле могут в тупую уснуть и месседж дойдёт неизвестно когда? Так?
На андроиде тоже?
Я вот не понял, а причем тут вообще приложения? Речь же про пуш нотификаторы.
На сколько я понял, автор писал, что нет никакой возможности узнать, дошел ли нотификатор до девайса, увидел ли его пользователь, закрыл или нажал на него.
Если я правильно понял, вы имеете в виду скайп или аську, запущенные на девайсе с iOS. Не могу сказать по поводу аськи, но если запустить скайп, войти под своими логином и паролем и перевести приложение в фоновый режим, то сообщения будут приходить в виде push-уведомлений (с наличием, конечно, интернета). Если «прибить» приложение — не будут приходить.

По Андроиду не могу сказать, но думаю, что на этой платформе можно ожидать аналогичного поведения.
В общем случае, уведомление приходит вне зависимости от того, запущено приложение, или нет. Уведомление ориентируется на токен устройства и bundle identifier.

Не прийти оно может только если нет доступа в сеть. Ну, или если заблудилось по дороге.
В общем случае — безусловно. В случае если «убить» скайп, уведомления не будут приходить.
Потому что «серверная часть» скайпа не отправляет уведомления, если пользователь в оффлайне.
потому что скайп как VoIP приложение может работать в фоне по-настоящему, ему не нужны пуши, поэтому это не пуши, а локальные уведомления.
меседж дойдет в любом случае, когда Вы запутсите приложение снова, даже если пуш потеряется.

Ну а скайп постоянно работает в фоне, так что его это не касается.
Однажды я два дня занимался сексом с пуш-уведомлениями, потому что они не приходили.
Оказалось, что у меня телефон подглючил и не принимал их. Через пару часов, после наладки, всё стало отлично приниматься.
Так что не торопитесь опускать руки при работе с пуш-уведомлениями, и проверяйте всё на несколько раз.
А еще стоит проверить время на сервере, т.к. оно может сбится, и часть пушей может отправляться в «прошлое».
Приложение для тестирования это хорошо, но многим хотелось бы узнать как правильно настроить свой vds/vps для работы с push сертификатом.
В статье написано о том, что пользователь может индивидуально настроить виды уведомлений. Но не сказано, можно ли самому по умолчанию задать тип уведомлений с помощью кода?

Также когда-то потратил несколько дней на все выше описанное. Уперся в сервеную часть и хостинг со стороны клиента. На том и закончили. Позже, узнал об quickblox.com где уже реализована серверная часть для Push Notification, алерты, мультиплатформенныхе ведомления.
Задавался аналогичным вопросом и нашёл ответ на него: нет, задать тип уведомлений нельзя, т. к. начиная с iOS 5.0 под алертом понимается как баннер, так и напоминание. И баннер выбирается по умолчанию в связи со своей ненавязчивостью.
Не очень понимаю цель перевода статей с английского языка, ну да ладно.

Я последние полторы недели делал уведомления для APNS и GCM. Добавлю свои 5 копеек.

1. mobiforge.com/developing/story/programming-apple-push-notification-services такая же статья про настройку от и до. Только больше кода на Objective C и есть какой-то текст про написание собственно провайдера.

2. Есть засада с сертификатами Entrust, которые использует APNS. Копипаста из доков:
Note: To establish a TLS session with APNs, an Entrust Secure CA root certificate must be installed on the provider’s server. If the server is running OS X, this root certificate is already in the keychain. On other systems, the certificate might not be available. You can download this certificate from the Entrust SSL Certificates website.

3. На самом деле, у APNS есть два способа обратной связи
— Feedback service/ Ее надо поллить раз в час… день на предмет inactive devices — устройств, на которые пуши стабильно не доходят. Обычно это означает, что приложение с девайса уже удалено. Такие токены надо вычищать из своего хранилища, в противном случае APNS теоретически может применить санкции за abuse пуш сервиса.
— Error detection (для Enhanced format) — все исходящие сообщения пронумерованы, в ответ прилетают пакеты-нотификации с кодами ошибок.

Оф. документация на оба момента — goo.gl/rwO8t

4. Мой бекенд разработан на Java/Scala, APNS провайдер тоже писался на Java. Как ни странно, ситуация с клиентскими библиотеками для APNS аховая. Собственно, их всего две — github.com/notnoop/java-apns (Java-APNS) и code.google.com/p/javapns/ (JavaPNS).

Последняя отвратительно написана и энкораджит откровенно плохой стиль кодирования. Можно просто поглядеть исходники и все сразу станет ясно.

Java-apns написана отлично и не тянет лишних депенденций. Проблема с ней — автор отошел от дел полтора года назад, версию 2.0 в мавен не зарелизил и по сути проект не поддерживается. Последняя доступная в maven central версия имеет отровенные баги — ну, например, в конфигурации с тред-пулом не работает error detection. Тем не менее, качество кода отличное и исправление занимает минуты. Многие компании форкнули либу и используют в работе со своими мелками доделками. В пул-реквестах на гитхабе все это хорошо видно.
Добрый день, спасибо за статью. Читала аналогичную статью www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1. Там используется приватный ключ и девелоперский сертификат. У вас приватный ключ не используется, тем не менее все работает (предполагаю, система видит его в связке ключей). А вот скрипт с «raywenderlich» мне запустить не удалось, выдает ошибку «verify error:num=20:unable to get local issuer certificate». Может знаете в чем причина?
Здравствуйте!

Приватный ключ создаётся, когда мы генерируем CSR-файл (который нужен для создания сертификата). Потом на основе сертификата и приватного ключа (его экспортируем из связки ключей с заданием пароля) генерируем pem-файл (содержит комбинацию из pem сертификата и pem приватного ключа). А потом закидываем итоговый pem-файл в папку со скриптом SimplePush. В самом скрипте прописываем токен, пароль на приватный ключ (задаётся при экспорте) и сообщение.

Касательно вашей проблемы, то тут как раз что-то не так с итоговым pem-файлом. Попробуйте пересоздать pem-файлы для сертификата и приватного ключа и выполнить в терминале:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert Certificate.pem -key PrivateKey.pem

Если запрос проходит, то генерируем на основе этих двух pem-файлов один pem-файл, и его кладём в папку со скриптом. Если запрос не проходит, значит что-то не так с сертификатом, и самый простой способ решения проблемы — с самого начала пройти всю процедуру генерации CSR-файла, сертификата и т. д. :)

P. S. Команды генерации pem-файлов есть в статье на reywenderlich.com.
Спасибо за ответ. Данный запрос выдает
Enter pass phrase for PushChatKey.pem:
CONNECTED(00000003)
depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=© 2009 Entrust, Inc./CN=Entrust Certification Authority — L1C
verify error:num=20:unable to get local issuer certificate
verify return:0
и т.п.

Является ли это ошибкой (verify error:num=20:unable to get local issuer certificate)?
Я пробовала многократно пересоздавать все файлы.
Поскольку программка " PushMeBabe" отрабатывает нормально, предполагаю, что девелоперский сертификат и приватный ключ в порядке.
Не работает simplepush.php. Видимо что-то неправильно с *.pem -файлами. Хотя их генерируют 2 инструкции:
$ openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
$ openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12
не понимаю, что могла сделать неправильно.

Да, это ошибка.

Если PushMeBaby отрабатывает, то с сертификатом всё нормально. С pem-файлом сертификата тоже должно быть всё ок, т. к. он генерируется одной строчкой в терминале. С генерацией pem-файла ключа есть нюанс: после выполнения команды нужно ввести пароль, который вы задали при экспорте из связки ключей, а потом придумать пароль для самого pem-файла.

Потом проверьте, что есть связь с песочницей push-уведомлений командой:

telnet gateway.sandbox.push.apple.com 2195

В ответ должно вывести что-то типа:

Trying 17.172.232.46...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.

И теперь пробуем подключиться к песочнице с помощью команды:

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert Certificate.pem -key PrivateKey.pem

После выполнения команды нужно будет ввести пароль от pem-файла ключа, который мы задали выше.
Такой вопрос: если при старте приложения пользователь отказался от получения пуш уведомлений, можно ли потом из приложения вызвать настройки чтобы он включил их, в айос 7?
Нет, нельзя. Можно лишь проверить какие типы push-уведомлений может принимать приложение. Если пользователь запретил принимать уведомления для этого приложения (вернётся тип UIRemoteNotificationTypeNone), то можно вывести сообщение с просьбой включить принятие push-уведомлений. А пользователь уже сам должен открыть настройки уведомлений и включить их для приложения.
Расскажите, пожалуйста, кто-нибудь как работает трансляция push-уведомления через приложение Notifyr с iOS на OS X?
С Notifyr не знаком, но предполагаю, что после прихода push-уведомления на девайс формируется запрос на сервер центра уведомлений Мака (по аналогии с iOS). Запрос посылается с девайса (источник) и принимает утилита (приёмник), которая в ставится на Мак. В такой связке и работают. Как утилитка PushMeBaby только в обратном направлении :)
Токен будет нормально работать на всех этапах ( на устройстве, на сервере, в центре уведомлений), если он будет без пробелов?
То есть, не @«564f77d3 c1d06866 77a907d5 31d0450a 9cb552ec 5e2373e5 f2cc2c20 ff013232», а
@«564f77d3c1d0686677a907d531d0450a9cb552ec5e2373e5f2cc2c20ff013232»
Если на девелопменте все работало. Потом сделал все то же самое на продакшн. Закинул ключи на реальный хостинг, все отправляется. Но как сделать, чтобы не выгружая в Аппстор, можно протестировать уже продакшн пуши? Т.е. на самом устройстве? Если запускаю апп в икскоде на устройство, он же не как продакшн запускается. Соответственно, и пуши-продакшн не может принять. Как быть?
Через Ad hoc можно. Правда, запустилось с 10-ого раза. Почему-то — (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken не вызывался вначале. Потом, после передвижения даты на день-два, стал запускаться.
Only those users with full accounts are able to leave comments. Log in, please.