Статьи

Сборка iOS Poke App «Poke» с APNS — Часть 3

Это руководство является последним в серии из трех статей о работе с функциями push-уведомлений в iOS 3.0+. Основное внимание уделяется использованию некоторых более сложных функций службы push-уведомлений Apple (APNS). Этот выпуск основан на коде, который мы создали в первом и втором уроках, поэтому сначала обязательно прочитайте их, если вы этого еще не сделали.

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

Примечание. Подробное объяснение локализации и принципов ее работы в iOS см. В документации разработчика Apple . Я собираюсь предположить, что вы понимаете основы …

Посмотрите снова на консоль тестовых push-уведомлений Urban Airship:

Вы заметите, что при изменении содержимого верхних полей обновляется JSON в поле «Полезная нагрузка». Вы также можете вручную настроить JSON, что мы и собираемся сделать сейчас.

Вот оригинальный JSON, переформатированный для разборчивости:

1
2
3
4
5
6
{
    «aps»: {
        «alert»: «You have been poked by Tyler»
    },
    «device_tokens»: [«your device token goes here»]
}

Словарь «aps» является обязательной частью любой полезной нагрузки APNS JSON. Он сообщает iOS, что делать с уведомлением. В настоящее время ключ «alert» имеет строковое значение («Вас ткнули […]»), но APNS также допускает использование словарного значения для этого ключа. Вам нужно будет использовать словарь, если вы хотите поддерживать локализацию.

Для оповещений вы можете локализовать тело сообщения, а также имя кнопки действия, которое появляется в оповещении (по умолчанию «Просмотр»). Кроме того, вы можете отправить локализованное тело сообщения уже как часть полезной нагрузки сообщения или использовать предварительно локализованные строки в комплекте приложений. Мы собираемся сделать последнее.

Давайте обновим ключ «alert» в словаре «aps» в полезной нагрузке с помощью необходимых полей:

1
2
3
4
5
6
7
8
9
{
    «aps»: {
        «alert»: {
            «loc-key»: «PokeMessageFormat»,
            «loc-args»: [«Tyler»]
        }
    },
    «device_tokens»: [«your device token goes here»]
}

«loc-key» указывает имя строки в нашем файле Localizable.strings в нашем комплекте приложений. Любые спецификаторы формата в нашей строке формата (PokeMessageFormat) будут заменены строками в «loc-args». Так что теперь, вместо того, чтобы отображать «Ты ткнул Тайлера», iOS заберет локализованную строку PokeMessageFormat из нашего пакета, вставит Тайлера в соответствующее место и отобразит локализованное сообщение в предупреждении. Теперь нам просто нужно обновить наше приложение для поддержки локализации.

Откройте проект приложения в Xcode. Выбрав «Ресурсы» на панели «Группы и файлы» слева, выберите «Новый файл …» в меню «Файл». В разделе «Mac OS X: ресурс» выберите «Файл строк» ​​и нажмите «Далее».

Назовите файл Localizable.strings и нажмите «Готово».

Теперь, когда файл создан, нам нужно сделать его локализуемым. Выберите файл на панели «Группы и файлы» слева и нажмите «Информация» на панели инструментов (или Command-I). В самом низу вкладки «Общие» должна быть кнопка «Сделать файл локализуемым». Нажмите на это. Затем закройте информационное окно.

Хотя это может показаться волшебством voodoo, все, что эта кнопка делает, — это создает папку English.lproj в каталоге вашего проекта (при необходимости) и перемещает в нее файл Localizable.strings. Опять же, если вы хотите больше информации о «Почему?» читайте документацию Apple по интернационализации и локализации — я подожду …

Нет берущих? ОК, двигаясь дальше.

Теперь, когда наш файл строк создан, нам нужно добавить строку, на которую мы ссылались ранее — PokeMessageFormat:

Вы заметите, что наша строка выглядит примерно так же, как и исходное сообщение, но с указателем формата вместо имени. Теперь, когда придет новый толчок, iOS будет захватывать нашу локализованную строку, вставлять имя человека, который нас ткнет, и отображать предупреждение. Виола! 10 миллионов счастливых пользователей, вот так.

