Saltar al contenido

Personalización del SDK de iOS

Integración

Anchor link to

Enlaces profundos (Deep linking)

Anchor link to

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.

En su archivo App Delegate (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

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
}

SceneDelegate.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
}
Anchor link to

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.

Cómo funciona

Anchor link to

Cuando una notificación push contiene una URL https:// (en el parámetro “url” o “l”), el SDK hará lo siguiente:

  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

Anchor link to
  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
  1. 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:

{
"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.

  1. Implemente el manejador de Enlaces Universales

SceneDelegate.swift (iOS 13+)

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

AppDelegate.swift (iOS 12 y anteriores, o como alternativa)

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
}

Envío de push con Enlace Universal

Anchor link to

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.

Seguimiento de compras in-app

Anchor link to

Por defecto, el seguimiento de compras in-app está deshabilitado. Si desea realizar un seguimiento de las compras in-app al configurar Customer Journeys, establezca la bandera Pushwoosh_PURCHASE_TRACKING_ENABLED en true en el archivo info.plist. Puede encontrar una lista de las banderas disponibles en la tabla.

Si desea realizar un seguimiento de las compras in-app manualmente, puede usar el siguiente código.

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

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
}
InAppTrackingViewController.swift

Notificaciones push de Geozones

Anchor link to

Las notificaciones push de Geozones 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:

pod 'PushwooshXCFramework/Geozones'

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

  1. Agregue las siguientes claves a su Info.plist:
  • NSLocationWhenInUseUsageDescription(requerido) para que la aplicación rastree Geozones solo mientras se ejecuta en primer plano.
  • NSLocationAlwaysAndWhenInUseUsageDescription(requerido) para que la aplicación rastree Geozones 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 Geozones en todo momento; debe usarse si su aplicación se dirige a iOS 10 y versiones anteriores.
<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>

  1. Importe el framework
import PushwooshGeozones
  1. Inicie el seguimiento de Geozones
PWGeozonesManager.shared()?.startLocationTracking()

Referencia de GitHub

override func viewDidLoad() {
super.viewDidLoad()
// Start Geozones tracking when needed
PWGeozonesManager.shared().startLocationTracking()
}

Creación de una cola de Rich Media

Anchor link to

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 ocurren 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:
@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:

[PWRichMediaManager sharedManager].delegate = [ChainedRichMediaPresentingDelegate new];

Reproducción automática de un video enviado en una Rich Notification con force touch

Anchor link to

Para hacer que un video enviado como un adjunto de Rich Notification 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.
Extensión de contenido de notificación - Notificación push enriquecida de iOS

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

Activar esquema de contenido de notificación
  1. 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()
}
  1. Incorpore un UIView en MainInterface.storyboard:
UIView en el MainInterface.storyboard
  1. Vincule el IBOutlet playerBackgroundView con el UIView que acaba de agregar:
Vincular el IBOutlet playerBackgroundView con el UIView
  1. Actualice el archivo info.plist con la siguiente entrada:
UNNotificationExtensionUserInteractionEnabled = true
UNNotificationExtensionUserInteractionEnabled = true

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

URL del video en el campo Media Attachment en el Panel de Control de Pushwoosh

Al enviar una notificación a través de la solicitud de API /createMessage, incluya la URL en el parámetro “ios_attachment” y asegúrese de que la bandera “mutable-content” esté establecida en `1`.

Sonido de push personalizado

Anchor link to

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.

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 de su mensaje o especifique el nombre del archivo como valor para el parámetro “ios_sound” de la solicitud de API createMessage.

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 Pushwoosh para iOS.

Push provisional de iOS

Anchor link to

Cómo funciona

Anchor link to

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 prominentes: al abrir el Push Provisional, tienen dos opciones para elegir su experiencia: mantener los pushes en el Centro de Notificaciones sin alertas ni sonidos, o permitirle enviar pushes de manera prominente 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 les dan 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 prominente.

Cómo implementar

Anchor link to

1. Integre el SDK de Pushwoosh para iOS siguiendo la guía.

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

if #available(iOS 12.0, *) {
Pushwoosh.sharedInstance().additionalAuthorizationOptions = UNAuthorizationOptions.provisional
}

¡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

Anchor link to

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.