Как вызвать метод Objective-C из Javascript в приложении Cocoa / WebKit?

У меня есть приложение Какао, которое использует WebView для отображения интерфейса HTML. Как мне вызвать метод Objective-C из функции Javascript в интерфейсе HTML?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
12
0
11 288
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Это задокументировано в developer.apple.com.

Спасибо, как-то пропустил это в поисках Google :)

georgebrock 18.09.2008 17:25

Тем, кто ищет справку по iOS, обратите внимание, что приведенный выше ответ предназначен только для Mac.

zekel 23.03.2012 21:46

Обратите внимание, что ссылка изменилась, поэтому этот ответ, содержащий только ссылку, больше бесполезен.

Steven Fisher 11.08.2012 01:06

Ссылка указывает на «Использование JavaScript из Objective-C», вопрос не в этом. На этой странице показано, как вызывать методы obj-C из JavaScript: developer.apple.com/library/mac/#documentation/…

auco 15.04.2013 01:09

хороший пример, включающий большинство сценариев использования: CallJS - developer.apple.com/library/mac/samplecode/CallJS/Introducti‌ on /…

PetrV 24.09.2015 16:30

У меня есть решение, использующее NimbleKit. Он может вызывать функции Objective C из Javascript.

как очень приятно для вас, как насчет того, чтобы поделиться этим?

Jonathan 09.02.2013 03:04

Если вы хотите сделать это в приложениях для iPhone, вам нужно будет проделать трюк с методом UIWebViewDelegate shouldStartLoadWithRequest:

Этот API http://code.google.com/p/jsbridge-to-cocoa/ сделает это за вас. Он очень легкий.

Документация Apple, будучи довольно зеленой, для меня совершенно непригодна, поэтому я доказал концепцию вызова методов Objective C из javascript и наоборот в Какао, хотя последнее было намного проще.

Сначала убедитесь, что у вас есть веб-просмотр как 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, и вам нужен вызов javascript для сопоставления с методом ObjC в webScriptNameForSelector.

Полный файл подтверждения концепции проекта: https://github.com/bytestudios/JS-function-and-ObjC-method-connector

Спасибо за полезную информацию. Этот ответ мне очень помогает !!

Tommy 21.02.2017 22:17

Другие вопросы по теме