# iOS SDK: Часто задаваемые вопросы

### Часто задаваемые вопросы по интеграции с iOS

#### В: Как установить Pushwoosh SDK в мой iOS-проект?
Вы можете интегрировать Pushwoosh SDK с помощью Swift Package Manager или CocoaPods.

#### В: Как установить Pushwoosh SDK с помощью Swift Package Manager?
В Xcode перейдите в раздел **Package Dependencies** и добавьте пакет, используя следующий URL: `https://github.com/Pushwoosh/Pushwoosh-XCFramework`.

#### В: Как установить Pushwoosh SDK с помощью CocoaPods?
Откройте `Podfile` вашего проекта и добавьте строку `pod 'PushwooshXCFramework'`. Затем выполните команду `pod install` в терминале.

#### В: Какие capabilities (возможности) мне нужно добавить в проект, чтобы включить push-уведомления?
В разделе Signing & Capabilities настроек вашего проекта необходимо добавить capabilities `Push Notifications` и `Background Modes`. При добавлении `Background Modes` убедитесь, что вы отметили флажок `Remote notifications`.

#### В: Какая дополнительная capability требуется для Time Sensitive Notifications (срочных уведомлений)?
Если вы планируете использовать Time Sensitive Notifications (iOS 15+), вам также необходимо добавить capability `Time Sensitive Notifications`.

#### В: Куда нужно добавить код инициализации Pushwoosh?
Код инициализации необходимо добавить в ваш класс `AppDelegate`.

#### В: Какой код инициализации следует добавить в AppDelegate для SwiftUI?
Пожалуйста, обратитесь к [примеру кода Swift для интеграции Pushwoosh в проект SwiftUI](/ru/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate).


#### В: Какой код инициализации следует добавить в стандартный AppDelegate на Swift?
Пожалуйста, обратитесь к [примеру кода Swift для интеграции Pushwoosh в стандартный проект Swift](/ru/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate).

