연동하기
Last updated
Last updated
본 가이드에서는 Android, iOS에서 하이브리드 앱을 연동했을 시의 가상의 시나리오를 다룹니다. HTML 뷰와 Native 뷰 간의 차이를 해소하여 HTML 뷰에서 이벤트를 기록하고 앱으로 보낼 수 있는 방법에 대해 설명합니다.
해당 방법을 적용하기 위해선 SDK 설치 및 연동 작업이 선행되어야 합니다.
Android와 iOS 모두 web view에서 native code를 호출할 수 있는 네이티브 자바스크립트 인터페이스를 갖고 있습니다.
Android:
iOS:
구현은 다음 단계들로 구성됩니다.
Webview 또는 웹페이지를 위한 HTML 코드
Webview를 위한 네이티브 코드 구현
다음 HTML 코드를 Webview 또는 웹 페이지에 추가합니다.
<h1>Logging Event From Web View</h1>
<div id="main">
<button id="logSignUpEvent" onclick="logSignUPEvent()"> SignUp </button>
</div>
<script type="text/javascript">
function logLoginEvent(){
var eventName = "abx:sign_up"
var eventProperty = {'abx:sign_channel': 'Facebook'};
window.customJsBridge.logEvent(eventName, JSON.stringify(eventProperty));
}
</script>
다음 코드를 사용하여 웹 액티비티 클래스를 작성합니다.
myWebview.getSettings().setJavaScriptEnabled(true);
myWebView.addJavascriptInterface(new MainJsInterface(), "customJsBridge");
myWebView.loadUrl("https://yourwebsite.com");
webView.settings.apply {
this.javaScriptEnabled = true
}
myWebView.addJavascriptInterface(MainJsInterface(), "customJsBridge")
myWebView.loadUrl("https://yourwebsite.com")
JavascriptInterface로 invoke()를 구현할 MainJsInterface class를 생성합니다.
public class MainJsInterface {
@JavascriptInterface
public void logEvent(String eventName, String eventProperty){
JSONObject eventPropertyJsonObject = null;
if(eventProperty != null){
try {
eventPropertyJsonObject = new JSONObject(eventProperty);
} catch (JSONException e) {
e.printStackTrace();
}
}
Adbrix.getInstance().logEvent(eventName, eventPropertyJsonObject);
}
}
class MainJsInterface {
@JavascriptInterface
fun logEvent(eventName: String?, eventProperty: String?) {
var eventPropertyJsonObject: JSONObject? = null
if (eventProperty != null) {
try {
eventPropertyJsonObject = JSONObject(eventProperty)
} catch (e: JSONException) {
e.printStackTrace()
}
}
Adbrix.getInstance().logEvent(eventName!!, eventPropertyJsonObject)
}
}
다음 HTML 코드를 Webview 또는 웹 페이지에 추가합니다.
<h1>Logging Event From Web View</h1>
<div id="main">
<button id="logSignUpEvent" onclick="logSignUPEvent()"> SignUp </button>
</div>
<script type="text/javascript">
function logLoginEvent(){
var eventName = "abx:sign_up"
var eventProperty = {'abx:sign_channel': 'Facebook'};
var message = {
'eventName' : eventName,
'eventProperty' : eventProperty
};
webkit.messageHandlers.customJsBridge.postMessage(message);
}
</script>
다음과 같이 WKWebView 객체의 messageHandler를 연결후 웹뷰를 로드해 주세요.
import UIKit
import WebKit
import AdbrixSDK
class WebView: UIViewController, WKScriptMessageHandler {
var webView: WKWebView!
override func loadView() {
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
// messageHandler 연결
webView.configuration.userContentController.add(self, name: "customJsBridge")
let myURL = URL(string:"https://www.YOUR_WEBSITE.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
// WKScriptMessageHandler 프로토콜 구현
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "customJsBridge", let messageBody = message.body as? [String: Any] {
if let eventName = messageBody["eventName"] as? String,
let eventProperty = messageBody["eventProperty"] as? [String: Any] {
// Adbrix SDK 이벤트 호출
Adbrix.shared().logEvent(name: eventName, properties: property)
}
}
}
}
// WebView.h
#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>
#import <AdbrixSDK/AdbrixSDK.h>
@interface WebView : UIViewController <WKScriptMessageHandler>
@property (nonatomic, strong) WKWebView *webView;
@end
@implementation WebView
// WebView.m
#import "WebView.h"
@implementation WebView
- (void)loadView {
WKWebViewConfiguration *webConfiguration = [[WKWebViewConfiguration alloc] init];
self.webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webConfiguration];
self.view = self.webView;
}
- (void)viewDidLoad {
[super viewDidLoad];
// messageHandler 연결
[self.webView.configuration.userContentController addScriptMessageHandler:self name:@"customJsBridge"];
NSURL *myURL = [NSURL URLWithString:@"https://www.YOUR_WEBSITE.com"];
if (myURL) {
NSURLRequest *myRequest = [NSURLRequest requestWithURL:myURL];
[self.webView loadRequest:myRequest];
}
}
// WKScriptMessageHandler 프로토콜 구현
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"customJsBridge"]) {
if ([message.body isKindOfClass:[NSDictionary class]]) {
NSDictionary *messageBody = (NSDictionary *)message.body;
NSString *eventName = messageBody[@"eventName"];
NSDictionary *eventProperty = messageBody[@"eventProperty"];
if (eventName && [eventProperty isKindOfClass:[NSDictionary class]]) {
// Adbrix SDK 이벤트 호출
[[Adbrix shared] logEvent:eventName withProperties:eventProperty];
}
}
}
}
@end
Swift로 작성된 하이브리드 앱에서 logEvent 호출 시 logEvent(_ name: String, properties: [String: Any]) 메서드가 아닌 logEvent(name: String, properties: [String: Any]) 메서드를 호출해 주세요