React Native: Linking.openURL выдает «Возможное отклонение необработанного обещания (id: 0): Ошибка: не удается открыть URL:»

#javascript #ios #reactjs #react-native

#javascript #iOS #reactjs #react-native

Вопрос:

Я пытаюсь создать приложение для аудио / видеозвонков с использованием React Native. В приложении есть экран, на котором выполняется вызов с использованием WebRTC. Давайте назовем это экраном «Вызов». Для отображения уведомления о вызове я использую пакет react-native-callkeep . Как только пользователь отвечает на вызов, я отправляю его прямо на экран «Вызов». Все работает нормально, за исключением случаев, когда я пытаюсь перевести пользователя на экран «Вызов».

Вот как я это делаю:

Внутри моего 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 restorableObjects))restorationHandler
{
  return [RNCallKeep application:application
           continueUserActivity:userActivity
             restorationHandler:restorationHandler];
}
  

Внутри index.js Я вызываю initCalling перед регистрацией приложения следующим образом:

 ...
initCalling();

AppRegistry.registerComponent(appName, () => App);
  

И вот что делает инициализация

 
const initCalling = () => {
  const options = {
    ios: {
      appName: 'MyApp',
      includesCallsInRecents: false,
      imageName: 'notification_icon',
      supportsVideo: true,
    },
    android: {
      alertTitle: 'Permissions required',
      alertDescription: 'This application needs to access your Calling Service',
      cancelButton: 'Cancel',
      okButton: 'ok',
      imageName: 'notification_icon',
    }
  };

  RNCallKeep.setup(options);

  function checkCallNotification(message) {
    if (!message.data.callType) {
      return;
    }
    const { threadId, messageKey } = message.data;
    RNCallKeep.displayIncomingCall(
      message.data.channelId,
      message.data.title,
      message.data.title,
      'number',
      message.data.callType === 'video',
    );
    RNCallKeep.addEventListener('answerCall', async () => {
      RNCallKeep.removeEventListener('endCall');
      RNCallKeep.endAllCalls();
      Linking.openURL(message.data.deeplink);
      RNCallKeep.removeEventListener('answerCall');
    });

    RNCallKeep.addEventListener('endCall', () => {
      RNCallKeep.endAllCalls();
      RNCallKeep.removeEventListener('endCall');
    });
  }

  messaging().setBackgroundMessageHandler(async (remoteMessage) => {
    checkCallNotification(remoteMessage);
  });

  messaging().onMessage(async (remoteMessage) => {
    checkCallNotification(remoteMessage);
  });
}

  

Когда приходит уведомление, call keep начинает показывать экран вызова. Как только пользователь отвечает на вызов, я пытаюсь перевести его на экран «Вызов», но вместо этого я получаю это

 index.bundle?platfor…amp;minify=false:41712 Possible Unhandled Promise Rejection (id: 0):
Error: Unable to open URL: myapp://call
Error: Unable to open URL: myapp://call
  

при отладке я вижу, что строка Linking.openURL(message.data.deeplink); завершается ошибкой, даже если URL-адрес правильный. И это происходит только в iOS. На Android все работает идеально. Может кто-нибудь, пожалуйста, помочь мне узнать, что я делаю не так? Спасибо!