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

#javascript #objective-c #events #cordova #cocoaasyncsocket

#javascript #objective-c #Мероприятия #кордова #cocoaasyncsocket

Вопрос:

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

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

Возможно ли это? Я смог найти информацию только о вызове native из 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»?

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

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

Ответ №1:

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

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

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

 NSString *stringData = getStringData(); // however you get it
[webView stringByEvaluatingJavaScriptFromString:
 [NSString stringWithFormat:@"myJSFunction(%@)", stringData]];
  

Комментарии:

1. Потрясающе, это должно сработать для меня. Я даже не думал использовать класс UIWebView, я был слишком сосредоточен на PhoneGap API, я думаю. Большое спасибо!

2. Спасибо за обновление. Вероятно, это был бы мой следующий вопрос.

3. Можно ли использовать это только в определенных местах? Я пытаюсь использовать ее в файле плагина PhoneGap ‘MyPhoneGapPlugin.m’ внутри AsyncSockets didConnectToHost, чтобы я мог уведомить webview об успешном подключении и отобразить IP-адрес, но он выдает ошибку, пожалуйста, смотрите Вопрос об обновленном коде и ошибке.

4. Хм. Ну, это означало бы, что theWebView это не видно изнутри этой функции. Вы должны иметь возможность видеть @property UIWebView *theWebView или UIWebView *theWebView из MyPhoneGapPlugin.m . Вы, вероятно, уже пытались убедиться в этом, но … кроме того, я действительно не знаю, почему это не сработает.

5. Вырезайте n вставок, следите за чувствительностью к регистру: stringByEvaluatingJavaScriptFromString НЕ stringByEvaluatingJavaScriptFromString

Ответ №2:

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

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

Комментарии:

1. Не могли бы вы уточнить свой ответ. У меня такая же проблема, и я новичок в Cordova. Я вызвал его из MainViewController, а также из моего плагина Phonegap, он не ответил в webview. Это то, чего мне не хватает?

2. @bhuwansahni Я боюсь, что cordova, возможно, сильно изменилась с тех пор, как я это сделал, поэтому я не совсем уверен, что потребуется сейчас. Я смог вызвать ее точно так же из любых методов в моем приложении — возможно, ознакомьтесь с этой статьей в документах для получения дополнительной информации: docs.phonegap.com/en/2.0.0 /…

Ответ №3:

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

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

Ответ №4:

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

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

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

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

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

Его цель — добавить изображение на веб-страницу. Он вызывается с тремя аргументами: image — URL-адрес изображения; width — ширина экрана изображения; и 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];
  

Комментарии:

1. К сожалению, это зависит от OSX, и операционная система использует PhoneGap и iOS.

2. Да, мне нужна эта возможность в приложении iOS, а не в сопутствующем приложении Mac OSX. Тем не менее, спасибо.