كيفية استدعاء طريقة Objective-C من Javascript في تطبيق Cocoa/WebKit؟

StackOverflow https://stackoverflow.com/questions/92471

سؤال

لدي تطبيق Cocoa يستخدم WebView لعرض واجهة HTML.كيف يمكنني استدعاء طريقة Objective-C من وظيفة Javascript داخل واجهة HTML؟

هل كانت مفيدة؟

المحلول

تم توثيق ذلك في Developer.apple.com.

نصائح أخرى

إذا كنت تريد القيام بذلك في تطبيقات iPhone، فستحتاج إلى القيام بخدعة باستخدام طريقة UIWebViewDelegate يجب أن تبدأ تحميلها مع طلب:

هذه واجهة برمجة التطبيقات http://code.google.com/p/jsbridge-to-cocoa/ يفعل ذلك لك.انها خفيفة الوزن للغاية.

نظرًا لكونها صديقة للبيئة إلى حد ما، فإن وثائق Apple غير قابلة للاستخدام إلى حد كبير بالنسبة لي، لذلك قدمت إثباتًا لمفهوم استدعاء أساليب Objective C من جافا سكريبت والعكس في Cocoa، على الرغم من أن الأخير كان أسهل بكثير.

تأكد أولاً من أن لديك عرض الويب الخاص بك باعتباره setFrameLoadDelegate:

[testWinWebView setFrameLoadDelegate:self];

يجب عليك إخبار عرض الويب بمراقبة كائن معين بمجرد تحميله:

- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame {
    //add the controller to the script environment
    //the "ObjCConnector" object will now be available to JavaScript
    [windowScriptObject setValue:self forKey:@"ObjCConnector"];
}

ثم أعمال الاتصالات:

// a few methods to log activity
- (void)acceptJavaScriptFunctionOne:(NSString*) logText {
    NSLog(@"acceptJavaScriptFunctionOne: %@",logText);
}
- (void)acceptJavaScriptFunctionTwo:(NSString*) logText {
    NSLog(@"acceptJavaScriptFunctionTwo: %@",logText);
}

//this returns a nice name for the method in the JavaScript environment
+(NSString*)webScriptNameForSelector:(SEL)sel {
    NSLog(@"%@ received %@ with sel='%@'", self, NSStringFromSelector(_cmd), NSStringFromSelector(sel));
    if(sel == @selector(acceptJavaScriptFunctionOne:))
        return @"functionOne"; // this is what you're sending in from JS to map to above line
    if(sel == @selector(acceptJavaScriptFunctionTwo:))
        return @"functionTwo"; // this is what you're sending in from JS to map to above line
    return nil;
}

//this allows JavaScript to call the -logJavaScriptString: method
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {
    NSLog(@"isSelectorExcludedFromWebScript: %@", NSStringFromSelector(sel));
    if(sel == @selector(acceptJavaScriptFunctionOne:) ||
       sel == @selector(acceptJavaScriptFunctionTwo:))
        return NO;
    return YES;
}

المفتاح هو أنه إذا كان لديك طرق متعددة ترغب في الاتصال بها، فستحتاج إلى استبعادها جميعًا في طريقة isSelectorExcludedFromWebScript، وتحتاج إلى استدعاء جافا سكريبت لتعيين طريقة ObjC في webScriptNameForSelector.

إثبات المشروع الكامل لملف المفهوم:https://github.com/bytestudios/JS-function-and-ObjC-method-connector

لدي حل باستخدام NimbleKit.يمكنه استدعاء وظائف Objective C من Javascript.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top