Unity5でWebviewを使用する　メモ

■新しい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-arc**を**WebView.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](https://qiita-image-store.s3.amazonaws.com/0/17904/4c3ee240-cd92-937d-f358-389c541e41b7.png)


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

　**WebViewObject.cs**から呼ばれているので**gameObjectName**には**WebViewObject**になり、
　**UnitySendMessage**で**WebViewObject**の**"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と一緒