Personalizando o SDK do iOS
Integração
Anchor link to- Links diretos (Deep linking)
- Links Universais
- Rastreamento de compras no aplicativo
- Notificações push de Geozones
- Criando uma fila de Rich Media
- Reprodução automática de um vídeo enviado em uma Notificação Rica com force touch
- Som de push personalizado
- Push Provisório do iOS
Links diretos (Deep linking)
Anchor link toNo seu arquivo Info.plist, adicione o array URL types com URL Identifier e URL Scheme.
No exemplo abaixo, o URL Scheme é com.pushwoosh e o URL Identifier é promotion.

No seu arquivo App Delegate (geralmente AppDelegate.m para iOS 12 e inferior, ou SceneDelegate.m para iOS 13 e superior), adicione a função de delegate openURL apropriada, conforme descrito no exemplo abaixo. O exemplo verifica a página correta, analisa o valor “id” da URL e abre o PromoPageViewController em resposta.
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}- (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];}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}- (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}Links Universais
Anchor link toOs Links Universais permitem que os usuários abram seu aplicativo diretamente quando tocam em um link para o seu site. Diferente dos esquemas de URL personalizados, os Links Universais usam URLs https:// padrão e fornecem uma experiência de usuário mais fluida.
Como funciona
Anchor link toQuando uma notificação push contém uma URL https:// (no parâmetro “url” ou “l”), o SDK irá:
- Criar um
NSUserActivitycom a URL - Chamar o manipulador de Links Universais do seu aplicativo (
scene:continueUserActivity:ouapplication:continueUserActivity:restorationHandler:) - Se o seu aplicativo não manipular a URL, ela será aberta no Safari como um fallback
Configuração
Anchor link to- Configure os Domínios Associados no Xcode
Adicione a capacidade de Domínios Associados ao seu aplicativo e adicione seu domínio:
applinks:yourdomain.com- Hospede o arquivo Apple App Site Association
Crie um arquivo apple-app-site-association em seu servidor web em https://yourdomain.com/.well-known/apple-app-site-association:
{ "applinks": { "apps": [], "details": [ { "appID": "TEAM_ID.com.your.bundleid", "paths": ["/path/*", "/promotion/*"] } ] }}Substitua TEAM_ID pelo seu ID de Equipe de Desenvolvedor da Apple e com.your.bundleid pelo identificador do pacote do seu aplicativo.
- Implemente o manipulador de Links Universais
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 }}- (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 }}AppDelegate.swift (iOS 12 e anterior, ou como fallback)
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}- (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;}Enviando push com Link Universal
Anchor link toAo criar uma notificação push, use a URL do seu site no campo Ação:
https://yourdomain.com/promotion?id=123O SDK irá rotear automaticamente esta URL para o seu manipulador de Links Universais, permitindo que você navegue o usuário para a tela apropriada em seu aplicativo.
Rastreamento de compras no aplicativo
Anchor link toPor padrão, o rastreamento de compras no aplicativo está desativado. Se você deseja rastrear compras no aplicativo ao configurar Customer Journeys, defina a flag Pushwoosh_PURCHASE_TRACKING_ENABLED como true no arquivo info.plist. Você pode encontrar uma lista de flags disponíveis na tabela.
Se você deseja rastrear compras no aplicativo manualmente, pode usar o código abaixo.
No método de delegate paymentQueue:updatedTransactions:, chame o método sendSKPaymentTransactions do 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 }- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
[[PushNotificationManager pushManager] sendSKPaymentTransactions:transactions];
//the rest of the code, consume transactions, etc}
Notificações push de Geozones
Anchor link toAs notificações push de Geozones são encapsuladas em um framework separado PushwooshGeozones.
- Adicione PushwooshGeozones.framework ao seu projeto
Para adicionar PushwooshGeozones.framework ao seu projeto usando um gerenciador de dependências, coloque as seguintes linhas no seu podfile ou cartfile:
pod 'PushwooshXCFramework/Geozones'github "Pushwoosh/pushwoosh-ios-sdk"Se você quiser usar PushwooshGeozones.xcframework, insira a seguinte URL do Pacote:
PushwooshGeozones-XCFramework
Alternativamente, você pode simplesmente arrastar e soltar o framework em Link Binaries With Libraries nas Build Phases do seu projeto.
- Adicione as seguintes chaves ao seu Info.plist:
- NSLocationWhenInUseUsageDescription – (obrigatório) para o aplicativo rastrear Geozones apenas enquanto estiver em primeiro plano.
- NSLocationAlwaysAndWhenInUseUsageDescription – (obrigatório) para o aplicativo rastrear Geozones tanto em primeiro plano quanto em segundo plano e para mostrar um pop-up de diálogo de solicitação de permissão.
- NSLocationAlwaysUsageDescription – (opcional) para o aplicativo rastrear Geozones o tempo todo; deve ser usado se seu aplicativo for compatível com iOS 10 e versões 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>- Importe o framework
import PushwooshGeozones#import <PushwooshGeozones/PWGeozonesManager.h>- Inicie o rastreamento de Geozones
PWGeozonesManager.shared()?.startLocationTracking()[[PWGeozonesManager sharedManager] startLocationTracking];Exemplo
Anchor link tooverride func viewDidLoad() { super.viewDidLoad()
// Start Geozones tracking when needed PWGeozonesManager.shared().startLocationTracking()}- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view.
// Start Geozones tracking when needed [[PWGeozonesManager sharedManager] startLocationTracking];}Criando uma fila de Rich Media
Anchor link toCaso haja várias páginas de Rich Media para exibir simultaneamente (por exemplo, eventos de gatilho para dois ou mais In-Apps ocorrem ao mesmo tempo, ou uma página de Rich Media já está sendo exibida no momento em que um evento de gatilho diferente ocorre), você pode configurar uma fila para a exibição de páginas de Rich Media. Para criar uma fila, siga os passos descritos abaixo.
- Crie uma classe 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];}
@end2. Defina o delegate:
[PWRichMediaManager sharedManager].delegate = [ChainedRichMediaPresentingDelegate new];Reprodução automática de um vídeo enviado em uma Notificação Rica com force touch
Anchor link toPara fazer com que um vídeo enviado como um anexo de Notificação Rica seja reproduzido automaticamente quando a notificação é expandida sem qualquer interação do usuário, siga os passos abaixo:
- Adicione a Extensão de Conteúdo de Notificação ao seu projeto:
- No Xcode, selecione File > New > Target.
- Escolha Notification Content Extension.
- Atribua um nome e complete a configuração.

