하이브리드 앱 설정하기 - 유니티 SDK

알립니다

하이브리드 앱 설정을 하기 전에 앱과 웹사이트에 각각 유니티 SDK웹 SDK를 설치해 주세요.

하이브리드 앱에서 웹 사이트 코드를 변경하지 않아도 에어브릿지 유니티 SDK가 인앱 웹 사이트에서 발생하는 에어브릿지 관련 작업을 처리하도록 설정할 수 있습니다.

유니티 SDK로 웹 SDK 동작 처리하기

유니티 SDK는 웹 SDK에서 진행되는 이벤트 전송, 디바이스 설정, 유저 설정에 관한 명령을 대신 처리할 수 있습니다. 웹뷰에 웹 사이트를 표시하기 전에 Airbridge.CreateWebInterfaceScript 함수와 Airbridge.HandleWebInterfaceCommand 함수를 이용해 설정해 주세요.

webToken웹 SDK 토큰입니다. 웹 SDK 토큰은 에어브릿지 대시보드의 [설정]>[토큰 관리]에서 확인할 수 있습니다.

postMessageScript 는 웹 SDK가 유니티 SDK에 전달하는 명령어가 저장된 payload 변수를 유니티 영역에 전달하는 자바스크립트 코드입니다.

command 는 웹 SDK가 유니티 SDK에 전달하는 명령어입니다.

123456789101112131415161718192021222324252627282930313233343536373839404142
WebViewObject webViewObject;
string postMessageScript;

public void Display()
{
	string PostMessageGenerator(string arg) =>
		$@"
if (window && window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.unityControl) {{
	window.webkit.messageHandlers.unityControl.postMessage({arg});
}} else {{
	var iframe = document.createElement('IFRAME');
	iframe.setAttribute('src', 'unity:' + {arg});
	document.documentElement.appendChild(iframe);
	iframe.parentNode.removeChild(iframe);
	iframe = null;
}}";

	postMessageScript = Airbridge.CreateWebInterfaceScript("YOUR_WEB_SDK_TOKEN", PostMessageGenerator("payload"));

	webViewObject.Init(
		cb: (msg) =>
		{
			// do something
    
			// Allow the Airbridge Unity SDK to process the forwarded messages from the WebView. 
			string command = msg;
			Airbridge.HandleWebInterfaceCommand(command);
		},
		err: (msg) => { /* do something */ },
		httpErr: (msg) => { /* do something */ },
		started: (msg) => { /* do something */ },
		hooked: (msg) => { /* do something */ },
		ld: (msg) =>
		{
			// do something
         
			webViewObject.EvaluateJS(postMessageScript);
		}
	);

	webViewObject.LoadURL("https://...");
}
123456789101112131415161718192021222324252627282930313233343536373839
UniWebView webView;
string postMessageScript;

public void Display()
{
    string PostMessageGenerator(string arg) => $@"window.location.href = 'uniwebview://airbridge?command=' + {arg}";
        
    postMessageScript = Airbridge.CreateWebInterfaceScript("YOUR_WEB_SDK_TOKEN", PostMessageGenerator("payload"));

    webView.OnMessageReceived += (view, message) =>
    {
        if (message.Path.Equals("airbridge")) {
            string command = message.Args["command"];
            Airbridge.HandleWebInterfaceCommand(command);
        }
    };

    webView.OnPageFinished += (view, statusCode, url) =>
    {
        // do something

        webView.EvaluateJavaScript(postMessageScript, (payload) => 
        {
            if (payload.resultCode.Equals("0")) 
            {
                Debug.Log("Airbridge javascript injection succeeded");
            } 
            else 
            {
                Debug.Log("Airbridge javascript injection failed: " + payload.data);
            }
        });
    };

    // ...

    webView.Load("https://...");
    webView.Show();  
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
string postMessageScript;

public void Display()
{
    string PostMessageGenerator(string arg) => $@"window.location.href = 'airbridge://?command=' + {arg}";
        
    postMessageScript = Airbridge.CreateWebInterfaceScript("YOUR_WEB_SDK_TOKEN", PostMessageGenerator("payload"));

    GpmWebView.ShowUrl(
        "https://...",
        new GpmWebViewRequest.Configuration() { /* ... */ },
        OnCallback,
        new List<string>()
        {
            "airbridge"    // PUT AIRBRIDGE SCHEME HERE
        }
    );
}

private void OnCallback(
    GpmWebViewCallback.CallbackType callbackType,
    string data,
    GpmWebViewError error
) 
{
    switch (callbackType)
    {
        // ...
        case GpmWebViewCallback.CallbackType.PageLoad:
            if (string.IsNullOrEmpty(data) == false)
            {
                // do something

                GpmWebView.ExecuteJavaScript(postMessageScript);
            }
            break;
        case GpmWebViewCallback.CallbackType.Scheme:
            if (error == null)
            {
                Uri uri = new Uri(data);
                if (uri.Scheme.Equals("airbridge"))
                {
                    try
                    {
                        string encodedCommand = HttpUtility.ParseQueryString(uri.Query)["command"];
                        string command = HttpUtility.UrlDecode(encodedCommand);
                        Airbridge.HandleWebInterfaceCommand(command);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Fail to receive command. Error: {0}", e.Message);
                    }
                }
            }
            else
            {
                Debug.Log(string.Format("Fail to custom scheme. Error: {0}", error));
            }
            break;
    }
}

주의사항

아래 사항을 주의해 주세요.

하이브리드 앱 설정을 하면 웹 SDK만으로 인앱 웹뷰에서 발생하는 이벤트를 수집해야 합니다. 앱 SDK로 이벤트를 추가로 수집하면 해당 이벤트가 중복해서 집계됩니다.

인앱 웹뷰에 실제 모바일 웹사이트를 사용하면 웹 SDK만으로 이벤트를 수집해 주세요.