Фильтр намерений пользовательской вкладки Android Chrome ограничен только моим приложением?

#android #intentfilter #chrome-custom-tabs

#Android #intentfilter #chrome-пользовательские вкладки

Вопрос:

Я пытаюсь добиться https://mobikul.com/use-safariviewcontroller-callback-url-objective-c / на Android, где «sourceApplication» проверяется в примере iOS и позволяет только SFSafariViewController перенаправлять обратно в приложение (предположительно, это SFSafariViewController, созданный приложением … но это другой вопрос!).

У меня возникли проблемы с достижением четности в Android. В моем приложении BrowserActivity открывается пользовательская вкладка Chrome, которая перенаправляет обратно на страницу CallbackActivity from the HTML. Chrome / любой браузер на телефоне, как я обнаружил, также может перенаправлять обратно CallbackActivity , если я просто введу правильную схему URL, и это плохая новость! Похоже, что в манифесте должен быть механизм белого списка, позволяющий перенаправлять обратно на мою активность только пользовательскую вкладку Chrome, открытую из моего приложения, и запрещать кому-либо еще. Я не могу установить android:exported="false" on CallbackActivity в манифесте, потому что это нарушает возможность перенаправления из моего приложения. Как этого можно достичь?

Вот что у меня есть для манифеста Android:

     <activity android:name="com.epicgames.ue4.SplashActivity" android:launchMode="singleTask" android:debuggable="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity android:name="com.epicgames.ue4.GameActivity" android:exported="false"> 
      <meta-data android:name="android.app.lib_name" android:value="UE4" />
    </activity>
    <activity android:name=".BrowserActivity" android:launchMode="singleTask" android:exported="false">
      <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
      </intent-filter>
    </activity>
    <activity android:name=".CallbackActivity" android:launchMode="singleTask">
      <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:scheme="customscheme" android:host="callback" />
      </intent-filter>
 

И вот что у меня есть для соответствующих действий:

 public class BrowserActivity extends Activity {
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);

        final Uri uri = Uri.parse(getIntent().getStringExtra("url"));

        final CustomTabsIntent intent = new CustomTabsIntent.Builder().build();
        intent.intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        intent.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.intent.setData(uri);

        startActivity(intent.intent);
    }
}

public class CallbackActivity extends Activity {
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);

        //TODO validate only chrome custom tab HTML, started from my app, redirected here
        //getCallingPackage() is always null and referrer host can be spoofed...how to?

        final Intent intent = new Intent(this, com.epicgames.ue4.GameActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
 
        startActivity(intent);
    }
}
 

Комментарии:

1. найдено какое-либо решение?

2. Нет! Ничего. В итоге потребовалось использовать другой компонент (сервер где-нибудь) для проверки подлинности информации об обратном вызове.