React Native 0.60+ на iOS: Code Push, Sentry, React Native Navigation v3 и AppDelegate.m

Я перешел на React Native 0.60 с 0.59, и мне не удалось заставить работать сборку iOS. Я использую плагины React Native Navigation v3, Code Push и Sentry. Как должен выглядеть мой AppDelegate.m?

Вот моя попытка, но она не работает, и при развертывании в симуляторе я получаю сообщение «Нет пакета»:

#import "AppDelegate.h"

#import <CodePush/CodePush.h>

#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#if __has_include(<React/RNSentry.h>)
#import <React/RNSentry.h> // This is used for versions of react >= 0.40
#else
#import "RNSentry.h" // This is used for versions of react < 0.40
#endif
#import <ReactNativeNavigation/ReactNativeNavigation.h>
#import <React/RCTLinkingManager.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
  return [RCTLinkingManager application:application openURL:url options:options];
}

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
 restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
  return [RCTLinkingManager application:application
                   continueUserActivity:userActivity
                     restorationHandler:restorationHandler];
}

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

  #ifdef DEBUG
    jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
  #else
    jsCodeLocation = [CodePush bundleURL];
  #endif

  [ReactNativeNavigation bootstrap:jsCodeLocation launchOptions:launchOptions];

  return YES;
}

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}

@end


comment
react-native-community.github.io/upgrade-helper — это удобный инструмент для проверки того, как должен выглядеть ваш AppDelegate.m. Также загляните сюда, чтобы узнать о проблеме с упаковщиком. github.com/facebook/react-native/issues/12754   -  person ap.dev    schedule 20.08.2019
comment
Я знаю о помощнике по обновлению. Проблема в том, что все пакеты, которые я упомянул, требуют пользовательской начальной загрузки, и поэтому инструмент не очень полезен, поскольку показывает разницу между двумя чистыми проектами.   -  person terreb    schedule 21.08.2019
comment
Кстати, помощник по обновлению не упоминает AppDelegate.m (я перехожу с 0.59.8 на 0.60.4). Я предполагаю, что это не изменилось, и то, как оно у меня сейчас, должно работать, но это не так...   -  person terreb    schedule 21.08.2019
comment
Я обновился с версии 0.50 до версии 0.60, и это была настоящая боль. IIRC Мне пришлось сделать несколько вещей в этой ссылке на проблему 12754 выше, чтобы запустить мою сборку iOS. Я особенно помню, что мне приходилось вручную связывать мой файл js (комментарий от LuckyCrab, прокомментированный 16 апреля 2018 года в этой ссылке на выпуск). Также вам не нужно импортировать эти пакеты в ваш AppDelegate.m, так как RN обрабатывает связывание в v0.60+. Возможно, вам придется вручную разъединить и (повторно) связать ваши пакеты с помощью реагирующих команд link/unlink.   -  person ap.dev    schedule 21.08.2019
comment
Используете ли вы нативную навигацию или push кода?   -  person terreb    schedule 21.08.2019
comment
Я использую реагирующую навигацию v1.5.2. Я не использую push кода.   -  person ap.dev    schedule 21.08.2019
comment
Хорошо, тогда спасибо за попытку помочь, но вы не знаете, о чем говорите. реагирующая навигация отличается от реагирующей нативной навигации. Последнее требует некоторой настройки на собственной стороне даже с последней версией RN. А также кодовый толчок и, я думаю, также часовой.   -  person terreb    schedule 21.08.2019
comment
У меня такая же проблема. Это решено? @terreb   -  person Trọng Nguyễn Công    schedule 26.08.2019
comment
@TrọngNguyễnCông, если вы используете те же пакеты/версии и у вас возникает та же ошибка из-за неправильного AppDelegate.m, см. мой ответ ниже. Если у вас такая же ошибка. Пакет отсутствует и вы не используете эти пакеты, это может быть связано с чем-то другим, и мой ответ вам не поможет.   -  person terreb    schedule 26.08.2019


Ответы (1)


Мне удалось заставить мое приложение работать. Вот обновленный AppDelegate.m:

#import "AppDelegate.h"

#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>

#import <ReactNativeNavigation/ReactNativeNavigation.h>
#import <CodePush/CodePush.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];

  [ReactNativeNavigation bootstrap:[self sourceURLForBridge: bridge] launchOptions:launchOptions];

  return YES;
}

- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
#if DEBUG
  return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
#else
  return [CodePush bundleURL];
#endif
}

@end

Для нового пакета Sentry (@sentry/react-native) никаких изменений в AppDelegate.m не требуется (по крайней мере, для версии 1.0.0-beta.7, которую я сейчас использую). Конфигурация включает в себя запуск мастера yarn sentry-wizard -i reactNative -p ios android и установку модулей cd ios && pod install.

Обратите внимание, что все вышеперечисленное работает для меня и может не работать для вас, если у вас другая настройка или у вас есть другие пакеты, требующие настройки AppDelegate.m. Протестировано с:

react: 16.8.6
react-native: 0.60.4
react-native-navigation: 3.1.0
react-native-code-push: 5.6.0
@sentry/react-native: 1.0.0-beta.7
person terreb    schedule 26.08.2019
comment
Спасибо, я решил эту проблему. Но мне нужно перезапустить приложение 2 раза после обновления, чтобы избежать сбоя приложения. - person Trọng Nguyễn Công; 09.09.2019