JavaScript 在 Mac Cocoa 应用程序中向 Objective-C 发送消息

3
我对Objective-C还比较新,所以请不要假设我已经知道一些东西,因为我可能不知道 :).
我有一个面向Mac的Cocoa应用程序(而不是iOS),其中包含了一个Webview。在Webview中,有一个站点作为迷你消息客户端。当收到消息时,我希望JavaScript通知Objective-C已经收到了消息...然后Objective-C将运行一些代码,例如创建一个Growl弹出窗口。
我查看了苹果开发者网站上的 WebView Class Reference,但我不太确定如何正确实现它。
1个回答

4
你需要查找的是“从Javascript调用Objective-C方法”参考文档(参考)。简而言之,你必须显式地将你的Objective-C类暴露给javascript脚本环境。你需要实现WebScripting非正式协议,以便你的自定义对象能够被公开并可供使用。
一旦你想要暴露的对象(例如,“Notification object”)实现了+ (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对象。例如,如果您为noteCenter公开了一个名为“printNotification:”的方法,在Javascript中应该可以这样使用:

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

当然,您可以使用Growl在您的自定义Obj-C对象中显示通知,并实现printNotification。(如果您使用的是Mountain Lion,则新的通知中心也非常棒)。希望这能有所帮助。


谢谢!我在CustomNotificationCenter方面遇到了一些问题,因为我不确定如何实现它。 我将以下内容添加到我的AppDelegate.h中:- (void)webView:(WebView *)webView didClearWindowObject:(WebScriptObject *)windowObject forFrame:(WebFrame *)frame; 然后,我将您的代码添加到AppDelegate.m中,但是它报告了一个“未声明的标识符'note center'”错误。 - Seb123
@SebastianRuiz 噢 - "CustomNotificationCenter" 是我用作示例代码的一个(不存在的)类。在你的情况下,你需要创建你自己的类,并赋予它与 Growl 集成发送通知的功能,然后以我暴露虚拟类“CustomNotificationCenter”的方式将其暴露给 JavaScript。如果您需要帮助,请随时发布另一个问题! - Vervious
我正在使用Mountain Lion ;),所以我应该能够使用内置的通知中心(或者带有Growl的Hiss)。我不太确定如何做你说的事情。特别是集成部分。如果您能发布一个示例,我将非常感激您的帮助!谢谢! - Seb123
@SebastianRuiz 好的 - 你能给我一两天时间吗?谢谢。 - Vervious
是的,这个Web应用程序在我的控制之下。感谢你在这里帮助我 - 我欠你一个人情 ;)。 - Seb123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接