# Расширенное руководство по интеграции iOS SDK 7.0+

import { Badge } from '@astrojs/starlight/components';

В этом разделе представлена информация о расширенной интеграции Pushwoosh iOS SDK.

## Фоновые режимы

<Aside type="caution" title="">
По умолчанию iOS не позволяет приложениям обрабатывать push-уведомления, когда они находятся в фоновом режиме. Это относится и к тихим push-уведомлениям, которые полезны для обновления данных приложения без взаимодействия с пользователем.
</Aside>

Чтобы включить эту функциональность, необходимо добавить фоновые режимы (Background Modes) в ваш проект.


#### Шаги по включению фоновых режимов

1. Откройте ваш проект в **Xcode** и выберите его в **Project Navigator**.
2. Выберите цель вашего приложения (app target) на левой панели.
3. Перейдите на вкладку **Signing & Capabilities**.
4. Нажмите кнопку **+ Capability** в левом верхнем углу.
5. Найдите и выберите **Background Modes** в списке.
6. В разделе **Background Modes** включите **Remote notifications**, установив соответствующий флажок.

После выполнения этих действий ваше приложение сможет обрабатывать push-уведомления, включая тихие, во время работы в фоновом режиме.

## Режимы переднего плана

По умолчанию Pushwoosh iOS SDK отображает баннер уведомления, когда приложение работает в активном режиме (на переднем плане).

Вы можете управлять этим поведением, установив следующий логический флаг в вашем коде (например, в вашем `AppDelegate`):

<Tabs syncKey="code-example">
    <TabItem label="Swift">
    ```swift
    // Установите false, чтобы отключить уведомления на переднем плане, true - чтобы включить
    Pushwoosh.configure.showPushnotificationAlert = true
    ```

    <LinkCard
        title="Пример (Swift)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/ViewController.swift#L30"
    />

  </TabItem>

  <TabItem label="Objective-C">

  ```objective-c
  // Установите 0, чтобы отключить уведомления на переднем плане, 1 - чтобы включить
  [[Pushwoosh configure] setShowPushnotificationAlert:0];
  ```

    <LinkCard
        title="Пример (Objective-C)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/ViewController.m#L35"
    />

  </TabItem>
</Tabs>

## Уровень логирования

Pushwoosh iOS SDK поддерживает следующие уровни логирования:

- `NONE` - Логи от SDK не ведутся.
- `ERROR` - Отображает в консоли только сообщения об ошибках.
- `WARNING` - Отображает предупреждения в дополнение к ошибкам.
- `INFO` - Включает информационные сообщения (настройка по умолчанию).
- `DEBUG` - Включает подробную отладочную информацию.

По умолчанию уровень логирования установлен на INFO, что гарантирует предоставление SDK релевантной информации без загромождения консоли разработчика.

Чтобы изменить уровень логирования, обновите ключ `Pushwoosh_LOG_LEVEL` в файле `Info.plist` вашего приложения:

```xml
<key>Pushwoosh_LOG_LEVEL</key>
<string>YOUR_LOG_LEVEL</string>
```

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

```swift
Pushwoosh.Debug.setLogLevel(.PW_LL_DEBUG)
```

Замените `YOUR_LOG_LEVEL` на желаемый уровень (например, `DEBUG` или `ERROR`).

## Пользовательский `UNNotificationCenterDelegate`

Если вы хотите использовать собственный `UNNotificationCenterDelegate` (например, для локальных уведомлений), вам следует сообщить об этом Pushwoosh SDK для корректной работы. Вы можете сделать это с помощью метода `addNotificationCenterDelegate`:

<Tabs syncKey="code-example">
    <TabItem label="Swift">
    ```swift
    Pushwoosh.configure.addNotificationCenterDelegate(my_delegate)
    ```

    <LinkCard
        title="Пример (Swift)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Custom%20UNNotificationCenterDelegate/CustomNotificationCDViewConrtoller.swift#L23"
    />

    </TabItem>

    <TabItem label="Objective-C">
    ```objective-c
    [Pushwoosh.configure addNotificationCenterDelegate:my_delegate];
    ```

    <LinkCard
        title="Пример (Objective-C)"
        href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Custom%20UNNotificationCenterDelegate/PWCustomNotificationCDViewConrtoller.m#L28"
    />

    </TabItem>
</Tabs>

Затем реализуйте методы `UNNotificationCenterDelegate` в вашем делегате:

<Tabs syncKey="code-example">
  <TabItem label="Swift">

  ```swift
  func userNotificationCenter(
      _ center: UNUserNotificationCenter,
      willPresent notification: UNNotification,
      withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void
  ) {
      if (!PWMessage.isPushwooshMessage(notification.request.content.userInfo)) {
          // Обработайте ваше уведомление
          completionHandler(UNNotificationPresentationOptions.alert)
      }
  }

  func userNotificationCenter(
      _ center: UNUserNotificationCenter,
      didReceive response: UNNotificationResponse,
      withCompletionHandler completionHandler: @escaping () -> Void
  ) {
      if (!PWMessage.isPushwooshMessage(response.notification.request.content.userInfo)) {
          // Обработайте ваше уведомление
          completionHandler()
      }
  }
  ```

  <LinkCard title="Пример (Swift)" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Custom%20UNNotificationCenterDelegate/CustomNotificationCDViewConrtoller.swift" />

  </TabItem>

  <TabItem label="Objective-C">

  ```objective-c
  - (void)userNotificationCenter:(UNUserNotificationCenter *)center
          willPresentNotification:(UNNotification *)notification
          withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
      if (![PWMessage isPushwooshMessage:notification.request.content.userInfo]) {
          // Обработайте ваше сообщение
          completionHandler(UNNotificationPresentationOptionAlert);
      }
  }

  - (void)userNotificationCenter:(UNUserNotificationCenter *)center
          didReceiveNotificationResponse:(UNNotificationResponse *)response
          withCompletionHandler:(void (^)(void))completionHandler {
      if (![PWMessage.isPushwooshMessage:response.notification.request.content.userInfo]) {
          // Обработайте ваше сообщение
          completionHandler();
      }
  }
  ```

  <LinkCard title="Пример (Objective-C)" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Custom%20UNNotificationCenterDelegate/PWCustomNotificationCDViewConrtoller.m" />

  </TabItem>
