web-dev-qa-db-ja.com

Androidパスプレフィックスに従わないディープリンク

私が見つけた最も近いものはこの質問でした ここ 。しかし、それは私が抱えている問題を完全にはカバーしていません。

アプリのセットアップに、パスプレフィックスとして/ appを使用するためのディープリンクがあります。私が抱えている問題は、URLのどこにも/ appがないのに、http://example.com/upgradeのようなリンクもアプリで開こうとしていることです。プレフィックスで指定されたURLを除外できないことは理解していますが、パスプレフィックスのポイント全体にそれらのURLのみを含めるのではありませんか?

基本的に私はこれらのようなリンクをディープリンクにしたいと思います:

http://example.com/app/home
http://example.com/app/specials

ただし、次のようなリンクはありません。

http://exaple.com/
http://example.com/login

マニフェストには次のようなものがあります。

<data Android:scheme="http"
    Android:Host="example.com"
    Android:pathPrefix="/app"/>

編集1

また、 このリンク が見つかりましたが、空のプレフィックスはありません。スラッシュ「/」のみが付いたプレフィックスのみです。

編集2

それをトリガーしたURLはhttp://example.com/upgrade.php?app=1&method=1&uid=1でしたが、?の後のアプリかどうかはわかりませんでした。また、それをトリガーするので、プレフィックスを/ applicationに変更しましたが、それも機能せず、それでもトリガーされます。

編集3

マニフェスト内の他のディープリンクデータタグは次のとおりです。

プロファイルアクティビティ

<data Android:scheme="myapp"
    Android:Host="profile"
    Android:pathPrefix="/"/>

ログイン/サインアップアクティビティ

<data Android:scheme="myapp"
     Android:Host="login"
     Android:pathPrefix="/signup"/>

主な活動

<data Android:scheme="myapp"
     Android:Host="main"
     Android:pathPrefix="/"/>

<data Android:scheme="http"
     Android:Host="test.example.com"
     Android:pathPrefix="/app"/>

<data Android:scheme="http"
     Android:Host="live.example.com"
     Android:pathPrefix="/app"/>

編集4

これはますます混乱を招きます。アクティビティからスキームとしてmyappを使用してデータタグを削除した場合(またはプレフィックスが「/」のすべてのものからpathPrefixを削除した場合)、WebURLからのディープリンクがトリガーされなくなりました、/ appが含まれている場合でも。

12
JStephen

データタグが互いにブリードしているように見えるので、スキーム「example」のデータのプレフィックス「/」は、他のデータタグのすべてのスキームにも適用されていました。カスタムスキームのディープリンクとURLのディープリンクに別々のインテントフィルターを使用する必要がありました。

<activity Android:name=".MainActivity">
    <intent-filter>
        <action Android:name="Android.intent.action.VIEW" />
        <category Android:name="Android.intent.category.DEFAULT" />
        <category Android:name="Android.intent.category.BROWSABLE" />

        <!-- must start with http://test.example.com/app -->
        <!-- http://test.example.com/ won't work since prefix / is in a different intent-filter -->
        <data Android:scheme="http"
            Android:Host="test.example.com"
            Android:pathPrefix="/app"/>

        <!-- must start with http://test.example.com/app -->
        <data Android:scheme="http"
            Android:Host="live.example.com"
            Android:pathPrefix="/app"/>

    </intent-filter>
    <intent-filter>
        <action Android:name="Android.intent.action.VIEW" />
        <category Android:name="Android.intent.category.DEFAULT" />
        <category Android:name="Android.intent.category.BROWSABLE" />

        <!-- must start with example://main/ -->
        <!-- http://test.example.com/ won't work since http is in a different intent-filter -->
        <data Android:scheme="example"
            Android:Host="main"
            Android:pathPrefix="/"/>

    </intent-filter>
</activity>
10
JStephen

説明したように ここ 、あなたの属性はマージされます:

