【问题标题】:iPhone app crashes on device but not simulator. Accessing local files with UIWebView, possible [NSBundle mainBundle] issue?iPhone 应用程序在设备上崩溃,但不是模拟器。使用 UIWebView 访问本地文件,可能的 [NSBundle mainBundle] 问题?
【发布时间】:2011-09-30 23:55:04
【问题描述】:

我希望你们能帮助我的代码有什么问题导致我的应用程序在我的设备上崩溃,而不是在模拟器上。这是一个非常简单的应用程序,我只是在 UIWebView 中显示本地文件。这是我在 .m 中使用的内容

NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"localHTML/mobile"];
NSURL *url = [NSURL fileURLWithPath:path];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];

我只是发布此代码,因为我觉得这里的某些东西导致了问题,但我知道什么,如果您需要查看其他内容,请告诉我。

这是崩溃日志。其中一些可能没有帮助,但我想我会发布整个内容,因为我不知道要查找什么。

    Incident Identifier: 9598C96E-EA38-4C54-B39F-BBD245648E48
CrashReporter Key:   cb7605a41daea519012d6fd4f52c4b19fb584743
Hardware Model:      iPhone3,1
Process:         Cannon Mobile [5129]
Path:            /var/mobile/Applications/E5760D01-689A-41A3-A6CA-45E007B7C27A/Cannon Mobile.app/Cannon Mobile
Identifier:      Cannon Mobile
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2011-09-30 19:26:57.951 -0400
OS Version:      iPhone OS 4.3.3 (8J2)
Report Version:  104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x3558fa1c __pthread_kill + 8
1   libsystem_c.dylib               0x356663b4 pthread_kill + 52
2   libsystem_c.dylib               0x3565ebf8 abort + 72
3   libstdc++.6.dylib               0x35628a64 __gnu_cxx::__verbose_terminate_handler() + 376
4   libobjc.A.dylib                 0x3449d06c _objc_terminate + 104
5   libstdc++.6.dylib               0x35626e36 __cxxabiv1::__terminate(void (*)()) + 46
6   libstdc++.6.dylib               0x35626e8a std::terminate() + 10
7   libstdc++.6.dylib               0x35626f5a __cxa_throw + 78
8   libobjc.A.dylib                 0x3449bc84 objc_exception_throw + 64
9   CoreFoundation                  0x3098048a +[NSException raise:format:arguments:] + 62
10  CoreFoundation                  0x309804c4 +[NSException raise:format:] + 28
11  Foundation                      0x341dd188 -[NSURL(NSURL) initFileURLWithPath:] + 64
12  Foundation                      0x341dd128 +[NSURL(NSURL) fileURLWithPath:] + 24
13  Cannon Mobile                   0x000033da -[Cannon_MobileViewController refresh:] (Cannon_MobileViewController.m:48)
14  Cannon Mobile                   0x000034ec -[Cannon_MobileViewController viewDidLoad] (Cannon_MobileViewController.m:62)
15  UIKit                           0x30a18f08 -[UIViewController view] + 104
16  UIKit                           0x30a172ae -[UIWindow addRootViewControllerViewIfPossible] + 26
17  UIKit                           0x30b42538 -[UIWindow setRootViewController:] + 160
18  Cannon Mobile                   0x00002fb6 -[Cannon_MobileAppDelegate application:didFinishLaunchingWithOptions:] (Cannon_MobileAppDelegate.m:22)
19  UIKit                           0x30a1781a -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 766
20  UIKit                           0x30a11b5e -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 266
21  UIKit                           0x309e67d0 -[UIApplication handleEvent:withNewEvent:] + 1108
22  UIKit                           0x309e620e -[UIApplication sendEvent:] + 38
23  UIKit                           0x309e5c4c _UIApplicationHandleEvent + 5084
24  GraphicsServices                0x30269e70 PurpleEventCallback + 660
25  CoreFoundation                  0x30957a90 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 20
26  CoreFoundation                  0x30959838 __CFRunLoopDoSource1 + 160
27  CoreFoundation                  0x3095a606 __CFRunLoopRun + 514
28  CoreFoundation                  0x308eaebc CFRunLoopRunSpecific + 224
29  CoreFoundation                  0x308eadc4 CFRunLoopRunInMode + 52
30  UIKit                           0x30a10d42 -[UIApplication _run] + 366
31  UIKit                           0x30a0e800 UIApplicationMain + 664
32  Cannon Mobile                   0x00002f20 main (main.m:14)
33  Cannon Mobile                   0x00002ec8 start + 32

Thread 1:
0   libsystem_kernel.dylib          0x355903ec __workq_kernreturn + 8
1   libsystem_c.dylib               0x356676d8 _pthread_wqthread + 592
2   libsystem_c.dylib               0x35667bbc start_wqthread + 0

Thread 2 name:  Dispatch queue: com.apple.libdispatch-manager
Thread 2:
0   libsystem_kernel.dylib          0x35590fbc kevent + 24
1   libdispatch.dylib               0x35261032 _dispatch_mgr_invoke + 706
2   libdispatch.dylib               0x3526203a _dispatch_queue_invoke + 86
3   libdispatch.dylib               0x352615ea _dispatch_worker_thread2 + 186
4   libsystem_c.dylib               0x3566758a _pthread_wqthread + 258
5   libsystem_c.dylib               0x35667bbc start_wqthread + 0

