2016-08-05 62 views
13

官方React Native文件,以使用脱机捆绑的iOS设备上运行的应用程序的反应原生的iOS设备上的应用说运行使用脱机捆绑

开放IOS/YourApp/AppDelegate.m

取消对线, jsCodeLocation = [[一个NSBundle mainBundle] ...

采用了最新react-native 0.30.0,这条线是在默认AppDelegate.m文件不再存在。从默认的摘录AppDelegate.m文件

NSURL *jsCodeLocation; 

    jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 

    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 
                 moduleName:@"TestAppDelete" 
               initialProperties:nil 
                launchOptions:launchOptions]; 

如果我尝试使用jsCodeLocation因为它曾经在以前的版本中,它返回为空

jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 

我不知道为什么是针对URL main.jsbundle返回为null。它不是由包装商创建的吗?如果应该使用最新版本创建,我该如何确认?

如果您使用脱机包在iOS设备上运行了react-native 0.30.0应用程序,请分享相关说明。谢谢!

回答

23

编辑:在最新发布的react-native版本中,整个ip检测应该是自动的。如果您在xcode do build and run上选择了您的设备并运行该应用一次。它应该在手机上保存一个脱机捆绑包,这样如果它找不到一个包装服务器运行,它将使用脱机捆绑包。

来源:https://github.com/facebook/react-native/commit/8c29a52c54392ce52148e7d3aa9f835537453aa4


如果您更改为release方案,同时建立你的应用程序,这将编译你的应用程序与脱机捆绑包。

Product> Scheme> Edit Scheme> set build configuration to Release

不确定为什么他们没有更新Appdelegate.m方法的文档。看起来线路仍然存在于信号源中。 [编辑:这里有一个pull request]

+0

非常感谢你的回复。发布说明中未提及此更改,因为我更改了应用中的'AppDelegate'文件,所以我在'react-native'升级之后将其替换了,并且文档未更新,这些更改让事情更加混乱。请注意 - 如果我在设备上运行应用程序而不更改“Build Configuration”到“Release”,那么只要连接到Mac,我就可以运行该应用程序。如果我停止该应用程序,请断开手机并尝试再次运行,但不启动。在这种情况下,将“构建配置”设置为“发布”。再次感谢! –

+0

我希望我可以upvote多次:)的答案。我昨天花了太多时间才弄明白。 –

+0

干杯,男人!难道不是你的回答,我不会知道我自己。 :)我还没有尝试过,但看到它的来源。一旦我尝试一下就会更新。 – nabn

1

唯一的解决方法我能得到的工作作出反应本地0.37是要回去的手工编辑jsCodeLocationAppDelegate.m的“老派”的方法。调试很好!

确保您的设备和开发机器位于相同的Wi-Fi网络上,并且可能会断开任何有线以太网,直到您获得它的工作。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSURL *jsCodeLocation; 

    // Comment-out, cannot get past error: bundleURL must be non-nil when not implementing loadSourceForBridge 
    //jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 

#if DEBUG 
    NSLog(@"AppDelegate:DEBUG"); 

#if TARGET_IPHONE_SIMULATOR 
    NSLog(@"AppDelegate:DEBUG:TARGET_IPHONE_SIMULATOR"); 
    jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle"]; 
#else 
    NSLog(@"AppDelegate:DEBUG:!TARGET_IPHONE_SIMULATOR"); 
    NSLog(@"To device debug, open RCTWebSocketExecutor.m & replace localhost with MacBook IP."); 
    // Get dev host IP Address: 
    // ifconfig | grep inet\ | tail -1 | cut -d " " -f 2 
    jsCodeLocation = [NSURL URLWithString:@"http://192.16.29.213:8081/index.ios.bundle"]; 
#endif 

#else 
    NSLog(@"AppDelegate:RELEASE jsbundle"); 
    jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 
#endif 

    NSLog(@"jsCodeLocation = %@",jsCodeLocation); 


    RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 
                 moduleName:@"BluetoothConnect" 
               initialProperties:nil 
                launchOptions:launchOptions]; 
    rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    UIViewController *rootViewController = [UIViewController new]; 
    rootViewController.view = rootView; 
    self.window.rootViewController = rootViewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
3

tl; dr请确保您的本地主机IP地址在主机文件中明确声明,并且您的主机文件没有被损坏。

所以我们的团队不断遇到这个问题。事实证明,React Native会读取计算机上的主机文件以查找要存储的URL,以便它可以让js创建脱机包,或者在应用在设备上运行时直接联系打包程序。

我们实际上并没有试图将它作为一个离线软件包,只是在ios模拟器中,所以我们真的只是在挠头。我们找到了修复程序,因为所需的修复程序也导致了其他原生问题。我们在mac上的etc/hosts文件没有明确声明的localhost ip。我补充说,问题似乎消失了。请原谅我,因为我对osx和dns分辨率了解不多,但似乎有了新的自动ip检测功能,现在就有必要了。

我不知道如何反应本地获取IP,如果它正在读取主机文件,或主机文件正在props中的其他osx,正在阅读,但如果上述修复程序不适用于您,我会查看主机文件本身是否被损坏,导致某些字符不能被读取。在寻找解决此问题的解决方案时,我遇到了很多关于格式错误的主机文件的帖子和问题,这些问题导致localhost正常解决问题。

此外,似乎有更新ip检测的工作正在进行中,但我不太了解obj c知道这个问题是否会被新代码纠正。也许有人可以看看? https://github.com/facebook/react-native/pull/8789

另还,清除OSX DNS缓存可以帮助https://coolestguidesontheplanet.com/clear-the-local-dns-cache-in-osx/

+1

+1 ..真棒研究!我只对某些路由器有这个问题。 (我移动了很多)。但指向主持人的路线已被注释掉。 把 127.0.0.1本地主机 进入我的hosts文件修复了这个问题!非常感谢!我正在寻找解决问题的时间。 –

+1

@Fralcon谢谢。 – TA3

0

对我来说,问题是,我曾与Info.plist的拨弄和删除本地主机应用程序传输安全例外。把它加回到Info.plist中为我修好:

<key>NSAppTransportSecurity</key> 
<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ --> 
<dict> 
    <key>NSExceptionDomains</key> 
    <dict> 
     <key>localhost</key> 
     <dict> 
      <key>NSExceptionAllowsInsecureHTTPLoads</key> 
      <true/> 
     </dict> 
    </dict> 
</dict>