同じフィルターに複数の<data>要素を含めることは可能ですが、一意のURL(スキームとホストの特定の組み合わせなど)を宣言する場合は、別々のフィルターを作成することが重要です。同じインテントフィルター内の複数の<data>要素は結合された属性のすべてのバリエーションを説明するために、実際にマージされました。

したがって、それらを<intent-filter>の個別のインスタンスに配置すると、問題が修正されます。

2
saraedum

自分でいくつかのテストを実行すると、アプリからのディープリンクのテストを続行する前に、この問題を自分で作成したと思います。

設定->アプリ名->デフォルトで起動そして選択デフォルトをクリア

次に、アプリマニフェストに戻り、各URLのアクティビティにインテントフィルターを追加します。

あなたの例ではあなたは

http://example.com/app/home
http://example.com/app/specials

上記のURIに対してこれらのそれぞれを起動するアクティビティがあると仮定します。

マニフェストのHomeActivityの場合:

<activity Android:name=".HomeActivity">
    <intent-filter>
        <action Android:name="Android.intent.action.VIEW" />
        <category Android:name="Android.intent.category.DEFAULT" />
        <category Android:name="Android.intent.category.BROWSABLE" />

        <!-- http://example.com/app/home -->
        <data Android:scheme="http"
            Android:Host="example.com"
            Android:pathPrefix="/app/home"/>

        <!-- https://example.com/app/home -->
        <data Android:scheme="https"
            Android:Host="example.com"
            Android:pathPrefix="/app/home"/>

        <!-- custom url scheme example://app/home -->
        <data Android:scheme="example"
            Android:Host="app"
            Android:pathPrefix="/home"/>
    </intent-filter>
</activity>

ターミナルからadb Shell am start -W -a Android.intent.action.VIEW -d http://example.com/app/homeadb Shell am start -W -a Android.intent.action.VIEW -d example.com/app/homeでテストします

それからあなたのSpecialsActivityのために

<activity Android:name=".SpecialsActivity">
    <intent-filter>
        <action Android:name="Android.intent.action.VIEW" />
        <category Android:name="Android.intent.category.DEFAULT" />
        <category Android:name="Android.intent.category.BROWSABLE" />

        <!-- http://example.com/app/specials -->
        <data Android:scheme="http"
            Android:Host="example.com"
            Android:pathPrefix="/app/specials"/>

        <!-- https://example.com/app/specials -->
        <data Android:scheme="https"
            Android:Host="example.com"
            Android:pathPrefix="/app/specials"/>

        <!-- custom url scheme example://app/specials -->
        <data Android:scheme="example"
            Android:Host="app"
            Android:pathPrefix="/specials"/>
    </intent-filter>
</activity>

ターミナルからadb Shell am start -W -a Android.intent.action.VIEW -d http://example.com/app/specialsadb Shell am start -W -a Android.intent.action.VIEW -d example.com/app/specialsでテストします

これはほぼ同じように機能します。アプリをhttp://example.com/ URLを処理するように設定し、デフォルトで[選択]を選択すると、アプリを使用してhttp://example.com/{anything}を開こうとします。

つまり、pathPrefixを指定するときは、本当にインターセプトしたいものを含めるようにしてください。アプリを開かないリンクをテストする場合は、デフォルトでアプリを選択せず​​、pathPrefixを調整してください。アプリによってトリガーされます。

たとえば、上記のURL しない開く

http://example.com/app

これを処理するための<data />タグを定義していないためです。

[〜#〜] update [〜#〜]そして、\または*を使用するときにドキュメントから直接追加するには:

'\'は、文字列がXMLから読み取られるときに(パターンとして解析される前に)エスケープ文字として使用されるため、ダブルエスケープする必要があります。たとえば、リテラル'*'が書き込まれます。 '\\*'として、リテラル'\''\\\\'として記述されます。これは基本的に、Javaコードで文字列を作成する場合に記述する必要があるものと同じです。

幸運と幸せなコーディング!

1
kandroidj