Подтвердить что ты не робот

Запуск приложения-адаптера на устройстве iOS с использованием автономного пакета

Официальная документация React Native для запуска приложения на устройстве 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, как это было в предыдущих версиях, он возвращается как null

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

Я не уверен, почему URL для main.jsbundle возвращается как null. Разве это не создано упаковщиком. Если он также должен быть создан с использованием последней версии, как я могу его подтвердить?

Если вы запустили приложение react-native 0.30.0 на устройстве iOS с помощью автономного пакета, поделитесь инструкциями для этого. Спасибо!

4b9b3361

Ответ 1

РЕДАКТИРОВАТЬ. Обнаружение целого пакета ip должно быть автоматическим при последней версии реакции-native. Если вы выберете свое устройство на xcode, выполните build and run и запустите приложение один раз. Он должен сохранить автономный пакет на телефоне, чтобы, если он не находит сервер-упаковщик, он будет использовать автономный пакет.

источник: https://github.com/facebook/react-native/commit/8c29a52c54392ce52148e7d3aa9f835537453aa4


Если вы измените схему release при создании своего приложения, это скомпилирует ваше приложение с автономным пакетом.

Продукт > Схемa > Изменить схему > установите build configuration в release.

Не знаю, почему они не обновили документацию для метода Appdelegate.m. Похоже, что линия все еще существует в источниках. [Изменить: там тянуть запрос для этого]

Ответ 2

Когда я открываю глобальный прокси-сервер в ShadowsocksX, автоматическое обнаружение IP-адресов не возвращает http://localhost:8081/index.ios.bundle в режиме отладки. Поэтому URL-адрес main.jsbundle возвращался как null.

Как решить?

Вариант 1:

заменить

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

с

jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.ios.bundle?platform=ios&dev=true"];

Этот метод может отключить автоматическое обнаружение IP-адресов.

Вариант 2:

Переключите режим прокси-сервера, если вы откроете глобальный режим прокси.

Ответ 3

tl; dr Убедитесь, что ваш IP-адрес localhost явно указан в вашем файле hosts и что ваш файл hosts не поврежден.

Поэтому наша команда продолжала сталкиваться с этой проблемой. Оказывается, React Native читает файл хоста на вашем компьютере, ища URL-адрес для хранения, так что он может вытащить js для создания автономного пакета или просто добраться до упаковщика во время работы приложения на вашем устройстве.

На самом деле мы не пытались запускать это как автономный комплект, только в симуляторе ios, поэтому мы остались почесывать головы. Мы нашли исправление, потому что необходимое исправление также вызывало другие проблемы с реакцией native. В нашем файле etc/hosts на mac не указано явно указано localhost ip. Я добавил, что проблема и, похоже, исчезли. Простите меня, поскольку я мало знаю о разрешении osx и dns, но кажется, что с новым автоматическим обнаружением ip это необходимо.

Я не уверен, как реагировать native на получение ip, если он читает файл hosts, или файл хоста распространяет что-то еще в osx, которое читает rn, но если указанное исправление не работает для вас, я бы посмотрите, не поврежден ли сам файл хоста определенными символами, которые не позволяют его прочитать. В ходе поиска решения этой проблемы я столкнулся с множеством сообщений и вопросов о файлах с искаженными хостами, которые вызвали проблемы с локальным хостом, которые были правильно разрешены.

Кроме того, похоже, что есть усилия по обновлению ip-обнаружения, но я недостаточно разбираюсь в том, чтобы узнать, будет ли эта проблема исправлена ​​новым кодом. Может, кто-то может взглянуть? https://github.com/facebook/react-native/pull/8789

Другой также, очистка кэша DNS osx может помочь https://coolestguidesontheplanet.com/clear-the-local-dns-cache-in-osx/

Ответ 4

Единственное исправление, которое я мог бы решить для реагировать на родной 0.37, состояло в том, чтобы вернуться к методу "старой школы" для ручного редактирования jsCodeLocation в AppDelegate. м. Отладка снова хороша!

Убедитесь, что ваше устройство и машина для разработки находятся на одном и том же Wi-Fi и, возможно, отключите проводной Ethernet, пока вы не заработаете.

- (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;
}

Ответ 5

Для меня проблема заключалась в том, что я поиграл с 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>