diff --git a/dist/unity-webview.unitypackage b/dist/unity-webview.unitypackage index c25fb56d..cef5f15d 100644 Binary files a/dist/unity-webview.unitypackage and b/dist/unity-webview.unitypackage differ diff --git a/dist/unity-webview.zip b/dist/unity-webview.zip index 1faf3e10..8f1d3877 100644 Binary files a/dist/unity-webview.zip and b/dist/unity-webview.zip differ diff --git a/plugins/Mac/Resources/Info.plist b/plugins/Mac/Resources/Info.plist index 2dc923d6..12f5ec0b 100644 --- a/plugins/Mac/Resources/Info.plist +++ b/plugins/Mac/Resources/Info.plist @@ -9,7 +9,7 @@ CFBundleIconFile CFBundleIdentifier - net.gree.unitywebview.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -22,6 +22,8 @@ ???? CFBundleVersion 1 + LSApplicationCategoryType + NSPrincipalClass diff --git a/plugins/Mac/Sources/WebView.m b/plugins/Mac/Sources/WebView.m index 4785f085..be5cc7ec 100644 --- a/plugins/Mac/Sources/WebView.m +++ b/plugins/Mac/Sources/WebView.m @@ -110,9 +110,11 @@ static void UnitySendMessage( mono_runtime_invoke(monoMethod, 0, args, 0); } -@interface CWebViewPlugin : NSObject +@interface CWebViewPlugin : NSObject { - WebView *webView; + NSWindow *window; + NSWindowController *windowController; + WKWebView *webView; NSString *gameObject; NSString *ua; NSBitmapImageRep *bitmap; @@ -127,19 +129,44 @@ - (id)initWithGameObject:(const char *)gameObject_ transparent:(BOOL)transparent { self = [super init]; monoMethod = 0; - webView = [[WebView alloc] initWithFrame:NSMakeRect(0, 0, width, height)]; - webView.hidden = YES; + + WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; + WKUserContentController *controller = [[WKUserContentController alloc] init]; + WKPreferences *preferences = [[WKPreferences alloc] init]; + preferences.javaScriptEnabled = true; + preferences.plugInsEnabled = true; + [controller addScriptMessageHandler:self name:@"unityControl"]; + configuration.userContentController = controller; + // configuration.preferences = preferences; + NSRect frame = NSMakeRect(0, 0, width / 2, height / 2); + webView = [[WKWebView alloc] initWithFrame:frame + configuration:configuration]; + [[[webView configuration] preferences] setValue:@YES forKey:@"developerExtrasEnabled"]; + webView.UIDelegate = self; + webView.navigationDelegate = self; + webView.hidden = NO; if (transparent) { - [webView setDrawsBackground:NO]; + // [webView setDrawsBackground:NO]; } [webView setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)]; - [webView setFrameLoadDelegate:(id)self]; - [webView setPolicyDelegate:(id)self]; + // [webView setFrameLoadDelegate:(id)self]; + // [webView setPolicyDelegate:(id)self]; + webView.UIDelegate = self; + webView.navigationDelegate = self; gameObject = [[NSString stringWithUTF8String:gameObject_] retain]; if (ua_ != NULL && strcmp(ua_, "") != 0) { ua = [[NSString stringWithUTF8String:ua_] retain]; [webView setCustomUserAgent:ua]; } + + window = [[[NSWindow alloc] initWithContentRect:frame + styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskResizable + backing:NSBackingStoreBuffered + defer:NO] autorelease]; + [window setContentView:webView]; + [window orderFront:NSApp]; + windowController = [[NSWindowController alloc] initWithWindow:window]; + return self; } @@ -147,8 +174,10 @@ - (void)dealloc { @synchronized(self) { if (webView != nil) { - [webView setFrameLoadDelegate:nil]; - [webView setPolicyDelegate:nil]; + // [webView setFrameLoadDelegate:nil]; + // [webView setPolicyDelegate:nil]; + webView.UIDelegate = nil; + webView.navigationDelegate = nil; [webView stopLoading:nil]; [webView release]; webView = nil; @@ -165,10 +194,20 @@ - (void)dealloc [bitmap release]; bitmap = nil; } + if (window != nil) { + [window release]; + window = nil; + } + if (windowController != nil){ + [windowController release]; + windowController = nil; + } } [super dealloc]; } + +/* - (void)webView:(WebView *)sender didFailProvisionalLoadWithError:(NSError *)error forFrame:(WebFrame *)frame { UnitySendMessage([gameObject UTF8String], "CallOnError", [[error description] UTF8String]); @@ -189,14 +228,65 @@ - (void)webView:(WebView *)sender decidePolicyForNavigationAction:(NSDictionary [listener use]; } } +*/ + +- (void)webView:(WKWebView*)wkWebView didCommitNavigation:(null_unspecified WKNavigation *)navigation +{ + UnitySendMessage([gameObject UTF8String], "CallOnLoaded", "Unknown URL"); + +} + +- (void)webView:(WKWebView *)wkWebView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler +{ + if (webView == nil) { + decisionHandler(WKNavigationActionPolicyCancel); + return; + } + NSURL *url = [navigationAction.request URL]; + //if ([url.absoluteString rangeOfString:@"//itunes.apple.com/"].location != NSNotFound) { + // [[UIApplication sharedApplication] openURL:url]; + // decisionHandler(WKNavigationActionPolicyCancel); + //} else + if ([url.absoluteString hasPrefix:@"unity:"]) { + UnitySendMessage([gameObject UTF8String], "CallFromJS", [[url.absoluteString substringFromIndex:6] UTF8String]); + decisionHandler(WKNavigationActionPolicyCancel); + } else if (navigationAction.navigationType == WKNavigationTypeLinkActivated + && (!navigationAction.targetFrame || !navigationAction.targetFrame.isMainFrame)) { + // cf. for target="_blank", cf. http://qiita.com/ShingoFukuyama/items/b3a1441025a36ab7659c + [webView loadRequest:navigationAction.request]; + decisionHandler(WKNavigationActionPolicyCancel); + } else { + decisionHandler(WKNavigationActionPolicyAllow); + } +} + + +- (void)userContentController:(WKUserContentController *)userContentController + didReceiveScriptMessage:(WKScriptMessage *)message { + + // Log out the message received + NSLog(@"Received event %@", message.body); + UnitySendMessage([gameObject UTF8String], "CallFromJS", + [[NSString stringWithFormat:@"%@", message.body] UTF8String]); + + /* + // Then pull something from the device using the message body + NSString *version = [[UIDevice currentDevice] valueForKey:message.body]; + + // Execute some JavaScript using the result? + NSString *exec_template = @"set_headline(\"received: %@\");"; + NSString *exec = [NSString stringWithFormat:exec_template, version]; + [webView evaluateJavaScript:exec completionHandler:nil]; + */ +} - (void)setRect:(int)width height:(int)height { if (webView == nil) return; NSRect frame; - frame.size.width = width; - frame.size.height = height; + frame.size.width = width / 2; + frame.size.height = height / 2; frame.origin.x = 0; frame.origin.y = 0; webView.frame = frame; @@ -210,7 +300,7 @@ - (void)setVisibility:(BOOL)visibility { if (webView == nil) return; - webView.hidden = visibility ? NO : YES; + // webView.hidden = visibility ? NO : YES; } - (void)loadURL:(const char *)url @@ -220,7 +310,13 @@ - (void)loadURL:(const char *)url NSString *urlStr = [NSString stringWithUTF8String:url]; NSURL *nsurl = [NSURL URLWithString:urlStr]; NSURLRequest *request = [NSURLRequest requestWithURL:nsurl]; - [[webView mainFrame] loadRequest:request]; + + if ([nsurl.absoluteString hasPrefix:@"file:"]) { + NSURL *top = [NSURL URLWithString:[[nsurl absoluteString] stringByDeletingLastPathComponent]]; + [webView loadFileURL:nsurl allowingReadAccessToURL:top]; + } else { + [webView loadRequest:request]; + } } - (void)loadHTML:(const char *)html baseURL:(const char *)baseUrl @@ -230,7 +326,7 @@ - (void)loadHTML:(const char *)html baseURL:(const char *)baseUrl NSString *htmlStr = [NSString stringWithUTF8String:html]; NSString *baseStr = [NSString stringWithUTF8String:baseUrl]; NSURL *baseNSUrl = [NSURL URLWithString:baseStr]; - [[webView mainFrame] loadHTMLString:htmlStr baseURL:baseNSUrl]; + [webView loadHTMLString:htmlStr baseURL:baseNSUrl]; } - (void)evaluateJS:(const char *)js @@ -238,7 +334,7 @@ - (void)evaluateJS:(const char *)js if (webView == nil) return; NSString *jsStr = [NSString stringWithUTF8String:js]; - [webView stringByEvaluatingJavaScriptFromString:jsStr]; + [webView evaluateJavaScript:jsStr completionHandler:nil]; } - (BOOL)canGoBack @@ -274,7 +370,7 @@ - (void)update:(int)x y:(int)y deltaY:(float)deltaY buttonDown:(BOOL)buttonDown if (webView == nil) return; - NSView *view = [[[webView mainFrame] frameView] documentView]; + NSView *view = webView; NSGraphicsContext *context = [NSGraphicsContext currentContext]; NSEvent *event; NSString *characters; @@ -320,7 +416,7 @@ - (void)update:(int)x y:(int)y deltaY:(float)deltaY buttonDown:(BOOL)buttonDown CFRelease(cgEvent); [view scrollWheel:scrollEvent]; } - + @synchronized(self) { if (bitmap == nil) bitmap = [[webView bitmapImageRepForCachingDisplayInRect:webView.frame] retain]; diff --git a/plugins/Mac/WebView.bundle.meta b/plugins/Mac/WebView.bundle.meta index 516d3cd6..fc27ebd6 100644 --- a/plugins/Mac/WebView.bundle.meta +++ b/plugins/Mac/WebView.bundle.meta @@ -29,7 +29,7 @@ PluginImporter: settings: CPU: x86_64 OSXIntel: - enabled: 1 + enabled: 0 settings: CPU: AnyCPU OSXIntel64: @@ -37,7 +37,7 @@ PluginImporter: settings: CPU: AnyCPU OSXUniversal: - enabled: 1 + enabled: 0 settings: {} Win: enabled: 0 diff --git a/plugins/Mac/WebView.xcodeproj/project.pbxproj b/plugins/Mac/WebView.xcodeproj/project.pbxproj index ac55345f..07d1ec1b 100644 --- a/plugins/Mac/WebView.xcodeproj/project.pbxproj +++ b/plugins/Mac/WebView.xcodeproj/project.pbxproj @@ -121,7 +121,7 @@ 81E2C1FF14C5684A004CE5C2 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0820; }; buildConfigurationList = 81E2C20214C5684A004CE5C2 /* Build configuration list for PBXProject "WebView" */; compatibilityVersion = "Xcode 3.2"; @@ -183,11 +183,22 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -198,9 +209,12 @@ GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.6; + MACOSX_DEPLOYMENT_TARGET = 10.10; ONLY_ACTIVE_ARCH = YES; OTHER_LDFLAGS = ( "-L/Applications/Unity/Unity.app/Contents/Frameworks/MonoEmbedRuntime/osx", @@ -214,18 +228,31 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.6; + MACOSX_DEPLOYMENT_TARGET = 10.10; OTHER_LDFLAGS = ( "-L/Applications/Unity/Unity.app/Contents/Frameworks/MonoEmbedRuntime/osx", "-lmono.0", @@ -237,13 +264,13 @@ 81E2C21B14C5684A004CE5C2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Resources/Prefix.pch; INFOPLIST_FILE = Resources/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; LD_RUNPATH_SEARCH_PATHS = ""; LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = "net.gree.unitywebview.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = bundle; }; @@ -252,13 +279,13 @@ 81E2C21C14C5684A004CE5C2 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = Resources/Prefix.pch; INFOPLIST_FILE = Resources/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; LD_RUNPATH_SEARCH_PATHS = ""; LIBRARY_SEARCH_PATHS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = "net.gree.unitywebview.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = bundle; }; diff --git a/plugins/Mac/WebView.xcodeproj/xcshareddata/xcschemes/WebView.xcscheme b/plugins/Mac/WebView.xcodeproj/xcshareddata/xcschemes/WebView.xcscheme index 0f50d2d9..6346ef33 100644 --- a/plugins/Mac/WebView.xcodeproj/xcshareddata/xcschemes/WebView.xcscheme +++ b/plugins/Mac/WebView.xcodeproj/xcshareddata/xcschemes/WebView.xcscheme @@ -1,5 +1,6 @@ + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES"> + + + + + + +@interface CWebViewPlugin : NSObject { UIView *webView; NSString *gameObjectName; @@ -123,7 +123,14 @@ - (id)initWithGameObjectName:(const char *)gameObjectName_ transparent:(BOOL)tra UIView *view = UnityGetGLViewController().view; if (enableWKWebView && [WKWebView class]) { - webView = [[WKWebView alloc] initWithFrame:view.frame]; + WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] + init]; + WKUserContentController *controller = [[WKUserContentController alloc] + init]; + [controller addScriptMessageHandler:self name:@"unityControl"]; + configuration.userContentController = controller; + webView = [[WKWebView alloc] initWithFrame:view.frame + configuration:configuration]; webView.UIDelegate = self; webView.navigationDelegate = self; } else { @@ -162,6 +169,25 @@ - (void)dealloc gameObjectName = nil; } +- (void)userContentController:(WKUserContentController *)userContentController + didReceiveScriptMessage:(WKScriptMessage *)message { + + // Log out the message received + NSLog(@"Received event %@", message.body); + UnitySendMessage([gameObjectName UTF8String], "CallFromJS", + [[NSString stringWithFormat:@"%@", message.body] UTF8String]); + + /* + // Then pull something from the device using the message body + NSString *version = [[UIDevice currentDevice] valueForKey:message.body]; + + // Execute some JavaScript using the result? + NSString *exec_template = @"set_headline(\"received: %@\");"; + NSString *exec = [NSString stringWithFormat:exec_template, version]; + [webView evaluateJavaScript:exec completionHandler:nil]; + */ +} + - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change