# Personalización del SDK de iOS

## Integración

* [Enlaces profundos](#deep-linking)
* [Enlaces universales](#universal-links)
* [Seguimiento de compras en la aplicación](#in-app-purchase-tracking)
* [Notificaciones push de Geozonas](#geozones-push-notifications)
* [Creación de una cola de Rich Media](#creating-a-rich-media-queue)
* [Reproducción automática de un video enviado en una Notificación Enriquecida con force touch](#autoplay-a-video-sent-in-a-rich-notification-with-force-touch)
* [Sonido de push personalizado](#custom-push-sound)
* [Push Provisional de iOS](#ios-provisional-push)


### Enlaces profundos

En su archivo **Info.plist** agregue el array `URL types` con `URL Identifier` y `URL Scheme`.\
En el siguiente ejemplo, el `URL Scheme` es _com.pushwoosh_ y el `URL Identifier` es _promotion_.

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

En el archivo App Delegate de su aplicación (generalmente AppDelegate.m para iOS 12 y versiones anteriores, o SceneDelegate.m para iOS 13 y versiones posteriores), agregue la función de delegado openURL apropiada como se describe en el ejemplo a continuación. El ejemplo verifica la página correcta, analiza el valor "id" de la URL y abre PromoPageViewController en respuesta.

```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>

### Enlaces universales

Los Enlaces Universales permiten a los usuarios abrir su aplicación directamente cuando tocan un enlace a su sitio web. A diferencia de los esquemas de URL personalizados, los Enlaces Universales utilizan URL estándar `https://` y proporcionan una experiencia de usuario más fluida.

<Aside type="note">
A partir de la **versión 7.0.15 del SDK**, el SDK de iOS de Pushwoosh enruta automáticamente los Enlaces Universales de las notificaciones push a los manejadores de su aplicación en lugar de abrirlos en Safari.
</Aside>

#### Cómo funciona

Cuando una notificación push contiene una URL `https://` (en el parámetro "url" o "l"), el SDK:

1. Creará un `NSUserActivity` con la URL
2. Llamará al manejador de Enlaces Universales de su aplicación (`scene:continueUserActivity:` o `application:continueUserActivity:restorationHandler:`)
3. Si su aplicación no maneja la URL, se abrirá en Safari como alternativa

#### Configuración

1. **Configure los Dominios Asociados en Xcode**

Agregue la capacidad de Dominios Asociados a su aplicación y añada su dominio:

```
applinks:yourdomain.com
```

2. **Aloje el archivo de Asociación de Sitio de Aplicación de Apple**

Cree un archivo `apple-app-site-association` en su servidor web en `https://yourdomain.com/.well-known/apple-app-site-association`:

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

Reemplace `TEAM_ID` con su ID de equipo de desarrollador de Apple y `com.your.bundleid` con el identificador de paquete de su aplicación.

3. **Implemente el manejador de Enlaces Universales**

```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
    }

    // Handle the Universal Link URL
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let path = components?.path

    if path?.starts(with: "/promotion") == true {
        // Navigate to promotion screen
        let promotionId = components?.queryItems?.first(where: { $0.name == "id" })?.value
        // Show promotion with 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;
    }

    // Handle the Universal Link URL
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *path = components.path;

    if ([path hasPrefix:@"/promotion"]) {
        // Navigate to promotion screen
        NSString *promotionId = nil;
        for (NSURLQueryItem *item in components.queryItems) {
            if ([item.name isEqualToString:@"id"]) {
                promotionId = item.value;
                break;
            }
        }
        // Show promotion with promotionId
    }
}
```
</TabItem>
</Tabs>

```AppDelegate.swift``` (iOS 12 y anteriores, o como alternativa)
<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
    }

    // Handle the Universal Link URL
    let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
    let path = components?.path

    if path?.starts(with: "/promotion") == true {
        // Navigate to promotion screen
        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;
    }

    // Handle the Universal Link URL
    NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
    NSString *path = components.path;

    if ([path hasPrefix:@"/promotion"]) {
        // Navigate to promotion screen
        return YES;
    }

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

#### Envío de push con Enlace Universal

Al crear una notificación push, use la URL de su sitio web en el campo **Acción**:

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

El SDK enrutará automáticamente esta URL a su manejador de Enlaces Universales, permitiéndole navegar al usuario a la pantalla apropiada en su aplicación.

<Aside type="tip">
Los Enlaces Universales proporcionan una mejor experiencia de usuario que los esquemas de URL personalizados porque funcionan incluso si su aplicación no está instalada; en su lugar, el usuario será llevado a su sitio web.
</Aside>

### Seguimiento de compras en la aplicación

Por defecto, el seguimiento de las compras en la aplicación está deshabilitado. Si desea realizar un seguimiento de las compras en la aplicación al configurar [Customer Journeys](/es/product/customer-journey/pushwoosh-journey-overview), establezca el indicador _Pushwoosh\_PURCHASE\_TRACKING\_ENABLED_ en _true_ en el archivo _info.plist_. Puede encontrar una lista de los indicadores disponibles en la [tabla](/es/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/advanced-integration-guide/#complete-list-of-infoplist-properties).

Si desea realizar un seguimiento manual de las compras en la aplicación, puede utilizar el siguiente código.

En el método delegado `paymentQueue:updatedTransactions:`, llame al método `sendSKPaymentTransactions` de `PushManager`

<Tabs>
<TabItem label="Swift">
```swift
 func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
     // In-Apps Tracking Pushwoosh code here
     Pushwoosh.sharedInstance().sendSKPaymentTransactions(transactions)
     // the rest of the code, consume transactions, etc
 }
```
</TabItem>

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

  [[PushNotificationManager pushManager] sendSKPaymentTransactions:transactions];

  //the rest of the code, consume transactions, etc
}
```
</TabItem>
</Tabs>

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

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

### Notificaciones push de Geozonas

Las notificaciones push de Geozonas están encapsuladas en un framework separado **PushwooshGeozones**.

1. Agregue PushwooshGeozones.framework a su proyecto

Para agregar PushwooshGeozones.framework a su proyecto usando un gestor de dependencias, ponga las siguientes
líneas en su `podfile` o `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">
  
  Si desea utilizar **PushwooshGeozones.xcframework**, ingrese la siguiente URL de paquete:  
  [PushwooshGeozones-XCFramework](https://github.com/Pushwoosh/PushwooshGeozones-XCFramework)  

  </TabItem>
</Tabs>


Alternativamente, puede simplemente arrastrar y soltar el framework en **Link Binaries With Libraries** en las **Build Phases** de su proyecto.


2. Agregue las siguientes claves a su Info.plist:

- **NSLocationWhenInUseUsageDescription** – *(requerido)* para que la aplicación rastree Geozonas solo mientras se ejecuta en primer plano.  
- **NSLocationAlwaysAndWhenInUseUsageDescription** – *(requerido)* para que la aplicación rastree Geozonas **tanto en primer plano como en segundo plano** y para mostrar un cuadro de diálogo de solicitud de permiso.  
- **NSLocationAlwaysUsageDescription** – *(opcional)* para que la aplicación rastree Geozonas **en todo momento**; debe usarse si su aplicación se dirige a iOS 10 y versiones anteriores.  

```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="Ejemplo de Info.plist de Pushwoosh" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Info.plist" />

3. Importe el framework

<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. Inicie el seguimiento de Geozonas

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

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

  [Referencia de 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];
  ```

  [Referencia de GitHub](https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/customizing/customizingObjC/customizingObjC/Geozones%20Push%20Notification/PWGeozonesViewController.m)

  </TabItem>
</Tabs>

##### Ejemplo 
<Tabs>
  <TabItem value="swift" label="Ejemplo en Swift">

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

      // Start Geozones tracking when needed
      PWGeozonesManager.shared().startLocationTracking()
  }
  ```

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

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

      // Start Geozones tracking when needed
      [[PWGeozonesManager sharedManager] startLocationTracking];
  }
  ```

  </TabItem>
</Tabs>


### Creación de una cola de Rich Media

En caso de que haya varias páginas de Rich Media para mostrar simultáneamente (por ejemplo, los eventos de activación para dos o más In-Apps tienen lugar en un momento, o una página de Rich Media ya se está mostrando en el momento en que ocurre un evento de activación diferente), puede configurar una cola para la visualización de páginas de Rich Media. Para crear una cola, siga los pasos que se describen a continuación.

1. Cree una clase que implemente 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\. Establezca el delegado:

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

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

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

### Reproducción automática de un video enviado en una Notificación Enriquecida con force touch

Para hacer que un video enviado como un [adjunto de Notificación Enriquecida](/es/developer/pushwoosh-sdk/ios-sdk/ios-rich-notifications-integration/) se reproduzca automáticamente cuando la notificación se expande sin ninguna interacción del usuario, siga los pasos a continuación:

1. Agregue la Extensión de Contenido de Notificación a su proyecto:

* En Xcode, seleccione Archivo > Nuevo > Destino.
* Elija Extensión de Contenido de Notificación.
* Asígnele un nombre y complete la configuración.

<img src="/ios-push-notifications-customizing-ios-sdk-5.webp" alt="Extensión de Contenido de Notificación - Notificación Push Enriquecida de iOS"/>

Si se le solicita con el mensaje "Activar esquema", elija Cancelar.

<img
  src="/ios-push-notifications-customizing-ios-sdk-6.webp"
  alt="Activar Esquema de Contenido de Notificación"
  style={{ display: "block", margin: "0 auto", maxWidth: "40%", height: "auto" }}
  width="400"
/>

2. Ajuste las propiedades y métodos en la Extensión de Contenido de la siguiente manera:

```
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()
        // Do any required interface initialization here.
    }

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

        playerController = AVPlayerViewController()
        // Set height programmatically
        // 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. Incorpore una UIView en MainInterface.storyboard:

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

4. Vincule el IBOutlet playerBackgroundView con la UIView que acaba de agregar:

<img src="/ios-push-notifications-customizing-ios-sdk-8.webp" alt="Vincular el IBOutlet playerBackgroundView con UIView"/>

5. Actualice el archivo info.plist con la siguiente entrada:

```
UNNotificationExtensionUserInteractionEnabled = true
```

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

Para adjuntar un video a su notificación, ingrese la URL de un video en el campo Adjunto de Medios en el Panel de Control:

<img src="/ios-push-notifications-customizing-ios-sdk-10.webp" alt="URL del video en el campo Adjunto de Medios en el Panel de Control de Pushwoosh"/>

Al enviar una notificación a través de la solicitud de API [/createMessage](/es/developer/api-reference/messages-api#createmessage), incluya la URL en el parámetro "ios\_attachment" y asegúrese de que el indicador "mutable-content" esté establecido en \`1\`.

<Aside type="note">
Para probar la función de reproducción automática, puede usar el siguiente video de muestra: [Video de muestra de Hola Mundo](https://docs-assets.developer.apple.com/published/efa8e7a0a97cfab20bf0f4c307b9b121/Hello-World-overview.mp4).
</Aside>

<video src="/ios-push-notifications-customizing-ios-sdk-11.webm" title="Video de muestra de Hola Mundo" autoplay loop muted playsinline />

### Sonido de push personalizado

Para reproducir un sonido personalizado al recibir una notificación push, primero coloque el archivo de audio en la carpeta raíz de su proyecto.

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

Luego, especifique el nombre del archivo de sonido en los parámetros de push: complete el campo Sonido de la [configuración específica de iOS](/es/product/messaging-channels/push-notifications/send-push-notifications/one-time-push#ios) de su mensaje o especifique el nombre del archivo como valor para el parámetro "ios\_sound" de la [solicitud de API createMessage](/es/developer/api-reference/messages-api/).

El archivo de audio para el sonido personalizado de iOS debe estar en uno de los siguientes formatos: **.aif**, **.caf**, **.wav**. **Asegúrese de especificar el formato en el nombre del archivo; de lo contrario, será ignorado por el SDK de iOS de Pushwoosh.**

<Aside type="tip">
Considere las limitaciones de la App Store sobre el tamaño del paquete al agregar el archivo de sonido a su paquete.
</Aside>


### Push Provisional de iOS

<Aside>
Compatible con iOS 12 y versiones posteriores.
</Aside>

#### Cómo funciona

Las notificaciones push provisionales aparecen silenciosamente en el Centro de Notificaciones del usuario pero no en la pantalla de bloqueo. Este tipo de pushes no necesita ser permitido explícitamente por un usuario: puede comenzar a enviarlos tan pronto como un usuario instale y ejecute su aplicación.

Sin embargo, los usuarios aún pueden suscribirse a sus notificaciones push destacadas: al abrir el Push Provisional, tienen dos opciones para elegir su experiencia: mantener los pushes en el Centro de Notificaciones sin alertas y sonidos o permitirle enviar pushes de manera destacada para que aparezcan en la pantalla de bloqueo.

Los Pushes Provisionales están diseñados para permitir que los usuarios tomen decisiones informadas sobre si les gustaría recibir notificaciones de su aplicación. Como la solicitud de suscripción nativa de APN se muestra a los usuarios solo una vez y para suscribirse más tarde, deben ir a la configuración del sistema de su teléfono, y algunos usuarios podrían no suscribirse ya que no son conscientes del valor que obtienen con sus pushes. Los Pushes Provisionales brindan a los usuarios esta comprensión: pueden ver qué contenido entrega en las notificaciones push y decidir si necesitan ser notificados sobre este contenido de manera destacada.

<Aside type="caution" title="Importante">
Tenga en cuenta que los Pushes Provisionales, cuando se implementan, reemplazan el aviso nativo de APN, lo que significa que los usuarios no pueden suscribirse a notificaciones destacadas hasta que abran su Centro de Notificaciones y elijan recibir los Pushes Provisionales como destacados.
</Aside>

#### Cómo implementar

1\. Integre el SDK de iOS de Pushwoosh siguiendo la [guía](/es/developer/pushwoosh-sdk/ios-sdk/setting-up-pushwoosh-ios-sdk/quick-start/).

2\. Agregue la siguiente cadena al AppDelegate de su proyecto antes de llamar al método `registerForPushNotifications()`:

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

<LinkCard title="Ejemplo" 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="Ejemplo" href="https://github.com/Pushwoosh/pushwoosh-quickstart-ios/blob/main/provisionalpush/provisionalpushObjC/provisionalpushObjC/AppDelegate/AppDelegate.m" />
</TabItem>
</Tabs>

¡Eso es todo! Los usuarios de la aplicación recibirán mensajes directamente en su Centro de Notificaciones una vez que instalen la aplicación.

### Comparta sus comentarios con nosotros

Sus comentarios nos ayudan a crear una mejor experiencia, por lo que nos encantaría saber de usted si tiene algún problema durante el proceso de integración del SDK. Si enfrenta alguna dificultad, no dude en compartir sus pensamientos con nosotros [a través de este formulario](https://docs.google.com/forms/d/e/1FAIpQLSd\_0b8jwn-V\_JmoPLIxIFYbHACCQhrzidOZV3ELywoQPXRSxw/viewform).