Как я могу отобразить экран запуска / spla sh в собственном приложении без использования пакета? (iOS специально) - PullRequest
1 голос
/ 13 апреля 2020

В настоящее время я выполняю обновленные рекомендации Apple по разработке мобильного приложения React Native. Зависание для меня было связано с использованием раскадровки для экрана запуска.

Обзор

В рабочей версии приложения используется экран реагирования-родного-спла sh для обработки спла sh экран, который есть только у компании lo go. Я заметил, что последний пакет выпускал обновление, опубликованное год go, поэтому я хотел бы отойти от него и обработать экран spla sh изначально.

Текущее состояние

Я создал раскадровку с Xcode и выронил пакет из репозитория. Я внес несколько изменений в AppDelegate.m и смог отображать экран spla sh в течение заданного периода времени. В конечном итоге я не хочу использовать таймер, я хочу скрыть экран spla sh после завершения всех сетевых вызовов времени запуска.

Решение (?)

После расчесывания через статьи и посты я наткнулся на то, что я считаю решением. Это был пост на r / реагирующий, написанный пару лет назад: https://www.reddit.com/r/reactnative/comments/754y5g/app_flashing_white_after_launch_screen_on_ios_11/

ОП нашел решение и добавил его в комментарии . Идея состоит в том, чтобы отредактировать AppDelegate.m, предоставленный RN, чтобы заменить белый экран тем же .xib, что и экран запуска.

  • У меня есть .storyboard, а не .xib

  • В их примере AppDelegate.m немного отличается от приложения.

  • Я не знаю, как выглядит Objective- C

Итак, мой поиск продолжился, и я нашел следующее сообщение от stackoverflow: React-Native iOS - Как показать контроллер представления после экрана запуска, прежде чем инициализировать реакцию собственного моста (iOS)

Я провел рефакторинг на основе этого поста и смог добраться до моего текущего состояния.

Код

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

  UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:[NSBundle mainBundle]];
  UIViewController *backgroundView = [storyboard instantiateViewControllerWithIdentifier:@"LaunchViewController"];

  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                               moduleName:@"fakeAppName"
                                               initialProperties:nil];

  rootView.backgroundColor = [UIColor clearColor];// changed color to clearColor

  UIViewController *rootViewController = [UIViewController new];
  rootViewController.view = rootView;

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  self.window.rootViewController = backgroundView;
  [self.window makeKeyAndVisible];

  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
      self.window.rootViewController = rootViewController;
  });
  return YES;
}

Вопрос

Как я могу отобразить экран spla sh после раскадровки экрана запуска, чтобы охватить время между нажатием на иконку приложения и завершением загрузки приложения?

Кроме того, я хочу spla sh экран и экран запуска должны быть одинаковыми раскадровками, чтобы это было ss переход от загрузки к домашнему экрану.

Как я уже сказал, я не знаю Objective- C и был немного затруднен с отладкой этого. Может кто-нибудь предложить предложения или указать мне ресурсы, которые могли бы помочь мне здесь?

Самозащита

Я использовал чередующуюся терминологию экрана spla sh и экрана запуска, потому что Apple определяет их как 2 разных вещи. Насколько я понимаю, экран запуска предназначен для загрузки ОС из приложения, а экран spla sh предназначен для начальной загрузки в приложение.

Я также видел довольно много сильных мнений относительно экранов spla sh. Приложение имеет начальные сетевые вызовы, которые требуют короткого периода загрузки, поэтому я использую экран spla sh, чтобы покрыть эту загрузку. Я не использую его только ради того, чтобы на вашем лице было больше go.

Я знаком с другим RN-пакетом под названием response-native-bootspla sh. Я стараюсь не использовать пакет все вместе, поэтому я в первую очередь стремлюсь к этому решению.

1 Ответ

1 голос
/ 14 апреля 2020

Я предполагаю, что то, что вы видите, связано с белым экраном, о котором упоминалось во многих постах. Это связано с тем, что пакет JavaScript все еще загружается, а не потому, что у вас есть вызовы API (при условии, что они находятся в ComponentDidMount, который вызывается после render.

Хотя терминология часто взаимозаменяема, я хотел бы советуем сосредоточиться на Launch Screen, поскольку именно этим и пользуется Apple, и в их рекомендациях не рекомендуется показывать экран Spla sh.

https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/launch-screen/

Я бы хотел перефразировать вопрос для будущих зрителей

«Как сохранить мой стартовый экран при загрузке пакета JS?»

К счастью, у Reacts RCTRootView есть свойство для этого loadingView.

Дайте этому шанс,

  ...
  [self.window makeKeyAndVisible];

  UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:[NSBundle mainBundle]];
  UIViewController *launchScrenViewController = [storyboard instantiateViewControllerWithIdentifier:@"LaunchViewController"];

  launchScrenViewController.view.frame = self.window.bounds;
  rootView.loadingView = launchScrenViewController.view;

  return YES;
...