3

我对 Objective-C 还很陌生,所以请不要以为我知道一些东西,因为我可能不会:)。

我有一个带有 webview 的 Mac(不是 iOS)可可应用程序。在 web 视图中,有一个充当迷你消息传递客户端的站点。当收到一条消息时,我希望 javascript 通知 Objective-c 已收到一条消息......然后 Objective-c 将运行一些代码,例如创建一个咆哮弹出窗口。

我在 Apple Developer 网站上查看了WebView 类参考,但是我不太确定如何正确实现它。

4

1 回答 1

4

您正在寻找的是参考文档“Calling Objective-C Methods From Javascript”(参考

基本上,总而言之,您必须将您的 Objective-C 类显式地暴露给 javascript 脚本环境。非正式协议是您想要实现的WebScripting协议,以使您的自定义对象能够做到这一点。

一旦您想要向 javascript 公开的对象(例如您的“通知对象”)实现+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector;,并且+ (BOOL)isKeyExcludedFromWebScript:(const char *)name;您的 webview 的控制器/委托现在应该使该对象可用于 javascript。

例如,在webView 实例的Frame Load Delegate中:

- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowObject forFrame:(WebFrame *)frame {
     // Create the Obj-C object you want JS to be able to access
     CustomNotificationCenter *noteCenter = [CustomNotificationCenter sharedNotificationCenter];
     // Get the script object that corresponds to "window" in JS
     id win = [sender windowScriptObject];
     // Add our noteCenter as a property of "window" called "customNotifications"
     [win setValue:noteCenter forKey:@"customNotifications"];
}

如果你做的一切都正确,你应该能够在 Javascript 中使用你的 Objective-C 对象。例如,如果您为您的 公开了一个名为“printNotification:”的方法noteCenter,那么在 Javascript 中这应该可以工作:

function messageReceived(messageText) {
     window.customNotifications.printNotification_("Notification!" + messageText);
}

当然,您将使用 Growl 在您的自定义 Obj-C 对象中显示通知以及printNotification. (如果您在 Mountain Lion 上,新的通知中心也很棒)。希望有帮助。

于 2012-08-09T17:04:04.053 回答