Вызов нативных объективных методов из JavaScript с использованием базовой платформы JavaScript.

Предположим, у меня есть три класса.

  1. Контроллер представления с кнопкой на нем.
  2. Файл JavaScript с некоторыми методами JavaScript.
  3. Объектный класс модели с некоторыми методами вызова веб-сервиса.

Когда я нажимаю кнопку на контроллере представления, он вызывает .js (файл JavaScript), а в ответ .js вызывает методы из класса модели.

Я просто хочу знать, возможно ли использовать базовую структуру JavaScript без использования веб-просмотра.


person vivek_ios    schedule 07.05.2014    source источник


Ответы (1)


Интерфейс Objective-C в структуре JavascriptCore, представленный в iOS 7/OS X 10.9, позволяет вызывать методы Objective-C из Javascript и вызывать функции Javascript из Objective-C. Оба этих сценария могут происходить без участия веб-просмотра. Чтобы получить отличное представление об этих функциях, ознакомьтесь с вводной сессией WWDC 2013 года «Интеграция JavaScript в собственные приложения» в сети разработчиков Apple: https://developer.apple.com/videos/wwdc/2013/?id=615

Ниже приведен простой пример. Вы также можете создавать более сложные примеры, которые напрямую раскрывают существующие методы через протокол JSExport (см. pdf/видео выше).

мой Javascript.js:

function myJavascriptFn(arg) {
    myObjC_callback(arg); // Call Objective C code
}

мой вид.м:

#import <JavaScriptCore/JavaScriptCore.h>

....

javascriptContext  = [[JSContext alloc] init]; // Create a standalone javascript VM and context.

// Load the javascript file into the VM
NSURL *scriptURL = [NSURL URLWithString:@"path/to/myJavascript.js"];
NSError *error = nil;
NSString *script = [NSString stringWithContentsOfURL:scriptURL encoding:NSUTF8StringEncoding error:&error];
[javascriptContext evaluateScript:script];

// Set up calling an Objective-C callback for Javascript to use
javascriptContext[@"myObjC_callback"] = ^(NSString *arg) {
    NSLog(@"Calling someObjectiveCMethod from javascript.  Passed arg is:%@", arg);
    [self someObjectiveCMethod:arg];
}

// Call javascript from Objective C
JSValue *myJavascript_callback = javascriptContext[@"myJavascriptFn"];
[myJavascript_callback callWithArguments:@[@"test arg"]];

Платформа JavascriptCore также обеспечивает встроенное преобразование между распространенными типами Objective-C и типами Javascript. См. мой ответ на Как переводится мост ObjC JS? для более подробной информации.

person Mike    schedule 07.05.2014
comment
Майк, предположим, если у меня есть две или три функции в одном файле myJavascript.js, то как я могу выбрать отдельные функции. Потому что, если мы указываем путь к файлу .js, то весь файл считывается за один раз. Любые предложения, если вы можете предоставить по этому поводу. - person vivek_ios; 12.05.2014
comment
Вы можете включить в файл myJavascript.js столько функций javascript, сколько захотите. После того, как он был загружен и оценен [javascriptContext evaluateScript:script], доступ к отдельным функциям из Objective-C осуществляется JSValue *myFn1 = javascriptContext[@"myFn1"]; [myFn1 callWithArguments:myArrayOfArgs]; и JSValue *myFn2 = javascriptContext[@"myFn2"]; [myFn2 callWithArguments:myArrayOfArgs2];, где ваши функции называются myFn1 и myFn2 в javascript. - person Mike; 13.05.2014