2012-08-09 2 views
2

저는 객관적으로 C가 매우 새롭기 때문에 아마도 내가 알지 못하기 때문에 물건을 알고 있다고 생각하지 마십시오.Javascript가 Mac 코코아 응용 프로그램의 objective-c에 메시지를 보냅니다.

웹보기가있는 Mac (iOS 아님) 용 코코아 응용 프로그램이 있습니다. webview에는 미니 메시징 클라이언트로 작동하는 사이트가 있습니다. 메시지가 수신되면 자바 스크립트가 objective-c에게 메시지를 수신했음을 알리고 싶습니다 ... objective-c는 growl 팝업과 같은 코드를 실행합니다.

저는 Apple 개발자 웹 사이트에서 WebView Class Reference을 보았습니다. 그러나 올바르게 구현하는 방법은 잘 모르겠습니다.

답변

3

은 무엇 당신이 찾고있는 것은, 그것을 요약, 명시 적으로 자바 스크립트로 목표 - C 클래스를 노출 할 필요가 기본적으로 (reference)

"자바 스크립트에서 오브젝티브 C 메소드 호출"참조 문서입니다 환경. WebScripting 비공식 프로토콜은 사용자 정의 개체가이 작업을 수행 할 수 있도록 노출되도록 구현하려는 프로토콜입니다.

자바 스크립트에 노출하려는 객체 (예 : "알림 객체")가 + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector;+ (BOOL)isKeyExcludedFromWebScript:(const char *)name;을 구현하면 이제 웹 뷰의 컨트롤러/위임자가 객체를 자바 스크립트에서 사용할 수있게합니다.

당신의 웹보기 인스턴스의 프레임로드 위임에서 예를 들어

:

- (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"]; 
} 

을 그리고 정확하게 모든 일을 한 경우, 당신은 자바 스크립트에 목표 - C 객체를 사용할 수 있어야합니다. 당신이 노출 한 경우 예를 들어, 방법은 "printNotification :"이름 :

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

을 그리고 물론 당신은 당신의 정의를 Obj-C 객체의 통지를 보여 으르렁을 사용하여 noteCenter하기 위해, 자바 스크립트에서이 작업을해야합니다 printNotification의 구현입니다. (Mountain Lion에 가입 한 경우 새로운 알림 센터도 훌륭합니다.) 희망이 도움이됩니다.

+0

감사합니다. CustomNotificationCenter *에는 몇 가지 문제가 있습니다. 구현 방법을 잘 모르기 때문입니다. 내 AppDelegate.h에 추가 : - (void) webView : (WebView *) webView didClearWindowObject : (WebScriptObject *) windowObject forFrame : (WebFrame *) frame; AppDelegate.m에 코드를 추가했으나 선언되지 않은 식별자 '노트 센터'를 사용하는 오류가 발생합니다. * – Seb123

+0

@SebastianRuiz Oh - "CustomNotificationCenter"는 예제 용으로 사용 된 (존재하지 않는) 클래스입니다. 암호. 귀하의 경우에는 * 자신의 * 클래스를 생성하고, Growl과 통합하여 통지를 보내고, 그런 다음 내가 위장 클래스 "CustomNotificationCenter"를 노출 한 것과 같은 방식으로 Javascript에 노출시키는 기능을 제공하십시오. 도움이 필요하면 자유롭게 다른 질문을 게시하십시오! – Vervious

+0

마운틴 라이온을 운영하고 있습니다.) 따라서 내장 된 알림 센터 (또는 허슬러기와 히스)를 사용할 수 있어야합니다. 나는 네가 한 말을 어떻게하는지 잘 모르겠다. 특히 통합. 예를 게시 할 수 있다면 그것을 좋아할 것입니다. 당신의 도움을 주셔서 대단히 감사합니다! – Seb123

관련 문제