Se for solicitado com a mensagem “Activate scheme”, escolha Cancel.

- Ajuste as propriedades e métodos na Extensão de Conteúdo da seguinte forma:
import UIKitimport UserNotificationsimport UserNotificationsUIimport 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() }- Incorpore uma UIView no MainInterface.storyboard:

- Vincule o IBOutlet playerBackgroundView com a UIView que você acabou de adicionar:

- Atualize o arquivo info.plist com a seguinte entrada:
UNNotificationExtensionUserInteractionEnabled = true
Para anexar um vídeo à sua notificação, insira a URL de um vídeo no campo Anexo de Mídia no Painel de Controle:

Ao enviar uma notificação via solicitação da API /createMessage, inclua a URL no parâmetro “ios_attachment” e certifique-se de que a flag “mutable-content” esteja definida como `1`.
Som de push personalizado
Anchor link toPara reproduzir um som personalizado ao receber uma notificação push, primeiro coloque o arquivo de áudio na pasta raiz do seu projeto.

Em seguida, especifique o nome do arquivo de som nos parâmetros do push – preencha o campo Som das configurações específicas do iOS da sua mensagem ou especifique o nome do arquivo como um valor para o parâmetro “ios_sound” da solicitação da API createMessage.
O arquivo de áudio para som personalizado do iOS deve estar em um dos seguintes formatos: .aif, .caf, .wav. Certifique-se de especificar o formato no nome do arquivo; caso contrário, ele será ignorado pelo SDK do iOS da Pushwoosh.
Push Provisório do iOS
Anchor link toComo funciona
Anchor link toAs notificações push provisórias aparecem silenciosamente na Central de Notificações do usuário, mas não na tela de bloqueio. Este tipo de push não precisa ser permitido explicitamente por um usuário: você pode começar a enviá-los assim que um usuário instalar e iniciar seu aplicativo.
No entanto, os usuários ainda podem se inscrever nas suas notificações push proeminentes: ao abrir o Push Provisório, eles têm duas opções para escolher sua experiência – manter os pushes na Central de Notificações sem alertas e sons ou permitir que você envie pushes de forma proeminente para que apareçam na tela de bloqueio.
Os Pushes Provisórios são projetados para permitir que os usuários tomem decisões informadas sobre se gostariam de receber notificações do seu aplicativo. Como a solicitação de inscrição nativa da APN é mostrada aos usuários apenas uma vez e para se inscreverem mais tarde, eles devem ir para as configurações do sistema do telefone, e alguns usuários podem não se inscrever por não saberem o valor que recebem com seus pushes. Os Pushes Provisórios dão aos usuários esse entendimento: eles podem ver qual conteúdo você entrega em notificações push e decidir se precisam ser notificados sobre esse conteúdo de forma proeminente.
Como implementar
Anchor link to1. Integre o SDK do iOS da Pushwoosh seguindo o guia.
2. Adicione a seguinte string ao AppDelegate do seu projeto antes de chamar o método registerForPushNotifications():
if #available(iOS 12.0, *) { Pushwoosh.sharedInstance().additionalAuthorizationOptions = UNAuthorizationOptions.provisional}if (@available(iOS 12.0, *)) { [Pushwoosh sharedInstance].additionalAuthorizationOptions = UNAuthorizationOptionProvisional;}É isso! Os usuários do aplicativo receberão mensagens diretamente em sua Central de Notificações assim que instalarem o aplicativo.
Compartilhe seu feedback conosco
Anchor link toSeu feedback nos ajuda a criar uma experiência melhor, então adoraríamos ouvir de você se tiver algum problema durante o processo de integração do SDK. Se você enfrentar alguma dificuldade, não hesite em compartilhar suas opiniões conosco através deste formulário.