2015-12-14 5 views
8

私が見つけた最も近いのは、この質問hereでした。それは私が持っている問題をかなりカバーしていません。パスの接頭辞に従わないAndroidディープリンク

アプリのセットアップで、/ 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

this linkが見つかりましたが、私は2

それはhttp://example.com/upgrade.php?app=1&method=1&uid=1たトリガされたURLに「/」

編集空の接頭辞、単にスラッシュだけのものを持っていけない、私は、もし確認されませんでしたアプリは?私は接頭辞を/ applicationに変更しましたが、それもうまくいきませんでした。

プロフィール活動

<data android:scheme="myapp" 
    android:host="profile" 
    android:pathPrefix="/"/> 

ログイン/サインアップ活動

<data android:scheme="myapp" 
    android:host="login" 
    android:pathPrefix="/signup"/> 

主な活動:ここで編集3

は、マニフェスト内の他のディープリンクデータタグです

<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はを削除する場合/ ")、ウェブURLからのディープリンクを(たとえそれらに/ appがあっても)引き起こさなくなりました。>あなたのアプリケーション名 - - デフォルトによって>を起動してアプリから任意のより多くのディープリンクをテストするために続けること

設定]に行く前に、私はあなたがこの問題を自分で作成していると思う自分でいくつかのテストを実行する

+0

マニフェストには「」タグしかありませんか? –

+0

私は3つのアクティビティを持っていますが、2つのアクティビティにはそれぞれ1つあります。 – JStephen

+0

はexample.comを使用している唯一のものですが、他のものは自分のアプリ名をスキームとして使いますが、それらのうちのいくつかはプレフィックスとして "/"を使いますが、httpスキームを使用するものはすべて "/ app" – JStephen

答えて

1

あなたの例では、あなたが

を求める:とその後戻ってあなたのアプリマニフェストに移動して、各URLのためにあなたの活動にインテントフィルタを追加 クリアデフォルト

を選択

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

私はあなたが上記のURIのためにこれらのそれぞれを発売する活性を有していると仮定するつもりです。マニフェストDOでHomeActivityため

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

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

テストあなたの端末から

、あなたの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/{anything}を開こうとするつもりは、デフォルトで選択http://example.com/ URLを処理し、選択するためにあなたのアプリを設定している場合、あなたのPathprefixは、あなたはあなたが本当にインターセプトすると、あなたのアプリを開くべきではありませんリンクをテストする場合、デフォルトでは、あなたのアプリを選択していない、それはあなたのアプリケーションによってトリガーされることはありませんので、ちょうどあなたのPathprefixはを調整したいものを含めることを確認してください。例えば

うではない

http://example.com/app 

オープン上記のURL私たちは、これを処理する <data />タグを定義していないので。

UPDATE と\またはを使用した場合のドキュメントからまっすぐに追加する*:それはパターンとして解析される前に、文字列は(XMLから読み込まれるエスケープ文字として使用されている

'\'ので)、あなたは二重のエスケープする必要があります。たとえば、リテラル'*''\\*'として書き込まれるとリテラル'\''\\\\'のように書かれることになります。これは基本的に、Javaコードで文字列を作成する場合に書く必要があるものと同じです。

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

+0

これはおそらく動作しますが、プレフィックスを持たないカスタムスキームを使用する既存のディープリンクもあります。例えば、 'example :// main/'メインページに行くだけで、いくつかはメインアクティビティの特定のフラグメントを' example:// main/settings'のように開きます。最初のものを取り除き、これまでのプレフィックスything。しかし、それは私が深いリンクを変更する必要があります。 – JStephen

8

私はそれを理解しました、データタグのようなものがありますので、スキーム "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> 
0

としてはhereを説明し、あなたの属性はマージされ得る:

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

<intent-filter>の個別のインスタンスに入れると、問題が解決されます。

関連する問題