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

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

Он говорит:

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

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

Итак, действительно ли нужно вызвать метод getInvitation ? Для чего это именно так?

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

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

Я не верю, что вам нужно использовать 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 и т. Д., А также приложение или playstore на 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:RateMyASVAB@gmail.com")); // 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; } 

И getIdFromIntent

 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; }