</Tabs>

## Отложенная инициализация Pushwoosh

Флаг `Pushwoosh_LAZY_INITIALIZATION` предотвращает автоматическую инициализацию Pushwoosh SDK при запуске приложения. Это позволяет лучше контролировать, когда запускаются сервисы Pushwoosh SDK.

Когда этот флаг включен, Pushwoosh SDK не запускает свои сервисы до тех пор, пока не будут явно вызваны методы Pushwoosh iOS SDK.

Добавьте следующую запись в Info.plist:

```xml
<key>Pushwoosh_LAZY_INITIALIZATION</key>
<true/>
```

**Сценарии использования**
1. **Контролируемая инициализация SDK** – Флаг `Pushwoosh_LAZY_INITIALIZATION` позволяет отложить запуск Pushwoosh SDK, предоставляя больше контроля над тем, когда активируются push-сервисы.

2. **Отложенная активация push-уведомлений** – В некоторых приложениях push-уведомления должны инициализироваться только при определенных условиях. Включение этого флага гарантирует, что Pushwoosh SDK запустится только по явному запросу.

3. **Конфигурация push-уведомлений для конкретного пользователя** – Некоторые приложения могут требовать настройки параметров push-уведомлений в зависимости от предпочтений пользователя или настроек учетной записи. При отложенной инициализации Pushwoosh SDK запускается только после определения соответствующей конфигурации.
## Полный список свойств Info.plist

| Свойство                                      | Описание                                                                  | Возможные значения                                                                                  |
|-----------------------------------------------|------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|
| `Pushwoosh_APPID`                             | Устанавливает ID приложения Pushwoosh для производственной сборки.                     | `XXXXX-XXXXX` <br /> **Тип**: String                                                             |
| `Pushwoosh_APPID_Dev`                         | Устанавливает ID приложения Pushwoosh для сборки для разработки.                    | `XXXXX-XXXXX` <br /> **Тип**: String                                                             |
| `Pushwoosh_SHOW_ALERT`                        | Показывает уведомление на переднем плане.                                        | `YES` *(по умолчанию)* / `NO` <br /> **Тип**: Boolean                                                 |
| `Pushwoosh_ALERT_TYPE`                        | Устанавливает стиль оповещения.                                          | `BANNER` *(по умолчанию)* / `ALERT` / `NONE` <br /> **Тип**: String                                   |
| `Pushwoosh_BASEURL`                           | Переопределяет базовый URL сервера Pushwoosh.                                    | [`https://cp.pushwoosh.com/json/1.3/`](https://cp.pushwoosh.com/json/1.3/) *(по умолчанию)* <br /> **Тип**: String |
| `Pushwoosh_AUTO_ACCEPT_DEEP_LINK_FOR_SILENT_PUSH` | Если `YES`, Deep Links, полученные в тихих push-уведомлениях, будут обрабатываться автоматически. | `YES` *(по умолчанию)* / `NO` <br /> **Тип**: Boolean                                                 |
| `Pushwoosh_ALLOW_SERVER_COMMUNICATION`        | Разрешает SDK отправлять сетевые запросы на серверы Pushwoosh.               | `YES` *(по умолчанию)* / `NO` <br /> **Тип**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_DATA`      | Разрешает SDK собирать и отправлять данные об устройстве (версия ОС, локаль и модель) на сервер. | `YES` *(по умолчанию)* / `NO` <br /> **Тип**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_OS_VERSION` | Разрешает SDK собирать и отправлять версию ОС устройства на сервер.   | `YES` *(по умолчанию)* / `NO` <br /> **Тип**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_LOCALE`    | Разрешает SDK собирать и отправлять локаль устройства на сервер.         | `YES` *(по умолчанию)* / `NO` <br /> **Тип**: Boolean                                                 |
| `Pushwoosh_ALLOW_COLLECTING_DEVICE_MODEL`     | Разрешает SDK собирать и отправлять модель устройства на сервер.          | `YES` *(по умолчанию)* / `NO` <br /> **Тип**: Boolean                                                 |
| `Pushwoosh_LOG_LEVEL`                         | Уровень логирования Pushwoosh SDK. Подробнее см. в разделе [Уровень логирования](#уровень-логирования). | `NONE` / `ERROR` / `WARNING` / `INFO` *(по умолчанию)* / `DEBUG` / `VERBOSE` <br /> **Тип**: String    |
| `Pushwoosh_PURCHASE_TRACKING_ENABLED`         | Разрешает SDK отслеживать встроенные покупки. Необходимо для Customer Journey Builder. | `YES` / `NO` *(по умолчанию)* <br /> **Тип**: Boolean                                                 |