#### В: Какой код инициализации следует добавить в AppDelegate на Objective-C?
Пожалуйста, обратитесь к [примеру кода Objective-C для интеграции Pushwoosh в проект Objective-C](/ru/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#appdelegate).

#### В: Какие ключи мне нужно добавить в файл Info.plist?
Вам необходимо добавить ключ `Pushwoosh_APPID` со значением вашего Application Code и ключ `PW_API_TOKEN` со значением вашего API Token в файл `Info.plist` вашего приложения.

#### В: Какова цель отслеживания доставки сообщений?
Pushwoosh поддерживает отслеживание событий доставки push-уведомлений с помощью Notification Service Extension.

#### В: Как добавить Notification Service Extension в мой проект?
В Xcode перейдите в **File** > **New** > **Target...**, выберите **Notification Service Extension** и нажмите **Next**. Введите имя таргета и нажмите **Finish**. Когда появится запрос на активацию, нажмите **Cancel**.

#### В: Как добавить Pushwoosh SDK в Notification Service Extension?
Добавьте [предоставленный фрагмент кода на Swift или Objective-C](/ru/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/basic-integration-guide/#add-pushwoosh-sdk-to-notification-service-extension) в основной файл `.swift` или `.m` вашего Notification Service Extension. Этот код использует `PWNotificationExtensionManager` для обработки запроса уведомления.

#### В: Какова цель App Groups?
Capability App Groups требуется для того, чтобы Notification Service Extension мог взаимодействовать с основным приложением.

#### В: Как включить App Groups для моего основного таргета и Notification Service Extension?
Для обоих таргетов перейдите в **Signing & Capabilities**, добавьте capability **App Groups** и создайте новую группу, нажав кнопку +. Убедитесь, что имя группы начинается с `group.` и используйте одно и то же имя группы для обоих таргетов.

#### В: Какие ключи мне нужно добавить в Info.plist моего основного таргета для App Groups?
В `Info.plist` вашего основного таргета добавьте ключ `PW_APP_GROUPS_NAME` и установите его значение равным имени вашей группы App Groups.

#### В: Какие ключи мне нужно добавить в Info.plist моего Notification Service Extension?
В `Info.plist` вашего Notification Service Extension добавьте ключ `PW_APP_GROUPS_NAME` (установив его в имя вашей группы App Groups) и ключ `Pushwoosh_APPID` (установив его в ваш Application Code).

#### В: Как проверить интеграцию с Pushwoosh?
После сборки и запуска вашего проекта перейдите в Pushwoosh Control Panel и отправьте push-уведомление в ваше приложение. Вы должны увидеть уведомление на своем устройстве.

#### В: Какие два основных колбэка для обработки push-уведомлений есть в Pushwoosh SDK?
Два основных колбэка — это `onMessageReceived` и `onMessageOpened`.

#### В: Когда вызывается колбэк `onMessageReceived`?
Метод `onMessageReceived` вызывается, когда приложение получает push-уведомление.

#### В: Когда вызывается колбэк `onMessageOpened`?
Метод `onMessageOpened` вызывается, когда пользователь взаимодействует с push-уведомлением и открывает его.

#### В: Как я могу получить доступ к полезной нагрузке (payload) полученного или открытого push-уведомления?
Доступ к полезной нагрузке объекта `PWMessage` (передаваемого в колбэки `onMessageReceived` и `onMessageOpened`) можно получить через его свойство `payload`.

#### В: Как я могу установить User ID в Pushwoosh?
Используйте метод `setUserId(_:)` объекта `Pushwoosh.sharedInstance()`, передав ID пользователя в качестве аргумента.

#### В: Как я могу установить адрес электронной почты пользователя в Pushwoosh?
Используйте метод `setEmail(_:)` объекта `Pushwoosh.sharedInstance()`, указав email пользователя.

#### Как я могу установить дополнительную информацию о пользователе в виде тегов в Pushwoosh?
Используйте метод `setTags(_:)` объекта `Pushwoosh.sharedInstance()`, передав словарь, где ключи — это имена тегов, а значения — соответствующие значения тегов.

#### Как я могу отследить событие пользователя с дополнительными атрибутами?**
Используйте метод `postEvent(_:withAttributes:)` объекта `PWInAppManager.shared()`, указав имя события (например, `"login"`) и словарь атрибутов (например, `"name"`, `"last_login"`).

#### В: Как я могу отследить событие покупки пользователя с деталями продукта?
Используйте метод `postEvent(_:withAttributes:)` объекта `PWInAppManager.shared()` с именем события `"purchase"` и словарем, содержащим детали продукта, такие как `"product_id"`, `"product_name"`, `"price"` и `"quantity"`.

#### В: Как настроить делегат для обработки отображения rich media?
В вашем view controller или другом подходящем классе реализуйте протокол `PWRichMediaPresentingDelegate` и установите свойство `delegate` объекта `PWRichMediaManager.shared()` равным вашему экземпляру, реализующему протокол.

#### В: Как я могу настроить стиль отображения rich media?
Используйте объект `PWModalWindowConfiguration.shared()` для настройки таких свойств, как положение модального окна и анимации появления/скрытия, с помощью метода `configureModalWindow(with:present:dismiss:)`.

#### В: К какой информации я могу получить доступ в методах делегата rich media?**
Методы делегата предоставляют доступ к объекту `PWRichMedia`, который содержит информацию о контенте rich media, включая его `pushPayload`. Метод `presentingDidFailForRichMedia:withError:` также предоставляет объект `Error`, описывающий ошибку.


### Устранение неполадок

<Aside type="caution">
В целях балансировки нагрузки нам может потребоваться изменить конечные точки API в вашем приложении. Это происходит автоматически и обрабатывается нашим SDK. **Пожалуйста, убедитесь, что ничто в вашем приложении не блокирует доступ к любому URL, содержащему \*.pushwoosh.com.**
</Aside>

<Aside type="note">
#### Если вы находитесь за файрволом или ваш Wi-Fi роутер работает как файрвол

Если ваше устройство подключено к Интернету через Wi-Fi, и сообщения не доходят до устройства, пожалуйста, **убедитесь, что порты APNs не заблокированы вашим файрволом.**\
Провайдеры push-уведомлений, устройства iOS и компьютеры Mac часто находятся за файрволами. Для отправки уведомлений вам потребуется разрешить входящие и исходящие TCP-пакеты через порт 2195. Устройствам и компьютерам, подключающимся к сервису push-уведомлений через **Wi-Fi, потребуется разрешить входящие и исходящие TCP-пакеты через порт 5223.**\
Диапазон IP-адресов для сервиса push-уведомлений может меняться; ожидается, что провайдеры будут подключаться по имени хоста, а не по IP-адресу. Сервис push-уведомлений использует схему балансировки нагрузки, которая выдает разные IP-адреса для одного и того же имени хоста. Однако весь блок адресов 17.0.0.0/8 назначен Apple, поэтому вы можете указать этот диапазон в правилах вашего файрвола.
</Aside>

#### В: Ошибка "Your provisioning profile does not have APS entry"

Если вы видите сообщение об ошибке "Your provisioning profile does not have APS entry.", убедитесь, что ваш provisioning profile совместим с push-уведомлениями и содержит строку `aps-environment` со значением `production` или `development`. Самый простой способ проверить это — открыть mobile provisioning profile в любом текстовом редакторе и найти строку `aps-environment`. Она должна там быть.

Если она есть, а вы продолжаете получать ошибку, это означает, что Xcode все еще выбирает "несовместимый с push-уведомлениями" профиль. Пожалуйста, убедитесь, что вы подписываете приложение правильным профилем — иногда, если у вас есть два профиля для одного и того же App ID, Xcode путается и подписывает старым.

Рекомендуемые шаги:

1. [Удалите](https://stackoverflow.com/questions/18923095/delete-provisioning-profile-from-xcode-5) все профили из Xcode;
2. Добавьте один-единственный новый профиль;
3. Пересоберите приложение.

#### В: Как выглядят push-токен и HWID для iOS?

Push-токены устройств iOS представляют собой строки из 64 шестнадцатеричных символов. Пример push-токена:\
`03df25c845d460bcdad7802d2vf6fc1dfde97283bf75cc993eb6dca835ea2e2f`\
Убедитесь, что push-токены iOS, которые вы используете при таргетинге на конкретные устройства в ваших запросах к API, указаны в **нижнем регистре**.

Pushwoosh использует IDFV в качестве HWID устройства. Обратите внимание, что он может измениться, если пользователь переустановит все приложения от одного и того же поставщика.

`CBAF8ED1-17FB-49A3-73BD-DC79B63AEF93`

#### В: Как включать и выключать баннер, когда мое приложение запущено?

По умолчанию наш последний iOS SDK отображает баннер уведомления, когда приложение работает в активном режиме (на переднем плане).\
Вы можете управлять этим поведением, изменяя следующие флаги в Info.plist:

Флаг `Pushwoosh_ALERT_TYPE` – тип string, значения:

* `BANNER` – значение по умолчанию, отображает баннер-уведомление в приложении
* `ALERT` – стандартное уведомление (alert)
* `NONE` – не показывать уведомления, когда приложение находится в активном режиме

#### В: Как получить push-токен моего iOS-устройства для использования в разделе Test Devices?

Чтобы получить push-токен вашего iOS-устройства,

1. Откройте Xcode => Devices & Simulators;
2. Подключите тестовое устройство к вашему компьютеру;
3. Выберите ваше подключенное устройство в списке слева;
4. Нажмите кнопку Open Console.

<img src="/ios-push-notifications-ios-faq-1.webp" alt=""/>

Запустите приложение, для которого вам нужен push-токен, и найдите ваш 64-символьный шестнадцатеричный push-токен в строке “Registered for push notifications”:

<img src="/ios-push-notifications-ios-faq-2.webp" alt=""/>

#### В: Почему значки (badges) не сбрасываются после удаления и быстрой переустановки приложения?

Это ожидаемое поведение — значки обрабатываются самой iOS, и их значения хранятся в настройках приложения, которые не удаляются мгновенно при удалении приложения. Значение значка сохраняется там некоторое время на случай немедленной переустановки, что приводит к отображению тех же значков после повторной установки приложения.