【问题标题】:Cordova 4.4.0 call iOS Objective-C native method not workingCordova 4.4.0 调用 iOS Objective-C 本机方法不起作用
【发布时间】:2018-01-08 15:23:28
【问题描述】:

更新: 现在,JavaScript 能够在事件“deviceReady”之后调用我的 Objective C 插件代码。 但 它仅在我将应用程序推送到后台时才有效,否则,它只会挂在那里并且从不调用我的插件代码。 我可以看到控制台显示插件何时被调用

[29277:15212897] THREAD WARNING: ['HybridBridge'] took '9252.614014' ms. Plugin should use a background thread.

我了解警告“'9252.614014' ms”是由我将应用程序推到后台的手动操作引起的

但是为什么???为什么我的 Objective C 插件代码只有在应用进入后台时才会被调用?


我正在为基于 C 的 iOS 应用程序创建一个 Cordova 4.4.0 插件 JavaScript 成功触发,但是,javascript 代码:

cordova.exec(saySuccess, sayFailure, PLUGIN_NAME, METHOD_NAME, [page]);

它不会触发我的 Objective C 代码

Objective C 方法根本没有被调用

插件已在config.xml中注册如下

    <feature name="HybridBridge">
        <param name="ios-package" value="HybridBridge"/>
        <param name="onload" value="true" />
    </feature>

下面是我的代码,请帮忙

调用Objective C方法的JavaScript代码:

var hybridBridge = (function() {

    var PLUGIN_NAME = "HybridBridge";
    var METHOD_NAME = "loadExternalPage";

    this.loadExternalPage = function (page) {
        cordova.exec(saySuccess, sayFailure, PLUGIN_NAME, METHOD_NAME, [page]);
    };
    return this;
}());
function saySuccess() {
    alert("Success");
}

function sayFailure () {
    alert ("Failure");
}

Config.xml 文件:

<widget>
    <!-- Whitelist docs: https://github.com/apache/cordova-plugin-whitelist -->
    <access origin="*" />
    <!-- Grant certain URLs the ability to launch external applications. This
         behaviour is set to match that of Cordova versions before 3.6.0, and
         should be reviewed before launching an application in production. It
         may be changed in the future. -->
    <allow-intent href="http://*/*" />
    <allow-intent href="https://*/*" />
    <allow-intent href="tel:*" />
    <allow-intent href="sms:*" />
    <allow-intent href="mailto:*" />
    <allow-intent href="geo:*" />
    <allow-intent href="itms:*" />
    <allow-intent href="itms-apps:*" />

    <!-- Preferences for iOS -->
    <preference name="AllowInlineMediaPlayback" value="false" />
    <preference name="BackupWebStorage" value="cloud" />
    <preference name="DisallowOverscroll" value="false" />
    <preference name="EnableViewportScale" value="false" />
    <preference name="KeyboardDisplayRequiresUserAction" value="true" />
    <preference name="MediaPlaybackRequiresUserAction" value="false" />
    <preference name="SuppressesIncrementalRendering" value="false" />
    <preference name="SuppressesLongPressGesture" value="false" />
    <preference name="Suppresses3DTouchGesture" value="false" />
    <preference name="GapBetweenPages" value="0" />
    <preference name="PageLength" value="0" />
    <preference name="PaginationBreakingMode" value="page" /> <!-- page, column -->
    <preference name="PaginationMode" value="unpaginated" /> <!-- unpaginated, leftToRight, topToBottom, bottomToTop, rightToLeft -->

    <feature name="LocalStorage">
        <param name="ios-package" value="CDVLocalStorage"/>
    </feature>
    <feature name="HandleOpenUrl">
        <param name="ios-package" value="CDVHandleOpenURL"/>
        <param name="onload" value="true"/>
    </feature>
    <feature name="IntentAndNavigationFilter">
        <param name="ios-package" value="CDVIntentAndNavigationFilter"/>
        <param name="onload" value="true"/>
    </feature>
    <feature name="GestureHandler">
        <param name="ios-package" value="CDVGestureHandler"/>
        <param name="onload" value="true"/>
    </feature>
    <feature name="HybridBridge">
        <param name="ios-package" value="HybridBridge"/>
        <param name="onload" value="true" />
    </feature>
</widget>

插件的目标 C 代码

#import "HybridBridge.h"

@implementation HybridBridge

-(void) loadExternalPage:(CDVInvokedUrlCommand*) command {
    NSLog(@"init");
    NSString *page = [command.arguments objectAtIndex:0];
    NSString *webPage =[NSString stringWithFormat:@"%@%@", [CommonUtil readInfoPlist:@"host"], page];
    CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:webPage];
    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
@end

我真的不知道为什么我的插件方法“loadExternalPage”在 Objective-C 中没有被调用。请帮忙。

【问题讨论】:

    标签: javascript ios objective-c cordova phonegap


    【解决方案1】:

    好的,问题终于解决了。 我花了 20 多个小时才解决这个问题,我一直工作到凌晨 4 点,终于找到了解决方案: 1. 升级 Cordova 到最新版本。我正在使用和工作的当前一个是 Cordova 7 要安装最新的 Cordova:

    $ sudo npm install -g cordova
    
    1. 更新 index.html 以具有以下内容

      https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline';媒体源*; img-src 'self' 数据:内容:;">

    最后的话:

    至少对我来说,从头开始创建项目然后将其转移而不是尝试升级现有项目更容易。

    我修改了位于 Xcode 中 Staging/www 文件夹下的 js 和 html 文件。

    希望对你有帮助。

    【讨论】:

    • 真正为您解决此问题的不是升级 Cordova,而是更新 index.html 中的 Content-Security-Policy 元标记 - 请参阅 this question and answer
    • 我在升级库版本之前确实升级了元标记,但它不起作用。它只有在两者都做之后才开始工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多