【发布时间】:2018-05-01 23:57:54
【问题描述】:
所以我试图在某些客户端代码生成后从浏览器窗口取回一个值。
这是我所拥有的:
class WebBrowserViewController: KINWebBrowserViewController, NavigationProtocol, KINWebBrowserDelegate, WKScriptMessageHandler {
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
let contentController = WKUserContentController();
contentController.add(
self,
name: "callbackHandler"
)
...
func userContentController(_ userContentController: WKUserContentController!, didReceive message: WKScriptMessage) {
print("Debug message got here")
if(message.name == "callbackHandler") {
print("JavaScript is sending a message \(message.body)")
}
}
现在我 100% 确定这不是我需要的全部代码。
将其用作example,在我看来我需要以某种方式将此配置添加到我的浏览器:
self.webView = WKWebView(frame: webFrame, configuration: config)
这里最大的问题是这是针对直接 WkWebView 的,而我正在使用的项目是使用 KinWebBrowser。与其从头开始一个全新的实现,似乎有一种方法可以扩展 KinWebBrowser,但我还不完全熟悉 Swift 语法或 Objective-C,而且 KinWebBrowser 似乎是用 Objective-C 编写的。
我认为 KinWebBrowser 的相关接口定义如下:
@interface KINWebBrowserViewController : UIViewController <WKNavigationDelegate, WKUIDelegate, UIWebViewDelegate>
#pragma mark - Public Properties
@property (nonatomic, weak) id <KINWebBrowserDelegate> delegate;
// The main and only UIProgressView
@property (nonatomic, strong) UIProgressView *progressView;
// The web views
// Depending on the version of iOS, one of these will be set
@property (nonatomic, strong) WKWebView *wkWebView;
@property (nonatomic, strong) UIWebView *uiWebView;
- (id)initWithConfiguration:(WKWebViewConfiguration *)configuration NS_AVAILABLE_IOS(8_0);
#pragma mark - Static Initializers
/*
Initialize a basic KINWebBrowserViewController instance for push onto navigation stack
Ideal for use with UINavigationController pushViewController:animated: or initWithRootViewController:
Optionally specify KINWebBrowser options or WKWebConfiguration
*/
+ (KINWebBrowserViewController *)webBrowser;
+ (KINWebBrowserViewController *)webBrowserWithConfiguration:(WKWebViewConfiguration *)configuration NS_AVAILABLE_IOS(8_0);
那么我该如何扩展 KinWebBrowser,以便在调用此脚本时:
window.webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");
我会得到我传递给.postMessage的任何东西?
我的最终目标是在 Web 浏览器窗口中生成字符串或其他数据后,将其从 Web 获取到我的 iOS 应用程序中。
【问题讨论】:
-
据我了解,当您从本机端执行某些操作时,您希望通过调用
window.webkit.messageHandlers.callbackHandler.postMessage("Hello from JavaScript");从 webView 获取数据。对吗? -
是的,正确,我想从原生端获取信息返回到应用程序
-
您将在哪里触发操作以获取信息?单击 webView 上的按钮或从应用程序执行操作?
-
这将作为登录或初始化过程的一部分发生。虽然不是超级相关。
-
很难说出您的要求。能详细解释一下吗?
标签: javascript ios objective-c swift wkwebview