Cordova 4.4.0 调用 iOS Objective-C 本机方法不起作用
Cordova 4.4.0 call iOS Objective-C native method not working
更新:
现在 JavaScript 可以在事件 "deviceReady" 之后调用我的 Objective C 插件代码。
但
它只有在我将应用程序推到后台时才有效,否则,它只会挂在那里,永远不会调用我的插件代码。
我可以看到控制台在调用插件时显示
[29277:15212897] THREAD WARNING: ['HybridBridge'] took '9252.614014' ms. Plugin should use a background thread.
我了解警告“'9252.614014' ms”是由我将应用程序推送到后台的手动操作引起的
但是为什么???为什么我的 Objective C 插件代码只在应用进入后台时调用?
我正在为基于 objective 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>
下面是我的代码,请大家帮忙
JavaScript调用Objective C方法的代码:
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>
Objective 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中被调用。请帮忙。
OK问题终于解决了。
我花了 20 多个小时才解决这个问题,我一直工作到凌晨 4 点,最后是解决方案:
1.升级Cordova到最新版本。我目前正在使用和工作的是 Cordova 7
安装最新的 Cordova:
$ sudo npm install -g cordova
更新 index.html 以具有以下内容
https://ssl.gstatic.com'unsafe-eval';样式源 'self' 'unsafe-inline';媒体源 *; img-src 'self' 数据:内容:;">
最后的话:
从头开始创建项目,然后将其移过去比尝试升级现有项目更容易,至少对我而言。
并且我修改了 Xcode 中 Staging/www 文件夹下的 js 和 html 文件。
希望对您有所帮助。
更新: 现在 JavaScript 可以在事件 "deviceReady" 之后调用我的 Objective C 插件代码。 但 它只有在我将应用程序推到后台时才有效,否则,它只会挂在那里,永远不会调用我的插件代码。 我可以看到控制台在调用插件时显示
[29277:15212897] THREAD WARNING: ['HybridBridge'] took '9252.614014' ms. Plugin should use a background thread.
我了解警告“'9252.614014' ms”是由我将应用程序推送到后台的手动操作引起的
但是为什么???为什么我的 Objective C 插件代码只在应用进入后台时调用?
我正在为基于 objective 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>
下面是我的代码,请大家帮忙
JavaScript调用Objective C方法的代码:
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>
Objective 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中被调用。请帮忙。
OK问题终于解决了。 我花了 20 多个小时才解决这个问题,我一直工作到凌晨 4 点,最后是解决方案: 1.升级Cordova到最新版本。我目前正在使用和工作的是 Cordova 7 安装最新的 Cordova:
$ sudo npm install -g cordova
更新 index.html 以具有以下内容
https://ssl.gstatic.com'unsafe-eval';样式源 'self' 'unsafe-inline';媒体源 *; img-src 'self' 数据:内容:;">
最后的话:
从头开始创建项目,然后将其移过去比尝试升级现有项目更容易,至少对我而言。
并且我修改了 Xcode 中 Staging/www 文件夹下的 js 和 html 文件。
希望对您有所帮助。