我有 iPhone应用程序,它使用UIWebview
来显示文档。
当我尝试打开某个pdf文件时,应用程序崩溃时出现以下异常:
0 CoreFoundation 0x036925e4 __exceptionPreprocess + 180,
1 libobjc.A.dylib 0x02c2d8b6 objc_exception_throw + 44,
2 CoreFoundation 0x036923bb +[NSException raise:format:] + 139,
3 QuartzCore 0x0126bcaa _ZN2CA5Layer12set_positionERKNS_4Vec2IdEEb + 190,
4 QuartzCore 0x0126be69 -[CALayer setPosition:] + 68,
5 QuartzCore 0x0126c56f -[CALayer setFrame:] + 799,
6 UIKit 0x017e572c -[UIView(Geometry) setFrame:] + 302,
7 UIKit 0x01d14bcb -[UIWebPDFViewHandler didDetermineDocumentBounds:] + 161,
8 UIKit 0x01d0f2b4 -[UIWebPDFView didCompleteLayout] + 628,
9 WebKit 0x069cbac1 -[WebPDFViewPlaceholder _notifyDidCompleteLayout] + 161,
10 libobjc.A.dylib 0x02c3f81f -[NSObject performSelector:withObject:] + 70,
11 Foundation 0x026759d8 __NSThreadPerformPerform + 285,
12 CoreFoundation 0x0361b83f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15,
13 CoreFoundation 0x0361b295 __CFRunLoopDoSources0 + 437,
14 CoreFoundation 0x0363829e __CFRunLoopRun + 910,
15 CoreFoundation 0x03637ac3 CFRunLoopRunSpecific + 467,
16 CoreFoundation 0x036378db CFRunLoopRunInMode + 123,
17 GraphicsServices 0x035bd9e2 GSEventRunModal + 192,
18 GraphicsServices 0x035bd809 GSEventRun + 104,
19 UIKit 0x0178ed3b UIApplicationMain + 1225,
20 Navigator 0x0000317d main + 141,
21 libdyld.dylib 0x041a570d start + 1
显然这个特定的pdf文档已损坏,但UIWebview
仅在 iOS7 上崩溃。在 iOS6 设备和模拟器上,文件未显示但应用程序仍然存在。
我很乐意,如果有人能解释这种差异的来源,更重要的是 - 如何避免这种情况导致我的应用程序崩溃。
编辑:您可以尝试使用我创建的示例项目来展示问题。 该项目在这里:https://github.com/eliktz/testWebViewProject 在 ios7模拟器上运行时,您可以看到应用程序在损坏的文件上崩溃,并在 ios6模拟器上生存
答案 0 :(得分:0)
添加此委托方法以避免在出现加载错误时崩溃。
-(void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
NSLog(@"Error %@", [error description]);
}
现在为什么UIWebView改变了两个iOS版本之间的行为,没有具体的答案。在重大更新期间,许多API都会发生变化。
在你的情况下,在.h文件中使属性变强(现在它很弱)并符合UIWebView协议:
@interface FlipsideViewController : UIViewController <UIWebViewDelegate>
@property (weak, nonatomic) id <FlipsideViewControllerDelegate> delegate;
@property (strong, nonatomic) IBOutlet UIWebView *webView;
@property (nonatomic,strong) NSString * fileName;
- (IBAction)done:(id)sender;
并在viewWillAppear方法集中设置:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.fileName==nil) {
self.fileName=@"samplePDF";
}
self.webView = [[UIWebView alloc] init];
NSString *path = [[NSBundle mainBundle] pathForResource:self.fileName ofType:@"pdf"];
NSURL *targetURL = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:targetURL];
[self.webView setDelegate:self];
[self.webView loadRequest:request];
}