UIWebview仅在ios7上加载某些pdf文档时崩溃

时间:2013-11-19 13:31:00

标签: ios pdf uiwebview ios7

我有 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模拟器上生存

1 个答案:

答案 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];

}