Как получить начальную ссылку для iOS, используя активные нативные ссылки firebase c? - PullRequest
2 голосов
/ 22 января 2020

Я использую response-native-firebase :: 5.6.0, у меня проблема при получении начальной ссылки для устройства iOS. На android работает нормально. Я использую «Firebase Dynami c Links» для перенаправления пользователя на экран входа в систему моего приложения, если он не вошел в приложение, иначе просто открываю приложение, если он уже вошел в систему. Это работает для приложения android, но возникли проблемы с ios приложением. Я использовал две функции: одна ссылка get Dynami c, если приложение закрыто "getInitialLink", а другая - проверка открытия приложения "onLink".

Это функция, которую я использую после закрытия spla Экран sh, вызывается только один раз при открытии приложения из состояния закрытия.

firebase.links().getInitialLink().then((url) => {
    if (url && url === 'https://mycustomdomain.co.in') {
        navigationToScreen(AUTH, INITIAL_SCREEN);
    } else {
        // INITIALIZE APP HERE
    }
});

Если приложение уже открыто, я получаю динамическое c значение URL ссылки внутри этой функции ::

this.unsubscribeHandleOpenAppDynamicLinks = firebase.links().onLink(async (url) => {
    let isLoggedIn = await AsyncStorage.getItem(LocalStorageKeys.IS_LOGGEDIN);
    if (url) {
        if ( isLoggedIn !== 'yes' && url === 'https://mycustomdomain.co.in') {
            navigationToScreen(AUTH, INITIAL_SCREEN);
        }
    }
});


and clearing that listener on componentWillUnmount:: this.unsubscribeHandleOpenAppDynamicLinks();

В случае iOS работает только функция "onLink", и я получаю значение URL как "undefined". Функция getInitialLink () возвращает URL-адрес, с которого было запущено приложение. Если приложение не было запущено с URL-адреса, возвращаемое значение будет нулевым, но я получаю «неопределенное» даже при запуске приложения с URL-адреса только в случае iOS. Я получаю URL внутри onLink () в случае iOS при запуске приложения. Почему это происходит ??

Пожалуйста, подскажите, что я здесь не так делаю.

1 Ответ

2 голосов
/ 01 марта 2020

Если метод getInitialLink не работает, это либо из-за неправильного соединения, либо из-за времени выполнения Expo. В качестве альтернативы используйте метод Linking.getInitialURL для получения начального URL. Это также требует немного нативного кода. Это связано с тем, что модуль Linking не знает, как интерпретировать сокращенный URL. Итак, мы вызываем resolveShortLink метод Firebase SDK, чтобы получить встроенную глубокую ссылку. Получив встроенную глубокую ссылку, мы можем обрабатывать ее как обычно в нашем приложении.

Собственный исходный код задокументирован в этой статье . Но для полноты я выложу его здесь.

#import "FDLResolver.h"
#import <React/RCTLog.h>

@implementation FDLResolver

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(resolveShortLink:(NSString *)shortLink :(RCTPromiseResolveBlock)resolve
    :(RCTPromiseRejectBlock)reject)
{
    id completion = ^(NSURL *_Nullable dynamicLink, NSError *_Nullable error) {
      if (!error && dynamicLink) {
        resolve(dynamicLink.absoluteString);
      } else {
          reject(@"Error", @"Error in getting dynamic link", error);
      }
    };

    NSURL *shortLinkURL = [NSURL URLWithString:shortLink];
    [[FIRDynamicLinks dynamicLinks] resolveShortLink:shortLinkURL completion:completion];
}

@end

И код модуля связывания приведен ниже.

Linking.getInitialURL().then(url => {
  if (url && url.includes('page.link')) {
    const shortLink = url.replace('exps', 'https')
    NativeModules.FDLResolver.resolveShortLink(shortLink)
      .then(link => {
        const linkParts = link.split('?')
        const query = qs.parse(linkParts[1])
        this.parseRouteUrl(query.deep_link_id)
      })
  }
})
...