我们刚刚发布了一款使用xcode 4.5.2,cordova-2.2.0的新iPhone应用程序 测试时一切正常。但在今天发布后,它立即崩溃。开始屏幕闪烁一秒钟,然后崩溃。
崩溃: -iPhone 5(iOs 6.0.1) -iPhone 4s(iOs 6.0.1) -iPhone 4(iOs 6.0.1)
BUT!适用于: -iPhone 4(iOs 5.0)?!?
因为它从xcode开始工作时我们无法重现这个错误,有什么想法吗?
这是崩溃日志的一个片段,您需要更多详细信息吗?
谢谢!
Last Exception Backtrace:
0 CoreFoundation 0x39e0b3e2 __exceptionPreprocess + 158
1 libobjc.A.dylib 0x38e6495e objc_exception_throw + 26
2 CoreFoundation 0x39e0ef2c -[NSObject(NSObject) doesNotRecognizeSelector:] + 180
3 CoreFoundation 0x39e0d648 ___forwarding___ + 388
4 CoreFoundation 0x39d65204 _CF_forwarding_prep_0 + 20
5 myapp 0x0003dff4 -[CDVViewController viewDidLoad] + 1352
6 myapp 0x000114dc -[MainViewController viewDidLoad] (MainViewController.m:62)
7 UIKit 0x3363a544 -[UIViewController loadViewIfRequired] + 360
8 UIKit 0x3367ad2c -[UIWindow addRootViewControllerViewIfPossible] + 60
9 UIKit 0x33676ac8 -[UIWindow _setHidden:forced:] + 360
10 UIKit 0x336b819c -[UIWindow makeKeyAndVisible] + 56
11 myapp 0x00011260 -[AppDelegate application:didFinishLaunchingWithOptions:] (AppDelegate.m:108)
12 UIKit 0x3367ba74 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 248
13 UIKit 0x3367b5f8 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1164
14 UIKit 0x33673806 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 694
15 UIKit 0x3361bcea -[UIApplication handleEvent:withNewEvent:] + 1006
16 UIKit 0x3361b778 -[UIApplication sendEvent:] + 68
17 UIKit 0x3361b1ba _UIApplicationHandleEvent + 6194
18 GraphicsServices 0x39eaf5f2 _PurpleEventCallback + 586
19 CoreFoundation 0x39de08f2 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 10
20 CoreFoundation 0x39de0158 __CFRunLoopDoSources0 + 208
21 CoreFoundation 0x39ddef2a __CFRunLoopRun + 642
22 CoreFoundation 0x39d52238 CFRunLoopRunSpecific + 352
23 CoreFoundation 0x39d520c4 CFRunLoopRunInMode + 100
24 UIKit 0x33672440 -[UIApplication _run] + 664
25 UIKit 0x3366f28c UIApplicationMain + 1116
26 myapp 0x00010e92 main (main.m:32)
27 myapp 0x00010e44 start + 36
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x39b75350 __pthread_kill + 8
1 libsystem_c.dylib 0x3310dfb2 pthread_kill + 54
2 libsystem_c.dylib 0x3314a366 abort + 90
3 libc++abi.dylib 0x33205dda abort_message + 70
4 libc++abi.dylib 0x33203094 default_terminate() + 20
5 libobjc.A.dylib 0x38e64a58 _objc_terminate() + 144
6 libc++abi.dylib 0x33203118 safe_handler_caller(void (*)()) + 76
7 libc++abi.dylib 0x332031b0 std::terminate() + 16
8 libc++abi.dylib 0x33204626 __cxa_rethrow + 90
9 libobjc.A.dylib 0x38e649b0 objc_exception_rethrow + 8
10 CoreFoundation 0x39d5229c CFRunLoopRunSpecific + 452
11 CoreFoundation 0x39d520c4 CFRunLoopRunInMode + 100
12 UIKit 0x33672440 -[UIApplication _run] + 664
13 UIKit 0x3366f28c UIApplicationMain + 1116
14 myapp 0x00010e92 main (main.m:32)
15 myapp 0x00010e44 start + 36
@Antonio 这是viewDidLoad
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void) viewDidLoad
{
[super viewDidLoad];
NSString* startFilePath = [self pathForResource:self.startPage];
NSURL* appURL = nil;
NSString* loadErr = nil;
if (startFilePath == nil) {
loadErr = [NSString stringWithFormat:@"ERROR: Start Page at '%@/%@' was not found.", self.wwwFolderName, self.startPage];
NSLog(@"%@", loadErr);
self.loadFromString = YES;
appURL = nil;
} else {
appURL = [NSURL fileURLWithPath:startFilePath];
}
//// Fix the iOS 5.1 SECURITY_ERR bug (CB-347), this must be before the webView is instantiated ////
BOOL backupWebStorage = YES; // default value
if ([self.settings objectForKey:@"BackupWebStorage"]) {
backupWebStorage = [(NSNumber*)[settings objectForKey:@"BackupWebStorage"] boolValue];
}
if (backupWebStorage) {
[CDVLocalStorage __verifyAndFixDatabaseLocations];
}
//// Instantiate the WebView ///////////////
[self createGapView];
///////////////////
NSNumber* enableLocation = [self.settings objectForKey:@"EnableLocation"];
NSString* enableViewportScale = [self.settings objectForKey:@"EnableViewportScale"];
NSNumber* allowInlineMediaPlayback = [self.settings objectForKey:@"AllowInlineMediaPlayback"];
BOOL mediaPlaybackRequiresUserAction = YES; // default value
if ([self.settings objectForKey:@"MediaPlaybackRequiresUserAction"]) {
mediaPlaybackRequiresUserAction = [(NSNumber*)[settings objectForKey:@"MediaPlaybackRequiresUserAction"] boolValue];
}
self.webView.scalesPageToFit = [enableViewportScale boolValue];
/*
* Fire up the GPS Service right away as it takes a moment for data to come back.
*/
if ([enableLocation boolValue]) {
[[self.commandDelegate getCommandInstance:@"Geolocation"] getLocation:nil];
}
/*
* Fire up CDVLocalStorage on iOS 5.1 to work-around WebKit storage limitations, or adjust set user defaults on iOS 6.0+
*/
if (IsAtLeastiOSVersion(@"6.0")) {
// We don't manually back anything up in 6.0 and so we should remove any old backups.
[CDVLocalStorage __restoreThenRemoveBackupLocations];
[[NSUserDefaults standardUserDefaults] setBool:backupWebStorage forKey:@"WebKitStoreWebDataForBackup"];
} else {
if (backupWebStorage) {
[self.commandDelegate registerPlugin:[[CDVLocalStorage alloc] initWithWebView:self.webView] withClassName:NSStringFromClass([CDVLocalStorage class])];
} else {
[CDVLocalStorage __restoreThenRemoveBackupLocations];
}
}
/*
* This is for iOS 4.x, where you can allow inline <video> and <audio>, and also autoplay them
*/
if ([allowInlineMediaPlayback boolValue] && [self.webView respondsToSelector:@selector(allowsInlineMediaPlayback)]) {
self.webView.allowsInlineMediaPlayback = YES;
}
if (mediaPlaybackRequiresUserAction == NO && [self.webView respondsToSelector:@selector(mediaPlaybackRequiresUserAction)]) {
self.webView.mediaPlaybackRequiresUserAction = NO;
}
// UIWebViewBounce property - defaults to true
NSNumber* bouncePreference = [self.settings objectForKey:@"UIWebViewBounce"];
BOOL bounceAllowed = (bouncePreference==nil || [bouncePreference boolValue]);
// prevent webView from bouncing
// based on UIWebViewBounce key in Cordova.plist
if (!bounceAllowed) {
if ([ self.webView respondsToSelector:@selector(scrollView) ]) {
((UIScrollView *) [self.webView scrollView]).bounces = NO;
} else {
for (id subview in self.webView.subviews)
if ([[subview class] isSubclassOfClass: [UIScrollView class]])
((UIScrollView *)subview).bounces = NO;
}
}
///////////////////
if (!loadErr) {
NSURLRequest *appReq = [NSURLRequest requestWithURL:appURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0];
[self.webView loadRequest:appReq];
} else {
NSString* html = [NSString stringWithFormat:@"<html><body> %@ </body></html>", loadErr];
[self.webView loadHTMLString:html baseURL:nil];
}
}
答案 0 :(得分:0)
似乎你在viewDidLoad中调用CDVViewController无法处理的方法。最好检查您在该方法中发送给该类实例的所有消息(很可能是self.property或[self something])。
答案 1 :(得分:0)
确保归档并运行应用程序
当您在调试模式下运行它时,您将得到不同的编译,因此可能会有不同的结果。 (调试模式=从XCode中单击运行时运行)
另外,我感觉你在iOS 6中使用了一种不推荐使用的方法。(你明显得到一个'未定义的选择器'错误,它提示你访问一个你不应该访问的方法)检查一下您使用的方法在iOS 6中可用。
此外,请确保您没有访问ivars。据我所知,iOS 6禁用访问私人ivars。