Firebase Android: обрабатывать глубокие ссылки

В документации Firebase:

он говорит:

Чтобы получить ссылку на контент, вызовите метод getInvitation.

Однако глубокие ссылки, сохранившиеся после установки, похоже, работают даже без реализации описанного там кода.

Итак, действительно ли необходимо вызывать метод getInvitation? для чего именно?


person Daniele B    schedule 04.10.2016    source источник


Ответы (2)


getInvitation() предназначен для обработки глубинных ссылок. Рекомендуется реализовать его, как описано здесь:

Вы должны вызывать getInvitation() в каждом действии, которое может быть запущено по ссылке, даже если ссылка может быть доступна из намерения с помощью getIntent().getData(). Вызов getInvitation() извлекает ссылку и очищает эти данные, поэтому они обрабатываются вашим приложением только один раз.

person random    schedule 07.10.2016
comment
Являются ли извлечение ссылок и очистка данных единственными функциями getInvitation()? Я уже справился с этим самостоятельно. - person Daniele B; 07.10.2016
comment
Это то, что упоминается в ссылке. Если бы вы могли справиться с этим самостоятельно, я думаю, вы можете игнорировать эту функцию. - person random; 07.10.2016

Я не верю, что вам нужно использовать getInvitation(). Лично я просто переопределяю onNewIntent следующим образом:

@Override
protected void onNewIntent(final Intent intent) {
  super.onNewIntent(intent);
  if (intent.getAction().equals("android.intent.action.VIEW")) {
    new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
        handleItemId(getIdFromIntent(intent));
      }
    }, 50);
  }
}

Я установил обработчик с postDelayed, чтобы разрешить настройку активности. Вам не нужно этого делать.

У вас должен быть настроен фильтр намерений, подобный этому

    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:host="yourwebsite.com" android:scheme="http"/>
        <data android:host="yourwebsite.com" android:scheme="https"/>
        <data android:host="anything" android:scheme="yourappname"/>
    </intent-filter>

Затем динамический URL-адрес https://*****.app.goo.gl/?link=http://yourwebsite.com&al=yourappname://anything/method&apn=com.yourwebsite.yourappname должен открыть ваш веб-сайт на настольной iOS и т. д., а также приложение или магазин игр на Android.

Чтобы получать глубокие ссылки из поисковых запросов Google, которые скрыты от ссылок на вашем веб-сайте к фрагментам в вашем приложении, вы должны определить их. Мои методы handleItemId и getIdFromIntent определены следующим образом.

public boolean handleItemId(int id) {
  if (id == R.id.nav_home) {
    fragment = new FragmentHome();

  } else if (id == R.id.nav_favorites) {
    fragment = new FragmentFavoritesPager();

  } else if (id == R.id.nav_contact) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:[email protected]")); // only email apps should handle this
    if (intent.resolveActivity(getPackageManager()) != null) {
      startActivity(intent);
    } else {
      Toast.makeText(this, "No email app is installed", Toast.LENGTH_LONG).show();
    }
    return false;

  } else if (id == R.id.nav_settings) {
    fragment = new FragmentSettings();

  } else {
    return false;
  }
  new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
      getSupportFragmentManager()
          .beginTransaction()
          .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
          .replace(R.id.content_main, fragment)
          .commitAllowingStateLoss();
    }
  },400);
  return true;
}

И получитьIdFromIntent

private int getIdFromIntent(Intent intent) {
  int id = R.id.nav_home;
  if (intent.getData() != null) {
    List<String> segments = intent.getData().getPathSegments();
    if (segments.size() > 0) {
      switch (segments.get(0)) {
        case "favorites":
          id = R.id.nav_favorites;
          break;
        case "contact":
          id = R.id.nav_contact;
          break;
        case "settings":
          id = R.id.nav_settings;
          break;
      }
    }
  }
  return id;
}
person Johnathon Havens    schedule 11.10.2016