Можете ли вы вызвать функцию javascript из собственного кода (не в обратном вызове) с помощью PhoneGap и iOS?

Я надеюсь, что смогу использовать PhoneGap для своего приложения. Мне нужно будет создать собственный протокол/плагин, чтобы я мог вызывать собственные методы из Javascript. Я знаю, что вы можете вызвать функцию успеха в Javascript, когда родной код вернется.

Что мне нужно сделать, так это вызвать функцию javascript из собственного кода. В основном приложение будет подключаться к сопутствующему приложению OSX по локальной сети, и когда приложение OSX отправляет данные в приложение iOS, оно обрабатывается методом Objective C, мне нужно иметь возможность отправить результат в PhoneGap/javascript и что-то сделать с ним в WebView.

Это возможно? Мне удалось найти только информацию о вызове нативного из javascript, а не наоборот.

Спасибо, Томас

Используя код из ответа ниже здесь:

MyPhoneGapPlugin.m

- (void)onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {
    NSLog(@"Connected To %@:%i.", host, port);

    NSString* jsString = [NSString stringWithFormat:@"alert(connected to: %@);", host];
    [theWebView stringByEvaluatingJavaScriptFromString:jsString];

    [self readWithTag:2];
}

Давая мне сообщение об ошибке «Неизвестный получатель» theWebView, вы имели в виду «UIWebView»?

ОБНОВЛЕНИЕ: нашел ответ: с помощью помощника телефонной связи я могу написать что-то вроде этого...

    [super writeJavascript:@"alert('connected');"];

person tsdexter    schedule 10.10.2011    source источник


Ответы (4)


Вы можете легко вызвать JavaScript из нативного кода с помощью UIWebView:

[webView stringByEvaluatingJavaScriptFromString:@"myJSFunction()"];

Чтобы использовать результат функции где-то в качестве аргумента функции JS:

NSString *stringData = getStringData(); // however you get it
[webView stringByEvaluatingJavaScriptFromString:
 [NSString stringWithFormat:@"myJSFunction(%@)", stringData]];
person Community    schedule 10.10.2011
comment
Круто, это должно сработать для меня. Я даже не думал использовать класс UIWebView, я думаю, я был слишком сосредоточен на API PhoneGap. Большое спасибо! - person tsdexter; 11.10.2011
comment
Спасибо за обновления. Наверное, это был бы мой следующий вопрос. - person tsdexter; 11.10.2011
comment
Это можно использовать только в определенных местах? Я пытаюсь использовать его в файле плагина PhoneGap «MyPhoneGapPlugin.m» внутри AsyncSockets didConnectToHost, поэтому я могу предупредить веб-просмотр об успешном подключении и отобразить IP-адрес, но он выдает ошибку, см. вопрос для обновленного кода и ошибка. - person tsdexter; 12.10.2011
comment
Хм. Что ж, это будет означать, что theWebView не виден внутри этой функции. Вы должны иметь возможность видеть @property UIWebView *theWebView или UIWebView *theWebView из MyPhoneGapPlugin.m. Вы, вероятно, уже пытались убедиться в этом, но... кроме этого, я действительно не знаю, почему это не сработает. - person ; 13.10.2011
comment
Спасибо, я сообщу о результатах, но я, вероятно, нашел лучший способ решить эту конкретную проблему. Хотя, скорее всего, этот метод мне еще понадобится для других задач проекта. - person tsdexter; 14.10.2011
comment
Найден лучший/подходящий способ сделать это. У PhoneGap есть помощник writeJavascript... См. обновленный вопрос. Спасибо за помощь. - person tsdexter; 25.10.2011
comment
Cut n pasters, следите за чувствительностью к регистру: stringByEvaluatingJavaScriptFromString NOT stringByEvaluatingJavascriptFromString - person dijipiji; 05.10.2012
comment
@Lemonsanver Обновлено имя функции. Извините, в то время вылетело из головы. - person ; 06.10.2012
comment
@JoshKethepalli Пожалуйста, не задавайте подобные вопросы в комментариях под другими вопросами. Если у вас возникли проблемы с этим, задайте отдельный вопрос. - person ; 18.03.2015

Нашел помощник PhoneGap для этого... Напишите javascript в webView, используя:

    [super writeJavascript:@"alert('it works');"];
person tsdexter    schedule 24.10.2011
comment
Не могли бы вы уточнить свой ответ. У меня такая же проблема, и я новичок в Кордове. Я вызвал его из MainViewController, а также из моего плагина Phonegap, он не ответил в веб-просмотре. Это что-то, что мне не хватает? - person bhuwansahni; 17.07.2013
comment
@bhuwansahni Боюсь, кордова сильно изменилась с тех пор, как я это сделал, поэтому я не совсем уверен, что теперь потребуется. Я смог вызвать его точно так же из любых методов в своем приложении - возможно, ознакомьтесь с этой статьей в документации для получения дополнительной информации: docs.phonegap.com/en/2.0.0/ - person tsdexter; 18.07.2013

Вы должны попробовать это,

[webView stringByEvaluatingJavaScriptFromString:@"sendSelectedDate()"];
person master    schedule 13.09.2012

Будет ли это работать для вас?

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DisplayWebContent/Tasks/JavaScriptFromObjC.html

Взято с этой страницы:

Вы также можете вызывать функции JavaScript с аргументами. Предположим, вы написали функцию JavaScript, которая выглядит следующим образом:

function addImage(image, width, height) { ... }

Его цель — добавить изображение на веб-страницу. Он вызывается с тремя аргументами: изображение, URL-адрес изображения; ширина, ширина экрана изображения; и height, высота экрана изображения. Вы можете вызвать этот метод одним из двух способов из Objective-C. Первый создает массив аргументов до использования моста WebScriptObject:

id win = [webView windowScriptObject];



NSArray *args = [NSArray arrayWithObjects:
                 @"sample_graphic.jpg",
                 [NSNumber numberWithInt:320],
                 [NSNumber numberWithInt:240],
                  nil];

[win callWebScriptMethod:@"addImage"
            withArguments:args];
person Jason Sperske    schedule 10.10.2011
comment
К сожалению, это специфично для OSX, а OP использует PhoneGap и iOS. - person ; 11.10.2011
comment
Да, мне нужна эта возможность в приложении для iOS, а не в сопутствующем приложении для Mac OSX. Однако, спасибо. - person tsdexter; 11.10.2011