Thread 3 name:  WebThread
Thread 3:
0   libsystem_kernel.dylib          0x3558dc5c semaphore_wait_signal_trap + 8
1   libsystem_kernel.dylib          0x3558df52 semaphore_wait_signal + 2
2   libsystem_c.dylib               0x35664734 pthread_mutex_lock + 256
3   WebCore                         0x35f533ee _ZL17_WebTryThreadLockb + 150
4   WebCore                         0x35f5332e _ZL14WebRunLoopLockP19__CFRunLoopObservermPv + 14
5   CoreFoundation                  0x30957a2e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 10
6   CoreFoundation                  0x3095945e __CFRunLoopDoObservers + 406
7   CoreFoundation                  0x3095a760 __CFRunLoopRun + 860
8   CoreFoundation                  0x308eaebc CFRunLoopRunSpecific + 224
9   CoreFoundation                  0x308eadc4 CFRunLoopRunInMode + 52
10  WebCore                         0x35f5327e _ZL12RunWebThreadPv + 382
11  libsystem_c.dylib               0x3566630a _pthread_start + 242
12  libsystem_c.dylib               0x35667bb4 thread_start + 0

Thread 0 crashed with ARM Thread State:
    r0: 0x00000000    r1: 0x00000000      r2: 0x00000001      r3: 0x00000000
    r4: 0x3f86348c    r5: 0x00000006      r6: 0x1d59051c      r7: 0x2fe10f90
    r8: 0x3ed19bf8    r9: 0x00000065     r10: 0x3180e2f0     r11: 0x3ed0c964
    ip: 0x00000148    sp: 0x2fe10f84      lr: 0x3619b3bb      pc: 0x360c4a1c
  cpsr: 0x00000010

非常感谢您的帮助。

【问题讨论】:

  • 您的崩溃日志显示引发了异常。有什么例外?
  • 您是否在调试器中逐步完成了此操作? 'path' 是在第一行之后正确设置还是为零?
  • 调试器返回 所以是的,它与路径有关。 @Kevin 提到设备文件系统区分大小写,但一切似乎都很好。会不会是别的?
  • 请不要重复同一个问题。改为编辑原件。

标签: iphone xcode crash nsbundle


【解决方案1】:

检查 Xcode 生成的应用程序包。它是否包含 localHTML/mobile 目录和您期望的所有文件?

(在 Xcode 导航器面板的 Products 部分下右键单击 appname.app,选择“Reveal in Finder”,然后右键单击 Finder 中的应用程序包并选择“显示包内容”)

【讨论】:

    【解决方案2】:

    由于您尚未发布异常,我猜问题是您将nil 传递给+fileURLWithPath:。为什么你会在设备上得到nil 而不是模拟器?简单的回答:区分大小写。设备上的文件系统区分大小写,但 Mac OS X 上的默认 HFS+ 文件系统不区分大小写。您要求的是 localHTML/mobile/index.html,但如果其中任何一个字符的大小写错误,那么 -pathForResource:ofType:inDirectory: 最终会在设备上返回 nil。由于您尚未测试它是否为nil,因此您将其直接传递给+fileURLWithPath:,这可能会引发异常。

    【讨论】:

      【解决方案3】:

      好吧,我不确定为什么会崩溃。从表面上看,您并没有做任何严重错误的事情。我猜它与文件路径有关,或者文件不存在。杀死它的行是[NSURL fileURLWithPath:path],您可以使用- (NSURL *)URLForResource:(NSString *)name withExtension:(NSString *)ext subdirectory:(NSString *)subpath 而不是pathForResource: 跳过该行。不确定这是否能解决您的问题,但值得一试。

      编辑:哦,模拟器和设备之间的一个区别是设备上的文件系统区分大小写,而它不在 osx/模拟器上。您的文件名或文件路径是否存在大小写问题?


      尝试一些 NSLog 看看问题出在哪里。

      NSString *path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"localHTML/mobile"];
      NSLog(@"Path is %@",path);
      NSURL *url = [NSURL fileURLWithPath:path];
      NSLog(@"URL is %@",url);
      NSURLRequest *request = [NSURLRequest requestWithURL:url];
      [webView loadRequest:request];
      

      如果您在控制台中看到“路径为空”,那么您在 pathForResource 调用中指定了错误。

      一个想法:

      如果您已将文件添加到 Xcode 项目,但未将它们包含在构建目标中,则它们不会被添加到应用程序包中。

      如果 localHTML 和 mobile 是 Xcode 中的“组”,而不是实际的文件夹,那么在编译应用程序时它们会被忽略。 Xcode 组与已编译的应用程序无关(查看文件夹引用以在您的应用程序包中创建文件夹)。

      【讨论】:

      • +1 用于检查区分大小写 - 模拟器不在设备区分大小写的地方。
      猜你喜欢
      • 2012-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2011-09-09
      相关资源
      最近更新 更多