Pular para o conteúdo

Personalizando o SDK do iOS

Integração

Anchor link to
Anchor link to

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

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

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

Quando uma notificação push contém uma URL https:// (no parâmetro “url” ou “l”), o SDK irá:

  1. Criar um NSUserActivity com a URL
  2. Chamar o manipulador de Links Universais do seu aplicativo (scene:continueUserActivity: ou application:continueUserActivity:restorationHandler:)
  3. Se o seu aplicativo não manipular a URL, ela será aberta no Safari como um fallback

Configuração

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

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

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

Ao criar uma notificação push, use a URL do seu site no campo Ação:

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

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

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

Notificações push de Geozones

Anchor link to

As notificações push de Geozones são encapsuladas em um framework separado PushwooshGeozones.

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

Alternativamente, você pode simplesmente arrastar e soltar o framework em Link Binaries With Libraries nas Build Phases do seu projeto.

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

  1. Importe o framework
import PushwooshGeozones
  1. Inicie o rastreamento de Geozones
PWGeozonesManager.shared()?.startLocationTracking()

Referência do GitHub

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

Criando uma fila de Rich Media

Anchor link to

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

  1. 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];
}
@end

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

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

  1. 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.
Extensão de Conteúdo de Notificação - Notificação Push Rica do iOS

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

Ativar Esquema de Conteúdo de Notificação
  1. Ajuste as propriedades e métodos na Extensão de Conteúdo da seguinte forma:
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 uma UIView no MainInterface.storyboard:
UIView no MainInterface.storyboard
  1. Vincule o IBOutlet playerBackgroundView com a UIView que você acabou de adicionar:
Vincular o IBOutlet playerBackgroundView com a UIView
  1. Atualize o arquivo info.plist com a seguinte entrada:
UNNotificationExtensionUserInteractionEnabled = true
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:

URL do vídeo no campo Anexo de Mídia no Painel de Controle da Pushwoosh

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 to

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

Como funciona

Anchor link to

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

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

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

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