Unity 하이브리드 앱 연동 가이드
개요
Unity 하이브리드 앱 연동 가이드에 대한 내용입니다. Unity 에서 WebView 를 사용하기 위해 다양한 플러그인을 사용 할 수 있습니다. 각각의 플러그인 마다 하이브리드 앱 연동 코드 형태가 다르므로 Javascript Interface 를 활용하기 위한 메서드를 제공합니다.
interface
AirbridgeWebInterface webInterface;
webInterface = AirbridgeUnity.CreateWebInterface(
"YOUR_WEB_TOKEN", // web token
(msg) => $@"..." // post command function
);
YOUR_WEB_TOKEN
은 대시보드의 Settings > Tokens > 웹 SDK 토큰 에서 확인할 수 있습니다.
public interface AirbridgeWebInterface
{
string Script { get; }
void Handle(string message);
}
이용가이드
아래는 많이 사용되는 plugin 3가지에 대한 연동에 대한 내용입니다.
- gree/unity-webview
- UniWebView
- GPM (Game Package Manger)
gree/unity-webview 바로가기
WebViewObject webViewObject;
AirbridgeWebInterface webInterface;
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;
}}";
webInterface = AirbridgeUnity.CreateWebInterface("YOUR_WEB_TOKEN", (string command) => PostMessageGenerator(command));
postMessageScript = webInterface.Script;
webViewObject.Init(
cb: (msg) =>
{
// do something
// WebView에서 Unity로 전달된 메세지를 Airbridge Unity SDK에서 처리할 수 있도록 설정한다.
webInterface.Handle(msg);
},
err: (msg) => { /* do something */ },
httpErr: (msg) => { /* do something */ },
started: (msg) => { /* do something */ },
hooked: (msg) => { /* do something */ },
ld: (msg) =>
{
// do something
webViewObject.EvaluateJS(postMessageScript);
},
...
);
...
}
UniWebView 바로가기
UniWebView webView;
AirbridgeWebInterface webInterface;
string postMessageScript;
public void Display()
{
string PostMessageGenerator(string arg) => $@"window.location.href = 'uniwebview://airbridge?command=' + {arg}";
webInterface = AirbridgeUnity.CreateWebInterface("YOUR_WEB_TOKEN", (string payload) => PostMessageGenerator(payload));
postMessageScript = webInterface.Script;
webView.OnMessageReceived += (view, message) =>
{
// WebView에서 Unity로 전달된 메세지를 Airbridge Unity SDK에서 처리할 수 있도록 설정한다.
if (message.Path.Equals("airbridge"))
{
string command = message.Args["command"];
webInterface.Handle(command);
}
};
webView.OnPageFinished += (view, statusCode, url) =>
{
webViewObject.EvaluateJavaScript(postMessageScript, (payload) =>
{
if (payload.resultCode.Equals("0"))
{
Debug.Log("Airbridge javascript injection succeeded");
}
else
{
Debug.Log("Airbridge javascript injection failed: " + payload.data);
}
});
};
...
webView.Show();
}
GPM (Game Package Manger) 바로가기
AirbridgeWebInterface webInterface;
string postMessageScript;
public void Display()
{
string PostMessageGenerator(string arg) => $@"window.location.href = 'airbridge://?command=' + {arg}";
webInterface = AirbridgeUnity.CreateWebInterface("YOUR_WEB_TOKEN", (string payload) => PostMessageGenerator(payload));
postMessageScript = webInterface.Script;
GpmWebView.ShowUrl(
"WEB_URL",
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);
// WebView에서 Unity로 전달된 메세지를 Airbridge Unity SDK에서 처리할 수 있도록 설정한다.
if (uri.Scheme.Equals("airbridge"))
{
try
{
string encodedCommand = HttpUtility.ParseQueryString(uri.Query)["command"];
string command = HttpUtility.UrlDecode(encodedCommand);
webInterface.Handle(command);
}
catch (Exception e)
{
Debug.LogFormat("Fail to receive command. Error: {0}", e.Message);
}
}
}
else
{
Debug.LogFormat("Fail to custom scheme. Error:{0}", error);
}
break;
...
}
}