LoginSignup
55
57

More than 5 years have passed since last update.

Unity5でWebviewを使用する メモ

Last updated at Posted at 2015-09-02

■新しいUnityプロジェクトを作る。

■greeの作者さんのGithubから最新を落としてくる、
下記は作者様が更新してくれたリポジトリで、下記で動作確認しました。
作者さん誠にありがとうございます。
https://github.com/gree/unity-webview/tree/39d08af311278693abb8c57129dc1b434b062c25)

■Zipファイルを展開

■Unityエディタ上で Assets → Import Package → Custom Package → 展開したフォルダunity-webview-master → dist → unity-webview.unitypackage

と選択してパッケージをすべて自分のプロジェクトにインポート

■Unityを1度閉じる

■展開したフォルダunity-webview-master → sample → Assets の中身全部を自分のAssetsの下にコピー&ペースト

■Unityを再度開く

Android

そのまま実機でビルドして、AndroidStudioのDeviceMonitorを開き
下記ソースのDebug.Log(string.Format("CallFromJS[{0}]", msg));がLogcatに表示されればOK

●下記のSampleWebView.csはサンプルだが自分で書くソースの場合も 
 webViewObject.Init((msg)=>{コールバック時の処理}); として
 Webviewから返ってきた時の処理を書けばOK

●WebViewObject.csのCallFromJSにJavaからUnitySendMessageでコールバックが返ってきて、
 コールバック登録しておいたメソッドやラムダを callback(message); で呼ぶ

