# Кастомизация iOS SDK

## Интеграция

* [Глубокие ссылки (Deep linking)](#deep-linking)
* [Универсальные ссылки (Universal Links)](#universal-links)
* [Отслеживание встроенных покупок](#in-app-purchase-tracking)
* [Push-уведомления на основе геозон](#geozones-push-notifications)
* [Создание очереди Rich Media](#creating-a-rich-media-queue)
* [Автовоспроизведение видео из Rich Notification по force touch](#autoplay-a-video-sent-in-a-rich-notification-with-force-touch)
* [Пользовательский звук push-уведомления](#custom-push-sound)
* [iOS Provisional Push](#ios-provisional-push)


### Глубокие ссылки (Deep linking)

В вашем файле **Info.plist** добавьте массив `URL types` с `URL Identifier` и `URL Scheme`.\
В примере ниже `URL Scheme` — это _com.pushwoosh_, а `URL Identifier` — _promotion_.

<img src="/ios-push-notifications-customizing-ios-sdk-3.webp" alt=""/>

В файле делегата вашего приложения (обычно AppDelegate.m для iOS 12 и ниже, или SceneDelegate.m для iOS 13 и выше) добавьте соответствующую функцию-делегат openURL, как показано в примере ниже. Пример проверяет корректность страницы, извлекает значение "id" из URL и в ответ открывает PromoPageViewController.

```AppDelegate.swift```
<Tabs>
<TabItem label="Swift">
```swift
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let page = components?.host
    var promotionId: String?

    if page == "promotion" {
        return
    }

    let items = components?.queryItems ?? []

    for item in items {
        if item.name == "id" {
            promotionId = item.value
        }
    }

    //show PromoPageViewController
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *page = components.host;
    NSString *promotionId = nil;

    //return if this is not a promotion deep link
    if(![page isEqualToString:@"promotion"])
        return NO;

    for(NSURLQueryItem *item in components.queryItems)
    {
        if([item.name isEqualToString:@"id"])
            promotionId = item.value;
    }

    PromoPageViewController *vc = [[PromoPageViewController alloc] init];
    vc.promotionId = promotionId
    [self presentViewController:vc animated:YES completion:nil];
}
```
</TabItem>
</Tabs>

```SceneDelegate.swift```
<Tabs>
<TabItem label="Swift">
```swift
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    guard let urlContext = URLContexts.first else { return }
        
    let components = URLComponents(url: urlContext.url, resolvingAgainstBaseURL: false)
    let page = components?.host
    var promotionId: String?
        
    guard page == "promotion" else {
        return
    }
        
    let items = components?.queryItems ?? []
        
    for item in items {
        if item.name == "id" {
            promotionId = item.value
        }
    }
        
    //show PromoPageViewController
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)scene:(UIWindowScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
    UIOpenURLContext *urlContext = URLContexts.anyObject;
    if (!urlContext) {
        return;
    }

    NSURLComponents *components = [NSURLComponents componentsWithURL:urlContext.URL resolvingAgainstBaseURL:NO];
    NSString *page = components.host;
    NSString *promotionId = nil;

    if (![page isEqualToString:@"promotion"]) {
        return;
    }

    for (NSURLQueryItem *item in components.queryItems) {
        if ([item.name isEqualToString:@"id"]) {
            promotionId = item.value;
        }
    }

    //show PromoPageViewController
}
```

</TabItem>
</Tabs>

### Универсальные ссылки (Universal Links)

Универсальные ссылки (Universal Links) позволяют пользователям открывать ваше приложение напрямую, когда они нажимают на ссылку на ваш сайт. В отличие от пользовательских URL-схем, универсальные ссылки используют стандартные URL-адреса `https://` и обеспечивают более плавный пользовательский опыт.

<Aside type="note">
Начиная с **версии SDK 7.0.15**, Pushwoosh iOS SDK автоматически направляет универсальные ссылки из push-уведомлений в обработчики вашего приложения, а не открывает их в Safari.
</Aside>

#### Как это работает

Когда push-уведомление содержит URL-адрес `https://` (в параметре "url" или "l"), SDK будет:

1. Создавать `NSUserActivity` с URL-адресом
2. Вызывать обработчик универсальных ссылок вашего приложения (`scene:continueUserActivity:` или `application:continueUserActivity:restorationHandler:`)
3. Если ваше приложение не обрабатывает URL, он будет открыт в Safari в качестве запасного варианта

#### Настройка

1. **Настройте Associated Domains в Xcode**

Добавьте возможность Associated Domains в ваше приложение и укажите ваш домен:

```
applinks:yourdomain.com
```

2. **Разместите файл Apple App Site Association**

Создайте файл `apple-app-site-association` на вашем веб-сервере по адресу `https://yourdomain.com/.well-known/apple-app-site-association`:

```json
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appID": "TEAM_ID.com.your.bundleid",
        "paths": ["/path/*", "/promotion/*"]
      }
    ]
  }
}
```

Замените `TEAM_ID` на ваш Apple Developer Team ID и `com.your.bundleid` на идентификатор вашего приложения.

3. **Реализуйте обработчик универсальных ссылок**

```SceneDelegate.swift``` (iOS 13+)
<Tabs>
<TabItem label="Swift">
```swift
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
        return
    }

    // Обработка URL универсальной ссылки
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let path = components?.path

    if path?.starts(with: "/promotion") == true {
        // Переход на экран акции
        let promotionId = components?.queryItems?.first(where: { $0.name == "id" })?.value
        // Показать акцию с promotionId
    }
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        return;
    }

    NSURL *url = userActivity.webpageURL;
    if (!url) {
        return;
    }

    // Обработка URL универсальной ссылки
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *path = components.path;

    if ([path hasPrefix:@"/promotion"]) {
        // Переход на экран акции
        NSString *promotionId = nil;
        for (NSURLQueryItem *item in components.queryItems) {
            if ([item.name isEqualToString:@"id"]) {
                promotionId = item.value;
                break;
            }
        }
        // Показать акцию с promotionId
    }
}
```
</TabItem>
</Tabs>

```AppDelegate.swift``` (iOS 12 и ранее, или в качестве запасного варианта)
<Tabs>
<TabItem label="Swift">
```swift
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
          let url = userActivity.webpageURL else {
        return false
    }

    // Обработка URL универсальной ссылки
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let path = components?.path

    if path?.starts(with: "/promotion") == true {
        // Переход на экран акции
        return true
    }

    return false
}
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (BOOL)application:(UIApplication *)application
        continueUserActivity:(NSUserActivity *)userActivity
          restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> *restorableObjects))restorationHandler {

    if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
        return NO;
    }

    NSURL *url = userActivity.webpageURL;
    if (!url) {
        return NO;
    }

    // Обработка URL универсальной ссылки
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *path = components.path;

    if ([path hasPrefix:@"/promotion"]) {
        // Переход на экран акции
        return YES;
    }

    return NO;
}
```
</TabItem>
</Tabs>

#### Отправка push-уведомления с универсальной ссылкой

При создании push-уведомления используйте URL вашего сайта в поле **Action**:

```
https://yourdomain.com/promotion?id=123
```

SDK автоматически направит этот URL в ваш обработчик универсальных ссылок, что позволит вам перенаправить пользователя на соответствующий экран в вашем приложении.

<Aside type="tip">
Универсальные ссылки обеспечивают лучший пользовательский опыт, чем пользовательские URL-схемы, потому что они работают, даже если ваше приложение не установлено — пользователь будет перенаправлен на ваш сайт.
</Aside>

### Отслеживание встроенных покупок

По умолчанию отслеживание встроенных покупок отключено. Если вы хотите отслеживать встроенные покупки при настройке [Customer Journeys](/ru/product/customer-journey/pushwoosh-journey-overview), установите флаг _Pushwoosh\_PURCHASE\_TRACKING\_ENABLED_ в значение _true_ в файле _info.plist_. Список доступных флагов вы можете найти в [таблице](/ru/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/advanced-integration-guide/#complete-list-of-infoplist-properties).

Если вы хотите отслеживать встроенные покупки вручную, вы можете использовать код ниже.

В методе-делегате `paymentQueue:updatedTransactions:` вызовите метод `sendSKPaymentTransactions` из `PushManager`

<Tabs>
<TabItem label="Swift">
```swift
 func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
     // Код Pushwoosh для отслеживания встроенных покупок
     Pushwoosh.sharedInstance().sendSKPaymentTransactions(transactions)
     // остальной код, обработка транзакций и т.д.
 }
```
</TabItem>

<TabItem label="Objective-C">
```objective-c
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

  [[PushNotificationManager pushManager] sendSKPaymentTransactions:transactions];

  //остальной код, обработка транзакций и т.д.
}
```
</TabItem>
</Tabs>

<img src="/ios-push-notifications-customizing-ios-sdk-4.webp" alt="InAppTrackingViewController.swift"/>

<LinkCard title="Пример" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/In-Apps%20Tracking/InAppTrackingViewController.swift" />

### Push-уведомления на основе геозон

Push-уведомления на основе геозон инкапсулированы в отдельный фреймворк **PushwooshGeozones**.

1. Добавьте PushwooshGeozones.framework в ваш проект

Чтобы добавить PushwooshGeozones.framework в ваш проект с помощью менеджера зависимостей, добавьте следующие строки в ваш `podfile` или `cartfile`:

<Tabs>
  <TabItem value="podfile" label="Podfile">

  ```plaintext
  pod 'PushwooshXCFramework/Geozones'
  ```

  </TabItem>
  
  <TabItem value="carfile" label="Carfile">

  ```plaintext
  github "Pushwoosh/pushwoosh-ios-sdk"
  ```

  </TabItem>
  
  <TabItem value="swiftpm" label="SwiftPM">
  
  Если вы хотите использовать **PushwooshGeozones.xcframework**, введите следующий URL пакета:  
  [PushwooshGeozones-XCFramework](https://github.com/Pushwoosh/PushwooshGeozones-XCFramework)  

  </TabItem>
</Tabs>


В качестве альтернативы, вы можете просто перетащить фреймворк в **Link Binaries With Libraries** в **Build Phases** вашего проекта.


2. Добавьте следующие ключи в ваш Info.plist:

- **NSLocationWhenInUseUsageDescription** – *(обязательно)*, чтобы приложение отслеживало геозоны только во время работы на переднем плане.  
- **NSLocationAlwaysAndWhenInUseUsageDescription** – *(обязательно)*, чтобы приложение отслеживало геозоны **как на переднем, так и на заднем плане** и показывало диалоговое окно с запросом разрешения.  
- **NSLocationAlwaysUsageDescription** – *(необязательно)*, чтобы приложение отслеживало геозоны **постоянно**; следует использовать, если ваше приложение нацелено на iOS 10 и более ранние версии.  

```xml
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>for app to track Geozones in both conditions and to show a permission request dialog</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>for app to track Geozones only while running in the foreground</string>
```
![]() 

<LinkCard title="Пример Info.plist для Pushwoosh" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Info.plist" />

3. Импортируйте фреймворк

<Tabs>
  <TabItem value="swift" label="Swift">

  ```swift
  import PushwooshGeozones
  ```

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C">

  ```objc
  #import <PushwooshGeozones/PWGeozonesManager.h>
  ```

  </TabItem>
</Tabs>

4. Запустите отслеживание геозон

<Tabs>
  <TabItem value="swift" label="Swift">

  ```swift
  PWGeozonesManager.shared()?.startLocationTracking()
  ```

  [Ссылка на GitHub](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizing/Geozones%20Push%20Notification/GeozonesViewController.swift)

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C">

  ```objc
  [[PWGeozonesManager sharedManager] startLocationTracking];
  ```

  [Ссылка на GitHub](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Geozones%20Push%20Notification/PWGeozonesViewController.m)

  </TabItem>
</Tabs>

##### Пример 
<Tabs>
  <TabItem value="swift" label="Swift Example">

  ```swift
  override func viewDidLoad() {
      super.viewDidLoad()

      // Запустите отслеживание геозон, когда это необходимо
      PWGeozonesManager.shared().startLocationTracking()
  }
  ```

  </TabItem>
  
  <TabItem value="objective-c" label="Objective-C Example">

  ```objc
  - (void)viewDidLoad {
      [super viewDidLoad];
      // Do any additional setup after loading the view.

      // Запустите отслеживание геозон, когда это необходимо
      [[PWGeozonesManager sharedManager] startLocationTracking];
  }
  ```

  </TabItem>
</Tabs>


### Создание очереди Rich Media

В случае, когда необходимо одновременно отобразить несколько страниц Rich Media (например, события-триггеры для двух или более In-App'ов происходят в один момент, или страница Rich Media уже отображается в момент возникновения другого события-триггера), вы можете настроить очередь для отображения страниц Rich Media. Чтобы создать очередь, выполните следующие шаги.

1. Создайте класс, реализующий PWRichMediaPresentingDelegate:

```objective-c
@interface ChainedRichMediaPresentingDelegate () <PWRichMediaPresentingDelegate>

@property (nonatomic) NSMutableArray *queue;

@property (nonatomic) BOOL inAppIsPresenting;

@end


@implementation ChainedRichMediaPresentingDelegate

- (instancetype)init {
    self = [super init];

    if (self) {
        _queue = [NSMutableArray new];
    }

    return self;
}

- (BOOL)richMediaManager:(PWRichMediaManager *)richMediaManager shouldPresentRichMedia:(PWRichMedia *)richMedia {
    [_queue addObject:richMedia];
    return !_inAppIsPresenting;
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didPresentRichMedia:(PWRichMedia *)richMedia {
    _inAppIsPresenting = YES;
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager didCloseRichMedia:(PWRichMedia *)richMedia {
    _inAppIsPresenting = NO;

    [_queue removeObject:richMedia];

    if (_queue.count) {
        [[PWRichMediaManager sharedManager] presentRichMedia:_queue.firstObject];
    }
}

- (void)richMediaManager:(PWRichMediaManager *)richMediaManager presentingDidFailForRichMedia:(PWRichMedia *)richMedia withError:(NSError *)error {
    [self richMediaManager:richMediaManager didCloseRichMedia:richMedia];
}

@end
```

2\. Установите делегат:

```objective-c
 [PWRichMediaManager sharedManager].delegate = [ChainedRichMediaPresentingDelegate new];
```

<Tabs>
<TabItem label="Swift (GitHub)">
<LinkCard title="Пример" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customizing/customizing/Rich%20Media%20Queue" />
</TabItem>

<TabItem label="Objective-C (GitHub)">
<LinkCard title="Пример" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/tree/main/customizing/customizingObjC/customizingObjC/Rich%20Media%20Queue" />
</TabItem>
</Tabs>

### Автовоспроизведение видео из Rich Notification по force touch

Чтобы видео, отправленное как [вложение Rich Notification](/ru/developer/pushwoosh-sdk/ios-sdk/ios-rich-notifications-integration/), автоматически воспроизводилось при раскрытии уведомления без какого-либо взаимодействия с пользователем, выполните следующие шаги:

1. Добавьте Notification Content Extension в ваш проект:

* В Xcode выберите File > New > Target.
* Выберите Notification Content Extension.
* Присвойте ему имя и завершите настройку.

<img src="/ios-push-notifications-customizing-ios-sdk-5.webp" alt="Notification Content Extension - iOS Rich Push Notification"/>

Если появится сообщение "Activate scheme", выберите Cancel.

<img
  src="/ios-push-notifications-customizing-ios-sdk-6.webp"
  alt="Активировать схему Notification Content"
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

2. Настройте свойства и методы в Content Extension следующим образом:

```
import UIKit
import UserNotifications
import UserNotificationsUI
import AVKit


class NotificationViewController: UIViewController, UNNotificationContentExtension {
    var playerController: AVPlayerViewController!
    @IBOutlet weak var playerBackgroundView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Выполните здесь любую необходимую инициализацию интерфейса.
    }

    func didReceive(_ notification: UNNotification) {
        let attachment = notification.request.content.attachments.first

        playerController = AVPlayerViewController()
        // Установите высоту программно
        // preferredContentSize.height = 250

        if let url = attachment?.url {
            setupVideoPlayer(url: url)
        } else {
            print("No valid URL...")
        }
    }

    private func setupVideoPlayer(url: URL) {
        guard let playerController = self.playerController else { return }
        let player = AVPlayer(url: url)
        playerController.player = player
        playerController.view.frame = self.playerBackgroundView.bounds
        playerBackgroundView.addSubview(playerController.view)
        addChild(playerController)
        playerController.didMove(toParent: self)
        player.play()
    }
```

3. Включите UIView в MainInterface.storyboard:

<img src="/ios-push-notifications-customizing-ios-sdk-7.webp" alt="UIView в MainInterface.storyboard"/>

4. Свяжите IBOutlet playerBackgroundView с только что добавленным UIView:

<img src="/ios-push-notifications-customizing-ios-sdk-8.webp" alt="Связывание IBOutlet playerBackgroundView с UIView"/>

5. Обновите файл info.plist, добавив следующую запись:

```
UNNotificationExtensionUserInteractionEnabled = true
```

<img src="/ios-push-notifications-customizing-ios-sdk-9.webp" alt="UNNotificationExtensionUserInteractionEnabled = true"/>

Чтобы прикрепить видео к вашему уведомлению, введите URL видео в поле Media Attachment в Control Panel:

<img src="/ios-push-notifications-customizing-ios-sdk-10.webp" alt="URL видео в поле Media Attachment в Pushwoosh Control Panel"/>

При отправке уведомления через API-запрос [/createMessage](/ru/developer/api-reference/messages-api#createmessage) включите URL в параметр "ios\_attachment" и убедитесь, что флаг "mutable-content" установлен в `1`.

<Aside type="note">
Чтобы протестировать функцию автовоспроизведения, вы можете использовать следующее примерное видео: [Hello World Sample Video](https://docs-assets.developer.apple.com/published/efa8e7a0a97cfab20bf0f4c307b9b121/Hello-World-overview.mp4).
</Aside>

<video src="/ios-push-notifications-customizing-ios-sdk-11.webm" title="Пример видео Hello World" autoplay loop muted playsinline />

### Пользовательский звук push-уведомления

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

<img
  src="/ios-push-notifications-customizing-ios-sdk-12.webp"
  alt=""
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

Затем укажите имя звукового файла в параметрах push-уведомления – заполните поле Sound в [настройках для iOS](/ru/product/messaging-channels/push-notifications/send-push-notifications/one-time-push#ios) вашего сообщения или укажите имя файла в качестве значения для параметра "ios\_sound" в [API-запросе createMessage](/ru/developer/api-reference/messages-api/).

Аудиофайл для пользовательского звука в iOS должен быть в одном из следующих форматов: **.aif**, **.caf**, **.wav**. **Обязательно укажите формат в имени файла; в противном случае он будет проигнорирован Pushwoosh iOS SDK.**

<Aside type="tip">
При добавлении звукового файла в ваш бандл учитывайте ограничения App Store на размер бандла.
</Aside>


### iOS Provisional Push

<Aside>
Поддерживается на iOS 12 и более поздних версиях.
</Aside>

#### Как это работает

Provisional push notifications появляются беззвучно в Центре уведомлений пользователя, но не на экране блокировки. Этот тип push-уведомлений не требует явного разрешения от пользователя: вы можете начать отправлять их, как только пользователь установит и запустит ваше приложение.

Однако пользователи все еще могут подписаться на ваши обычные push-уведомления: при открытии Provisional Push у них есть два варианта выбора — оставить push-уведомления в Центре уведомлений без оповещений и звуков или разрешить вам отправлять push-уведомления в обычном режиме, чтобы они появлялись на экране блокировки.

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

<Aside type="caution" title="Важно">
Обратите внимание, что при реализации Provisional Pushes заменяют нативный запрос APN, что означает, что пользователи не могут подписаться на обычные уведомления, пока не откроют свой Центр уведомлений и не выберут получать Provisional Pushes в обычном режиме.
</Aside>

#### Как реализовать

1\. Интегрируйте Pushwoosh iOS SDK, следуя [руководству](/ru/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/quick-start/).

2\. Добавьте следующую строку в AppDelegate вашего проекта перед вызовом метода `registerForPushNotifications()`:

<Tabs>
<TabItem label="Swift">
```swift
if #available(iOS 12.0, *) {
    Pushwoosh.sharedInstance().additionalAuthorizationOptions = UNAuthorizationOptions.provisional
}
```

<LinkCard title="Пример" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/provisionalpush/provisionalpush/AppDelegate/AppDelegate.swift" />
</TabItem>

<TabItem label="Objective-C">
```objective-c
if (@available(iOS 12.0, *)) {
	[Pushwoosh sharedInstance].additionalAuthorizationOptions = UNAuthorizationOptionProvisional;
}
```

<LinkCard title="Пример" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/provisionalpush/provisionalpushObjC/provisionalpushObjC/AppDelegate/AppDelegate.m" />
</TabItem>
</Tabs>

Вот и все! Пользователи приложения будут получать сообщения прямо в свой Центр уведомлений после установки приложения.

### Поделитесь с нами своим мнением

Ваши отзывы помогают нам улучшать наш продукт, поэтому мы будем рады услышать от вас, если у вас возникнут какие-либо проблемы в процессе интеграции SDK. Если вы столкнетесь с какими-либо трудностями, пожалуйста, не стесняйтесь поделиться с нами своими мыслями [через эту форму](https://docs.google.com/forms/d/e/1FAIpQLSd\_0b8jwn-V\_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).