Saltar al contenido

Personalización del SDK de iOS

Integración

Anchor link to

Enlaces profundos

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

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
}

Enlaces universales

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:

  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 en la aplicación

Anchor link to

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, 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.

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

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 Geozonas

Anchor link to

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:

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 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.
<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 Geozonas
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 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:
@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 Notificación Enriquecida con force touch

Anchor link to

Para hacer que un video enviado como un adjunto de Notificación Enriquecida 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 una UIView en MainInterface.storyboard:
UIView en el MainInterface.storyboard
  1. Vincule el IBOutlet playerBackgroundView con la UIView que acaba de agregar:
Vincular el IBOutlet playerBackgroundView con 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 Adjunto de Medios en el Panel de Control:

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, incluya la URL en el parámetro “ios_attachment” y asegúrese de que el indicador “mutable-content” esté establecido 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 iOS de Pushwoosh.

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

Cómo implementar

Anchor link to

1. Integre el SDK de iOS de Pushwoosh 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.