Opções avançadas
Configuração avançada e opcional do SDK do Singular para iOS. Não é necessária para uma integração padrão.
Interface JavaScript
Visão geral
Habilite a funcionalidade do SDK do Singular a partir de código JavaScript em aplicativos híbridos baseados em WKWebView usando a interface JavaScript.
Métodos compatíveis:
- setCustomUserId: Define um identificador de usuário personalizado
- unsetCustomUserId: Remove o identificador de usuário personalizado
- event: Rastreia eventos com ou sem atributos
- revenue: Rastreia receita
Configuração da integração com WKWebView
Configure a interface JavaScript no WKNavigationDelegate do seu view controller para habilitar os métodos do SDK do Singular a partir do JavaScript.
Observação: A partir do iOS 8.0+, a Apple recomenda usar WKWebView para adicionar conteúdo web ao seu aplicativo. Não use UIWebView ou WebView . Consulte a documentação do WKWebView da Apple para obter mais informações.
import UIKit
import WebKit
class ViewController: UIViewController {
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
// Create WKWebView
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.navigationDelegate = self
view.addSubview(webView)
// Load web content
if let url = Bundle.main.url(forResource: "index", withExtension: "html") {
webView.loadFileURL(url, allowingReadAccessTo: url)
}
}
}
extension ViewController: WKNavigationDelegate {
func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
// Check if Singular JavaScript interface exists
let js = "typeof(Singular)"
webView.evaluateJavaScript(js) { (result, error) -> Void in
if let resultString = result as? String {
if resultString == "undefined" {
// Load Singular JavaScript interface
do {
if let path = Bundle.main.path(forResource: "Singular", ofType: "js") {
let contents = try String(contentsOfFile: path)
webView.evaluateJavaScript(contents, completionHandler: nil)
}
} catch {
print("Error loading Singular.js: \(error)")
}
} else {
// Process Singular SDK request
Singular.processJSRequestWK(webView, withURL: navigationAction.request)
}
}
}
// Allow navigation
decisionHandler(.allow)
}
}
#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>
#import <Singular/Singular.h>
@interface ViewController () <WKNavigationDelegate>
@property (strong, nonatomic) WKWebView *webView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Create WKWebView
WKWebViewConfiguration *webConfiguration = [[WKWebViewConfiguration alloc] init];
self.webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webConfiguration];
self.webView.navigationDelegate = self;
[self.view addSubview:self.webView];
// Load web content
NSURL *url = [[NSBundle mainBundle] URLForResource:@"index" withExtension:@"html"];
if (url) {
[self.webView loadFileURL:url allowingReadAccessToURL:url];
}
}
- (void)webView:(WKWebView *)webView
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
// Check if Singular JavaScript interface exists
NSString *js = @"typeof(Singular)";
[webView evaluateJavaScript:js completionHandler:^(id result, NSError *error) {
if ([result isKindOfClass:[NSString class]]) {
NSString *resultString = (NSString *)result;
if ([resultString isEqualToString:@"undefined"]) {
// Load Singular JavaScript interface
NSString *path = [[NSBundle mainBundle] pathForResource:@"Singular" ofType:@"js"];
if (path) {
NSError *readError;
NSString *contents = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:&readError];
if (contents) {
[webView evaluateJavaScript:contents completionHandler:nil];
} else {
NSLog(@"Error loading Singular.js: %@", readError);
}
}
} else {
// Process Singular SDK request
[Singular processJSRequestWK:webView withURL:navigationAction.request];
}
}
}];
// Allow navigation
decisionHandler(WKNavigationActionPolicyAllow);
}
@end
Requisitos de configuração:
-
Inclua o arquivo
Singular.jsno bundle do seu aplicativo - Defina seu view controller como o delegado de navegação do WKWebView
-
Implemente o método delegado
decidePolicyForNavigationAction -
Chame
processJSRequestWKpara processar as solicitações do SDK do Singular
Uso de JavaScript
Chame os métodos do Singular a partir de código JavaScript em execução no seu WKWebView.
Rastrear eventos
// Simple event without attributes
Singular.event('level_completed');
// Event with attributes (pass as JSON string)
Singular.event('purchase_attempt',
JSON.stringify({
"item_name": "sword",
"item_category": "weapons",
"item_price": 9.99
})
);
Rastrear receita
// Track revenue in USD
Singular.revenue('USD', 9.99);
// Track revenue in other currencies
Singular.revenue('EUR', 8.50);
Gerenciar ID de usuário personalizado
// Set custom user ID
Singular.setCustomUserId('user_12345');
// Remove custom user ID
Singular.unsetCustomUserId();
Notas da API JavaScript:
-
Todos os métodos são chamados no objeto global
Singular - Os atributos do evento devem ser passados como objetos serializados em JSON
-
Os nomes dos métodos usam camelCase (por exemplo,
setCustomUserId) - A interface conecta automaticamente as chamadas do JavaScript aos métodos nativos do SDK
Recursos BETA
Não disponível de forma geral: Os recursos desta seção estão em BETA. O Singular precisa habilitá-los para a sua conta antes que funcionem, e o comportamento deles pode mudar. Fale com o seu Customer Success Manager antes de desenvolver com base neles.
Callback de atribuição
O callback de atribuição entrega ao seu app, no dispositivo, o resultado de atribuição do Singular para a instalação — como a rede e a campanha que a geraram — durante a primeira sessão do usuário após a instalação.
É necessário habilitar: Este recurso vem desativado por padrão. Se ele não tiver sido habilitado para a sua conta, o callback nunca é executado, mesmo que o seu código esteja correto. Fale com o seu Customer Success Manager para solicitá-lo.
Como configurar
- Peça ao seu Customer Success Manager para habilitar o callback de atribuição para a sua conta.
- Registre o seu handler no objeto de configuração do SDK antes de inicializá-lo. Para ver a assinatura e um exemplo de código, consulte
deviceAttributionCallback. - Teste em um dispositivo que nunca tenha aberto o app. O callback é executado apenas em uma primeira sessão.
O que esperar
- Apenas na primeira sessão: O callback é executado uma vez, durante a primeira sessão após a instalação. Ele não é chamado em aberturas posteriores.
- Organic é um resultado, não uma falha: Quando nenhum touchpoint é encontrado, o callback ainda assim é executado e informa a rede como "Organic". Se o callback não for executado, a causa é um problema de configuração, e não de atribuição.
- Uma melhor estimativa, não a atribuição final: O resultado reflete o último touchpoint disponível no momento em que a sessão é processada. Ele nem sempre coincidirá com a atribuição exibida nos relatórios do Singular, que é definida depois com mais informações.