具有多个 CDVViewController 的 Phonegap/Cordova

Posted

技术标签:

【中文标题】具有多个 CDVViewController 的 Phonegap/Cordova【英文标题】:Phonegap/Cordova with Multiple CDVViewController 【发布时间】:2012-10-26 07:05:10 【问题描述】:

我的想法是使用 Phonegap 作为我的应用程序的业务逻辑,但使用原生转换。所以我在每个 UIViewController 中都需要 CDVWebView。这适用于普通 UIWebviews,但如果我使用多个 CDVViewControllers,例如一个 TabBar,deviceReady 事件仅针对第一个 CDVWebView 触发。

这是我在 App Delegate 中所做的:

- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
    
NSURL* url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
NSString* invokeString = nil;

if (url && [url isKindOfClass:[NSURL class]]) 
    invokeString = [url absoluteString];
    NSLog(@"NativeNavigationTest launchOptions = %@", url);
    
NSLog(@"invokeString = %@", invokeString);
CGRect screenBounds = [[UIScreen mainScreen] bounds];
self.window = [[[UIWindow alloc] initWithFrame:screenBounds] autorelease];
self.window.autoresizesSubviews = YES;

CGRect viewBounds = [[UIScreen mainScreen] applicationFrame];


//4 ViewController, each one inherits from CDVViewController

self.viewController = [[[MainViewController alloc] init] autorelease];
self.viewController.useSplashScreen = YES;
self.viewController.wwwFolderName = @"www";
self.viewController.startPage = @"index.html";
self.viewController.invokeString = invokeString;
self.viewController.view.frame = viewBounds;

self.secondController = [[[SecondController alloc] init] autorelease];
self.secondController.useSplashScreen = YES;
self.secondController.wwwFolderName = @"www";
self.secondController.startPage = @"second.html";
self.secondController.invokeString = invokeString;
self.secondController.view.frame = viewBounds;


self.thirdController = [[[ThirdController alloc] init] autorelease];
self.thirdController.useSplashScreen = YES;
self.thirdController.wwwFolderName = @"www";
self.thirdController.startPage = @"third.html";
self.thirdController.invokeString = invokeString;
self.thirdController.view.frame = viewBounds;

self.fourthController = [[[FourthController alloc] init] autorelease];
self.fourthController.useSplashScreen = YES;
self.fourthController.wwwFolderName = @"www";
self.fourthController.startPage = @"fourth.html";
self.fourthController.invokeString = invokeString;
self.fourthController.view.frame = viewBounds;


//add them in a native ViewController environment like a Tabbar

self.tabBarController = [[[UITabBarController alloc] init] autorelease];
self.tabBarController.viewControllers = [NSArray arrayWithObjects:viewController, secondController, thirdController, fourthController, nil];
self.window.rootViewController = self.tabBarController;
[self.window makeKeyAndVisible];
return YES;

这是我为每个 ViewController 得到的错误,除了第一个。

Error: executing module function 'setInfo' in module 'cordova/plugin/ios/device'. Have you included the iOS version of the cordova-1.9.0.js 

ERROR: Attempting to call cordova.exec() before 'deviceready'. Ignoring.

当然,我在我的 HTML 文件中引用了 cordova-1.9.0,我认为 Cordova 并非旨在使用它的多个 WebView,但有人知道如何更改吗?

【问题讨论】:

我认为这是 Cordova 中的一个错误,并已在他们的问题跟踪器中报告:issues.apache.org/jira/browse/CB-2271 【参考方案1】:

答案是Cordova WebView。旨在嵌入到本机应用程序中。

编辑

使用多个 Cordova Webviews,它有相同的错误。当您仍然只能在项目中放置一个由 Phonegap 支持的 Webview 时,我不知道这有什么意义。

【讨论】:

【参考方案2】:

我确认这是 race condition in Cordova - 从 2.4.0 开始,该问题已得到修复。

【讨论】:

以上是关于具有多个 CDVViewController 的 Phonegap/Cordova的主要内容,如果未能解决你的问题,请参考以下文章

没有可见的@iterface CDVViewController

Cordova iOS - 未找到新的 Xcode 配置/CDVViewController.h

CDVViewController 在删除父级后仍在执行 JS

Phonegap 2.1.0 Cordova/CDVViewController.h 文件未找到

在 Xcode 4.5 中查找 CDVViewController.m 的位置

由于找不到“Cordova/CDVViewController.h”文件,离子应用程序存档在 xcode 7.2 中失败