/* * Copyright (C) 2012 GREE, Inc. * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages * arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. */ using System.Collections; using UnityEngine; using UnityEngine.UI; using Coolape; using System; public class UWebView : MonoBehaviour { public string Url; //public Text status; WebViewObject webViewObject; public void init(object onCallFromJS, object onCallOnError, object onCallOnStarted, object onCallOnLoaded) { if (webViewObject != null) return; webViewObject = (new GameObject("WebViewObject")).AddComponent(); webViewObject.Init( cb: (msg) => { Debug.Log(string.Format("CallFromJS[{0}]", msg)); //status.text = msg; //status.GetComponent().Play(); Utl.doCallback(onCallFromJS, msg); }, err: (msg) => { Debug.Log(string.Format("CallOnError[{0}]", msg)); //status.text = msg; //status.GetComponent().Play(); Utl.doCallback(onCallOnError, msg); }, started: (msg) => { Debug.Log(string.Format("CallOnStarted[{0}]", msg)); Utl.doCallback(onCallOnStarted, msg); }, ld: (msg) => { Debug.Log(string.Format("CallOnLoaded[{0}]", msg)); Utl.doCallback(onCallOnLoaded, msg); #if UNITY_EDITOR_OSX || !UNITY_ANDROID // NOTE: depending on the situation, you might prefer // the 'iframe' approach. // cf. https://github.com/gree/unity-webview/issues/189 #if true webViewObject.EvaluateJS(@" if (window && window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.unityControl) { window.Unity = { call: function(msg) { window.webkit.messageHandlers.unityControl.postMessage(msg); } } } else { window.Unity = { call: function(msg) { window.location = 'unity:' + msg; } } } "); #else webViewObject.EvaluateJS(@" if (window && window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.unityControl) { window.Unity = { call: function(msg) { window.webkit.messageHandlers.unityControl.postMessage(msg); } } } else { window.Unity = { call: function(msg) { var iframe = document.createElement('IFRAME'); iframe.setAttribute('src', 'unity:' + msg); document.documentElement.appendChild(iframe); iframe.parentNode.removeChild(iframe); iframe = null; } } } "); #endif #endif webViewObject.EvaluateJS(@"Unity.call('ua=' + navigator.userAgent)"); }, //ua: "custom user agent string", enableWKWebView: true); #if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX webViewObject.bitmapRefreshCycle = 1; #endif //webViewObject.SetAlertDialogEnabled(false); webViewObject.SetMargins(5, 100, 5, Screen.height / 4); webViewObject.SetVisibility(true); } public void setVisibility(bool val) { if (webViewObject != null) { webViewObject.SetVisibility(val); } } public void setMargins(int left, int top, int right, int bottom) { if (webViewObject != null) { webViewObject.SetMargins(left, top, right, bottom); } } public float progress { get { if (webViewObject == null) return 0; return webViewObject.Progress(); } } public void loadUrl(string url) { if (webViewObject == null) return; this.Url = url; StartCoroutine(LoadURL()); } IEnumerator LoadURL() { yield return null; #if !UNITY_WEBPLAYER && !UNITY_WEBGL if (Url.StartsWith("http") || Url.StartsWith("file:")) { webViewObject.LoadURL(Uri.EscapeUriString(Url)); } else { var exts = new string[]{ ".jpg", ".js", ".html" // should be last }; foreach (var ext in exts) { //var url = Url.Replace(".html", ext); //var src = System.IO.Path.Combine(Application.streamingAssetsPath, url); #if UNITY_EDITOR var dst = System.IO.Path.Combine(Application.dataPath, Url); #else var dst = System.IO.Path.Combine(Application.persistentDataPath, Url); #endif //byte[] result = null; //if (src.Contains("://")) //{ // for Android // var www = new WWW(src); // yield return www; // result = www.bytes; //} //else //{ // result = System.IO.File.ReadAllBytes(src); //} //System.IO.File.WriteAllBytes(dst, result); if (ext == ".html") { Debug.Log("file://" + Uri.EscapeUriString(dst)); webViewObject.LoadURL("file://" + Uri.EscapeUriString(dst)); break; } } } #else if (Url.StartsWith("http") || Url.StartsWith("file:")) { webViewObject.LoadURL(Uri.EscapeUriString(Url)); } else { webViewObject.LoadURL("StreamingAssets/" + Uri.EscapeUriString(Url)); } webViewObject.EvaluateJS( "parent.$(function() {" + " window.Unity = {" + " call:function(msg) {" + " parent.unityWebView.sendMessage('WebViewObject', msg)" + " }" + " };" + "});"); #endif } public void goBack() { if (webViewObject != null) { webViewObject.GoBack(); } } public void goForward() { if (webViewObject != null) { webViewObject.GoForward(); } } public void destroy() { if (webViewObject != null) { Destroy(webViewObject.gameObject); webViewObject = null; } } /* #if !UNITY_WEBPLAYER && !UNITY_WEBGL void OnGUI() { GUI.enabled = webViewObject.CanGoBack(); if (GUI.Button(new Rect(10, 10, 80, 80), "<")) { webViewObject.GoBack(); } GUI.enabled = true; GUI.enabled = webViewObject.CanGoForward(); if (GUI.Button(new Rect(100, 10, 80, 80), ">")) { webViewObject.GoForward(); } GUI.enabled = true; GUI.TextField(new Rect(200, 10, 300, 80), "" + webViewObject.Progress()); if (GUI.Button(new Rect(600, 10, 80, 80), "*")) { var g = GameObject.Find("WebViewObject"); if (g != null) { Destroy(g); } else { StartCoroutine(Start()); } } GUI.enabled = true; if (GUI.Button(new Rect(700, 10, 80, 80), "c")) { Debug.Log(webViewObject.GetCookies(Url)); } GUI.enabled = true; } #endif */ }