SampleWebView.cs
    IEnumerator Start()
    {
        webViewObject =
            (new GameObject("WebViewObject")).AddComponent<WebViewObject>();
        webViewObject.Init((msg)=>{
            Debug.Log(string.Format("CallFromJS[{0}]", msg));
            status.text = msg;
            status.GetComponent<Animation>().Play();
        });

WebViewObject.cs
    public void CallFromJS(string message)
    {
        Debug.Log ("***CallFromJS***=" + message);
        if (callback != null) {
#if !UNITY_ANDROID
            message = WWW.UnEscapeURL(message);
#endif
            callback(message);
        }
    }

■コールバック元
おそらく

WebViewPlugin.java
    @JavascriptInterface
    public void call(String message)
    {
        UnityPlayer.UnitySendMessage(mGameObject, "CallFromJS", message);
    }

■コールバック登録
おそらく

WebViewObject.cs
    public void Init(Callback cb = null)
    {
        callback = cb;
#if UNITY_EDITOR || UNITY_STANDALONE_OSX
        CreateTexture(0, 0, Screen.width, Screen.height);
        webView = _WebViewPlugin_Init(name, Screen.width, Screen.height,
            Application.platform == RuntimePlatform.OSXEditor);
#elif UNITY_IPHONE
        webView = _WebViewPlugin_Init(name);
#elif UNITY_ANDROID
        webView = new AndroidJavaObject("net.gree.unitywebview.WebViewPlugin");
        webView.Call("Init", name);
#elif UNITY_WEBPLAYER
        Application.ExternalCall("unityWebView.init", name);
#endif
    }

iOS

 iOS側はUnityエディター上で動作確認可能です、AndroidのようにDebug.Logを仕込んで確認できます。

 実機も基本的な部分は同じでWebView.mmからWebViewObject.csがコールされる。

■Unity側も根本的には一緒だが一応書く

●下記のSampleWebView.csはサンプルだが自分で書くソースの場合も
 webViewObject.Init((msg)=>{コールバック時の処理}); として
 Webviewから返ってきた時の処理を書けばOK

●WebViewObject.csのCallFromJSにObjective-cからUnitySendMessageでコールバックが返ってきて、
コールバック登録しておいたメソッドやラムダを callback(message); で呼ぶ

SampleWebView.cs
    IEnumerator Start()
    {
        webViewObject =
            (new GameObject("WebViewObject")).AddComponent<WebViewObject>();
        webViewObject.Init((msg)=>{
            Debug.Log(string.Format("CallFromJS[{0}]", msg));
            status.text = msg;
            status.GetComponent<Animation>().Play();
        });

WebViewObject.cs
    public void CallFromJS(string message)
    {
        Debug.Log ("***CallFromJS***=" + message);
        if (callback != null) {
#if !UNITY_ANDROID
            message = WWW.UnEscapeURL(message);
#endif
            callback(message);
        }
    }

■コールバック先のオブジェクト名をセット

WebView.mm
- (id)initWithGameObjectName:(const char *)gameObjectName_
{
    self = [super init];

    UIView *view = UnityGetGLViewController().view;
    webView = [[UIWebView alloc] initWithFrame:view.frame];
    webView.delegate = self;
    webView.hidden = YES;
    [view addSubview:webView];

    gameObjectName = [NSString stringWithUTF8String:gameObjectName_];

    return self;
}

■コールバック元

WebView.mm
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *url = [[request URL] absoluteString];
    if ([url hasPrefix:@"unity:"]) {
        UnitySendMessage([gameObjectName UTF8String],
            "CallFromJS", [[url substringFromIndex:6] UTF8String]);
        return NO;
    } else {
        return YES;
    }
}

■コールバック登録はAndroidと一緒

■確認環境

●Android
 Unity5.1.0f3
 Nexus7(year2012)
 Android 4.1.2

●iOS
 iOS8.4
 iPhone5S
 Xcode6.4

 
 
 
 
 
 
 
 

過去版

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
■念のため下記残しておくが、下記処理は必要ない、作者様の方ですでに対応済みなのでARCを無効化しなくても動作する。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
 下記で対応済みとの事
 https://github.com/gree/unity-webview/pull/40

 
 
 
 

 実機でビルドしようとするとARCのエラーになるので、
 下図のようにコンパイルフラグ-fno-objc-arcWebView.mmに設定してARCを無効化する必要がある。
 下記の方のページを参考にしました(すげえ助かりました)
 http://qiita.com/tyfkda/items/63d1672b03de36526396
 https://adfurikun.jp/adfurikun/cms/detail/id/54f6dee6c37b62775c000057
 
 ProjectビューでPlugin→iOS→Webview.mmを選択状態にして、InspectorのPlatform SettingのCompile flags-fno-objc-arcをセット

スクリーンショット 2015-09-02 16.26.55.png

 また、自分のところでは
WebView.mmUnitySendMessage([gameObjectName UTF8String],
"CallFromJS", [[url substringFromIndex:6] UTF8String]);
 の時に
 gameObjectNameに正しい値がセットされていなかったので、
 下記のようにgameObjectName = [[NSString alloc]initWithUTF8String:gameObjectName_];に改修

 WebViewObject.csから呼ばれているのでgameObjectNameにはWebViewObjectになり、
 UnitySendMessageWebViewObject"CallFromJS"メソッドに文字列が返される。

 
■コールバック先のオブジェクト名をセット

WebView.mm
- (id)initWithGameObjectName:(const char *)gameObjectName_
{
    self = [super init];

    UIView *view = UnityGetGLViewController().view;
    webView = [[UIWebView alloc] initWithFrame:view.frame];
    webView.delegate = self;
    webView.hidden = YES;
    [view addSubview:webView];

//    gameObjectName = [NSString stringWithUTF8String:gameObjectName_];

    gameObjectName = [[NSString alloc]initWithUTF8String:gameObjectName_];

    return self;
}

■コールバック元

WebView.mm
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSString *url = [[request URL] absoluteString];
    if ([url hasPrefix:@"unity:"]) {
        UnitySendMessage([gameObjectName UTF8String],
            "CallFromJS", [[url substringFromIndex:6] UTF8String]);
        return NO;
    } else {
        return YES;
    }
}

■コールバック登録はAndroidと一緒

55
57
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
57