react-native - xde - reactive native expo




오프라인 번들을 사용하여 iOS 기기에서 반응 네이티브 앱 실행하기 (4)

오프라인 번들을 사용하여 iOS 기기에서 앱을 실행하는 공식 React Native 문서

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 을 사용하려고하면 null로 반환됩니다.

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

main.jsbundle 의 URL이 null 로 반환 된 이유가 확실하지 않습니다. 더 이상 포장업자가 만들지 않습니다. 최신 버전을 사용하여 생성해야한다면 어떻게 확인할 수 있습니까?

오프라인 번들을 사용하여 iOS 기기에서 react-native 0.30.0 앱을 실행 한 경우 도움말을 공유하시기 바랍니다.


tl; dr localhost IP 주소가 hosts 파일에 명시 적으로 표시되고 호스트 파일이 손상되지 않았는지 확인하십시오.

그래서 우리 팀은 계속이 문제에 부딪쳤다. React Native는 컴퓨터의 호스트 파일을 읽고 저장할 URL을 찾고 js를 가져 와서 오프라인 번들을 만들거나 앱이 기기에서 실행되는 동안 패키지 도구에 도달 할 수 있음이 밝혀졌습니다.

실제로 ios 시뮬레이터에서만 오프라인 번들로 실행하려고하지 않았으므로 우리는 실제로 머리를 긁적 인 상태로 남겨 두었습니다. 필요한 수정으로 인해 문제가 발생한 다른 문제도 발생했기 때문에 수정본을 발견했습니다. mac의 우리 etc / hosts 파일에 명시 적으로 명시된 localhost ip가 없습니다. 나는 그 점을 덧붙여 문제가 사라진 것처럼 보였다. osx 및 dns 해상도에 대해 많이 알지 못해서 용서해 주겠지 만 새 자동 IP 탐지로 인해 이제는 필요합니다.

호스트 파일을 읽는 중이거나 호스트 파일이 rs가 읽고있는 osx에서 다른 것을 propogating하는 경우 ip가 어떻게 반응하는지 확실하지 않지만 위의 수정이 나에게 도움이된다면보고 싶을 것입니다. hosts 파일 자체가 특정 문자로 손상되어 읽지 않는 경우 이 문제에 대한 해결책을 찾던 중, localhost가 문제를 제대로 일으키는 원인이 된 조작 된 호스트 파일에 관한 많은 게시물과 질문을 보았습니다.

또한 ip 탐지를 업데이트하기위한 노력이 진행되고있는 것처럼 보이지만,이 문제가 새로운 코드로 수정 될지 충분히 알기에는 충분하지 않습니다. 어쩌면 누군가가 볼 수 있을까요? https://github.com/facebook/react-native/pull/8789

osx DNS 캐시를 삭제하면 https://coolestguidesontheplanet.com/clear-the-local-dns-cache-in-osx/ 도움이 될 수도 https://coolestguidesontheplanet.com/clear-the-local-dns-cache-in-osx/


나에게 문제는 내가 Info.plist로 fiddled했고 localhost app 전송 보안 예외를 제거했다는 것이었다. 이것을 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>

네이티브 0.37반응 하기 위해 얻을 수있는 유일한 수정은 AppDelegate.m 에서 jsCodeLocation 을 수동으로 편집하는 "구식"방법으로 돌아가는 것이 었 습니다. 디버깅이 다시 좋습니다!

장치와 개발 장치가 동일한 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;
}

편집 : 전체 번들 IP 감지가 반응 네이티브의 최신 릴리스에 자동이어야합니다. xcode에서 장치를 선택하면 build and run 하고 앱을 한 번 실행하십시오. 패키지 번들이 실행중인 패키지를 찾지 못하면 오프라인 번들을 사용하도록 전화 상에 오프라인 번들을 저장해야합니다.

출처 : https://github.com/facebook/react-native/commit/8c29a52c54392ce52148e7d3aa9f835537453aa4

앱을 빌드하는 동안 release 구성표로 변경하면 오프라인 번들로 앱이 컴파일됩니다.

Product> Scheme> Scheme 편집> build configurationRelease 설정하십시오.

Appdelegate.m 메소드의 설명서를 왜 업데이트하지 않았는지 확실하지 않습니다. 선상에 여전히 선이있는 것 같습니다. [편집 : 이것에 대한 요청당겨 ]





react-native