Javascript OS X上的WebKit:如何在WebView中检测对pushState()的JS调用?

Javascript OS X上的WebKit:如何在WebView中检测对pushState()的JS调用?,javascript,objective-c,macos,cocoa,webkit,Javascript,Objective C,Macos,Cocoa,Webkit,假设我有一个MacOSX应用程序,它链接到WebKit并使用WebView显示web内容 如果此webview中的JavaScript调用window.history.pushState()方法,我如何在Objective-C中检测到这一点 理想情况下,我正在寻找类似ObjC委托回调的东西,它通知我的应用程序:“pushState()是用以下参数调用的:XXX”。 注意:我真的在寻找ObjC中的解决方案。假设我不愿意在页面上乱动JS,替换JS中的pushState()方法。我在WebKit源代

假设我有一个MacOSX应用程序,它链接到WebKit并使用WebView显示web内容

如果此webview中的JavaScript调用
window.history.pushState()
方法,我如何在Objective-C中检测到这一点

理想情况下,我正在寻找类似ObjC委托回调的东西,它通知我的应用程序:“pushState()是用以下参数调用的:XXX”。



注意:我真的在寻找ObjC中的解决方案。假设我不愿意在页面上乱动JS,替换JS中的
pushState()
方法。

我在WebKit源代码树中找到了这些私有API。这正是我想要的,只是它们是私有的,这可能会给我的特定用例带来问题

@interface NSObject (WebFrameLoadDelegatePrivate)
...
- (void)webView:(WebView *)wv didPushStateWithinPageForFrame:(WebFrame *)frame ;
- (void)webView:(WebView *)wv didReplaceStateWithinPageForFrame:(WebFrame *)frame;
- (void)webView:(WebView *)wv didPopStateWithinPageForFrame:(WebFrame *)frame;
@end

就我所知,使用ObjC中的pushState方法混日子可以接受吗?在这种情况下,您可以使用WebView API从ObjC提供您自己的自定义pushState。我认为这是不可接受的。由于这是一种
window.history
方法,这意味着我必须对WebKit内部进行重大修改。我的应用程序仅链接到WebKit。在这种情况下,仅为该功能绑定自定义版本的WebKit是不可接受的。或者,我想我可以提供一个替换的
window.history
实现,而无需在我的应用程序中绑定自定义WebKit。但是,让我们再次假设这是不可接受的,因为我觉得这是个坏主意/不值得为此功能付出努力。我认为您可以在ObjC中获取历史WebScript对象,只需使用类似于[historyObject setValue:customCallable forKey:@“pushState”的东西单独更改pushState即可.但是我同意,可能有一种方法可以做到这一点,而不需要所有这些--我只需要看看pushState实现,看看它在内部调用了什么。我怀疑它有URL请求之类的。具体来说,webView:decisepolicyfornavigationaction:request:frame:decisionListener:可能被称为一般来说,苹果似乎忽视了WebKit中私有api的使用,至少在我的经验中是这样。也许是因为源代码是开放的?