■新しい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); で呼ぶ
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();
});
public void CallFromJS(string message)
{
Debug.Log ("***CallFromJS***=" + message);
if (callback != null) {
# if !UNITY_ANDROID
message = WWW.UnEscapeURL(message);
# endif
callback(message);
}
}
■コールバック元
おそらく
@JavascriptInterface
public void call(String message)
{
UnityPlayer.UnitySendMessage(mGameObject, "CallFromJS", message);
}
■コールバック登録
おそらく
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); で呼ぶ
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();
});
public void CallFromJS(string message)
{
Debug.Log ("***CallFromJS***=" + message);
if (callback != null) {
# if !UNITY_ANDROID
message = WWW.UnEscapeURL(message);
# endif
callback(message);
}
}
■コールバック先のオブジェクト名をセット
- (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;
}
■コールバック元
- (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**をセット
また、自分のところでは
WebView.mmのUnitySendMessage([gameObjectName UTF8String],
"CallFromJS", [[url substringFromIndex:6] UTF8String]); の時に
gameObjectNameに正しい値がセットされていなかったので、
下記のように**gameObjectName = [[NSString alloc]initWithUTF8String:gameObjectName_];**に改修
WebViewObject.csから呼ばれているのでgameObjectNameにはWebViewObjectになり、
UnitySendMessageでWebViewObjectの**"CallFromJS"**メソッドに文字列が返される。
■コールバック先のオブジェクト名をセット
- (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;
}
■コールバック元
- (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と一緒