React Native dev模式应用程序不会回退到物理设备上的脱机捆绑包(ios)

时间:2017-05-21 21:57:49

标签: ios react-native

如果无法找到正在运行的打包程序,则React Native应自动回退到使用脱机捆绑包,它将在第一次运行时保存。这在Running react-native app on iOS device using offline bundle中提到。

但是,在我的情况下,在断开手机与WiFi并启动应用程序之后,它只是挂在预先缓存的页面(或页面图像)上,而且它通常是最后加载的页面(即应用程序连接到打包程序时加载的最后一页。这个是违反直觉的,因为你认为在关闭应用程序后,它不会持久存在任何本地状态。

我不确定为什么会发生这种情况。这是来自我的设备的相关日志跟踪,它在isPackagerRunning中崩溃,似乎试图对URL进行排序请求。它甚至应该尝试这样做吗?我可以尝试记录它想要连接到的网址。

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x0000000186eaf260 semaphore_wait_trap + 8
1   libdispatch.dylib               0x0000000186d9d5e8 _os_semaphore_wait + 24
2   libdispatch.dylib               0x0000000186d9cca0 _dispatch_semaphore_wait_slow + 140
3   CFNetwork                       0x000000018858eb9c CFURLConnectionSendSynchronousRequest + 284
4   CFNetwork                       0x00000001885bb154 +[NSURLConnection sendSynchronousRequest:returningResponse:error:] + 120
5   resiShare                       0x00000001003d4334 -[RCTBundleURLProvider isPackagerRunning:] (RCTBundleURLProvider.m:76)
6   resiShare                       0x00000001003d45e4 -[RCTBundleURLProvider guessPackagerHost] (RCTBundleURLProvider.m:92)
7   resiShare                       0x00000001003d47f4 -[RCTBundleURLProvider packagerServerHost] (RCTBundleURLProvider.m:106)
8   resiShare                       0x00000001003d49b8 -[RCTBundleURLProvider jsBundleURLForBundleRoot:fallbackResource:] (RCTBundleURLProvider.m:123)
9   resiShare                       0x00000001000cad6c -[AppDelegate application:didFinishLaunchingWithOptions:] (AppDelegate.m:23)
10  UIKit                           0x000000018e0732dc -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 380
11  UIKit                           0x000000018e27f800 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 3452
12  UIKit                           0x000000018e2852a8 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1684
13  UIKit                           0x000000018e299de0 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke.3151 + 48
14  UIKit                           0x000000018e28253c -[UIApplication workspaceDidEndTransaction:] + 168
15  FrontBoardServices              0x0000000189a7b884 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 36
16  FrontBoardServices              0x0000000189a7b6f0 -[FBSSerialQueue _performNext] + 176
17  FrontBoardServices              0x0000000189a7baa0 -[FBSSerialQueue _performNextFromRunLoopSource] + 56
18  CoreFoundation                  0x0000000187e81424 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
19  CoreFoundation                  0x0000000187e80d94 __CFRunLoopDoSources0 + 540
20  CoreFoundation                  0x0000000187e7e9a0 __CFRunLoopRun + 744
21  CoreFoundation                  0x0000000187daed94 CFRunLoopRunSpecific + 424
22  UIKit                           0x000000018e06c45c -[UIApplication _run] + 652
23  UIKit                           0x000000018e067130 UIApplicationMain + 208
24  resiShare                       0x00000001000cb1d0 main (main.m:16)
25  libdyld.dylib                   0x0000000186dbd59c start + 4

2 个答案:

答案 0 :(得分:1)

我已经在这里发布了一个解决方法 - https://github.com/facebook/react-native/issues/10187,希望有更精通Objective-c和url加载的人会看一看并进行适当的修复。希望这可以帮助。感谢。

问题是在加载时从主线程发出同步请求,以便确定是否可以访问react packager(在同一网络上运行的远程服务器)。这可能需要一段时间,因为我知道的原因(如果有人可以解释这一点,我将不胜感激),但如果这需要超过19秒(大约),苹果将崩溃应用程序。

答案 1 :(得分:0)

根据this文章,它是node_modules / react-native / scripts / react-build-xcode.sh脚本的问题。该脚本假设运行Xcode的mac和运行应用程序的iOS设备都在同一个(wi-fi?)网络上。因此,向mac http://[mac IP].xip.io:8081/status发出的同步请求可能需要很长时间才能返回,因为它会挂起超过10秒(请参阅isPackagerRunning中的RCTBundleURLProvider.m方法})

因此,要解决此问题,请确保mac和iPhone位于同一网络上。