【问题标题】:Can you call a javascript function from native code (not in a callback) using PhoneGap and iOS?您可以使用 PhoneGap 和 iOS 从本机代码(不在回调中)调用 javascript 函数吗?
【发布时间】:2011-10-10 23:39:24
【问题描述】:

我希望能够将 PhoneGap 用于我的应用程序。我将不得不构建一个自定义协议/插件,以便我可以从 Javascript 调用本机方法。我知道当本机代码返回时,您可以在 Javascript 中调用成功函数。

我需要做的是从本机代码调用一个 javascript 函数。基本上,该应用程序将通过本地网络连接到 OSX 配套应用程序,当 OSX 应用程序将数据发送到 iOS 应用程序时,它会以 Objective C 方法进行处理,我需要能够将结果发送到 PhoneGap/javascript 并做一些事情在 WebView 中使用它。

这可能吗?我只能找到有关从 javascript 调用 native 的信息,而不是相反。

谢谢, 托马斯

在此处使用以下答案中的代码:

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');"];

【问题讨论】:

    标签: javascript objective-c events cordova cocoaasyncsocket


    【解决方案1】:

    您可以使用 UIWebView 从本机代码轻松调用 JavaScript:

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

    在某处使用函数的结果作为 JS 函数的 arg:

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

    【讨论】:

    • 太棒了,这应该对我有用。我什至没有想过要使用 UIWebView 类,我猜我太专注于 PhoneGap API。非常感谢!
    • 感谢您的更新。那可能是我的下一个问题。
    • 这个只能在某些地方使用吗?我正在尝试在 AsyncSockets didConnectToHost 内的 PhoneGap 插件文件“MyPhoneGapPlugin.m”中使用它,这样我就可以提醒 web 视图它已成功连接并显示 IP,但它会引发错误,请参阅更新代码的问题和错误。
    • 嗯。好吧,这意味着theWebView 在该函数内部是不可见的。您需要能够从MyPhoneGapPlugin.m 看到@property UIWebView *theWebViewUIWebView *theWebView。您可能已经尝试过确保这一点,但是..除此之外,我真的不知道为什么它不起作用。
    • 剪切 n 贴,注意区分大小写:stringByEvaluatingJavaScriptFromString NOT stringByEvaluatingJavascriptFromString
    【解决方案2】:

    找到了PhoneGap帮助器来完成这个......使用以下方法将javascript写入webView:

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

    【讨论】:

    • 您能否详细说明您的答案。我有同样的问题,并且是 Cordova 的新手。我从 MainViewController 和我的 Phonegap 插件调用它,它在 webview 中没有响应。他们是我缺少的东西吗?
    • @bhuwansahni 恐怕科尔多瓦在我这样做之后可能已经发生了很大变化,所以我不太确定现在需要什么。我可以从我的应用程序中的任何方法中调用它 - 也许查看文档上的这篇文章以获取更多信息: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];
      

      【讨论】:

      • 不幸的是,这是特定于 OSX 的,并且 OP 正在使用 PhoneGap 和 iOS。
      • 是的,我需要在 iOS 应用而不是 Mac OSX 配套应用上使用此功能。不过谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 2013-06-09
      相关资源
      最近更新 更多