Хорошо, хорошо, небольшое упрощение. Вам все еще нужно добавить локализации для всех языков, которые вы хотите поддерживать, и перевести наше сообщение poke на эти языки. Но основы на месте — остальное я оставляю как упражнение для вас, читатель.

Еще один отличный способ уведомить своих пользователей о том, что в вашем приложении появилась новая информация, — через звук. Это может быть либо в дополнение, либо вместо предупреждения. Если вы планируете добавить звук в свои push-сообщения, Apple настоятельно рекомендует вам использовать фирменные звуки — звуки, которые можно легко определить как принадлежащие вашему приложению. Подумайте о звуках SMS или электронной почты по умолчанию — вы даже не знаете, что они значат и к каким приложениям относятся. Это именно то, что вы хотите, чтобы произошло с вашими звуками.

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

  • Линейный PCM
  • MA4
  • μLaw
  • закон

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

После добавления нашего надлежащим образом отформатированного аудиофайла в наш проект Xcode мы готовы снова обновить полезную нагрузку:

01
02
03
04
05
06
07
08
09
10
{
    «aps»: {
        «alert»: {
            «loc-key»: «PokeMessageFormat»,
            «loc-args»: [«Tyler»]
        },
        «sound»: «myAwesomeSound.caf»
    },
    «device_tokens»: [«your device token goes here»]
}

«звук» указывает имя нашего пользовательского звукового файла. Как отмечено в документации Apple:

Если звуковой файл не существует или в качестве значения указано значение по умолчанию, воспроизводится звуковой сигнал по умолчанию.

И с этими несколькими простыми изменениями у нас теперь есть звук!

Наша полезная нагрузка не ограничивается информацией, указанной Apple. Вне зарезервированного словаря «aps» мы можем добавить любой другой допустимый JSON в нашу полезную нагрузку, вплоть до 256-байтового максимума. Например, в нашем приложении Poke мы можем включить идентификатор отправленного пакета, чтобы мы могли отобразить дополнительную информацию о нем, если получатель решит нажать «Просмотр» и открыть приложение:

01
02
03
04
05
06
07
08
09
10
11
{
    «aps»: {
        «alert»: {
            «loc-key»: «PokeMessageFormat»,
            «loc-args»: [«Tyler»]
        },
        «sound»: «myAwesomeSound.caf»
    },
    «device_tokens»: [«your device token goes here»],
    «poke_id»: «1234567890»
}

Мы получаем «poke_id» как часть параметров запуска в нашем делегате приложения:

Напоминаем, что конфиденциальные данные пользователя никогда не должны отправляться как часть полезных данных push-уведомлений.

Наконец, есть одна особенность push-сервиса Urban Airship, которую я хотел бы показать: Quiet Time. Из документации для разработчиков :

Часто конечные пользователи не хотят получать push-уведомления в определенное время, например, когда они спят. Urban Airship поддерживает установку «тихого времени» через API регистрации устройства, в течение которого никакие push-уведомления для вашего приложения не будут доставляться на этот токен устройства. Push-уведомления, содержащие обновление значка, будут отправляться в тихое время, но оповещение и звук будут удалены.

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

Для этого все, что нам нужно, это обновить регистрационный вызов устройства нашего приложения с помощью Urban Airship. Вот в оригинальном виде:

Нам нужно передать время начала и окончания, а также часовой пояс для Urban Airship. Давайте рассмотрим их примерные значения 22:00 в качестве времени начала (т.е. 10:00 вечера) и 8:00 (AM) в качестве времени остановки. Мы получим идентификатор текущего часового пояса пользователя из системы.

И теперь наши пользователи не будут бодрствовать от бомбардировки 3 часа ночи.

Что ж, на этом мы заканчиваем использование возможностей push-уведомлений iOS 3.0+. Я надеюсь, что он дал вам хороший обзор того, как работает сервис, и основных шагов, необходимых для его использования в вашем приложении. Если у вас есть какие-либо вопросы или что-то застряло, дайте мне знать в комментариях.