web-dev-qa-db-ja.com

assetlinks.jsonのアプリリンクインテントフィルターが動作しないAndroid

私のアプリはインテントフィルターを定義して、サイトによって定義されたURLを処理します。

<intent-filter Android:autoVerify="true">
  <action Android:name="Android.intent.action.VIEW"/>
  <category Android:name="Android.intent.category.DEFAULT"/>
  <category Android:name="Android.intent.category.BROWSABLE"/>
  <data Android:Host="www.Host.com" Android:scheme="http"/>
</intent-filter>
<intent-filter Android:autoVerify="true">
  <action Android:name="Android.intent.action.VIEW"/>
  <category Android:name="Android.intent.category.DEFAULT"/>
  <category Android:name="Android.intent.category.BROWSABLE"/>
  <data Android:Host="www.Host.com" Android:scheme="https"/>
</intent-filter>

アプリは正しいホストのURLを正しく検出しますが、アプリまたはブラウザーで開くかどうかをユーザーに照会します。ここで指定されているアプリリンク検証を使用してみました: https://developer.Android.com/training/app-links/index.html

私のサーバーログに見られるように、アプリをインストールするとき、デバイスは/well-known/assetlinks.jsonを照会し、200ステータスで応答します。を使用してデジタル資産ファイルをテストする

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://<domain1>:<port>&relation=delegate_permission/common.handle_all_urls

APIとエラーが見つかりませんでした。

Assetlinks.jsonファイルのSHA256は、次を使用して取得されました

keytool -list -v -keystore my-release-key.keystore 

アプリが署名されたのと同じ.keystore。

ランニング adb Shell dumpsys package dは、リンク検証ステータスが「確認」であることを返し、検証が失敗したことを意味します。検証が失敗するのはなぜですか?

34
mohamed.ahmed

私たちにとっては、Windowsの行末です!

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://domain1:port&relation=delegate_permission/common.handle_all_urls 」を使用したテストは非常に貴重であることが証明された「ステートメントリストを解析できませんでした(有効なJSONではありません)」エラーが発生したため、問題が発生しました。

ヒント:Android Studio App Links Assistantで[ファイルを保存]ボタンを使用するのは良いことでした。この問題があります。

12
Marchy

私にとっては、すべての基本をチェックすることになりました。

  1. このツールでassetLinksファイルが適切であることを確認します:(domain1:portをドメインに置き換えます) https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://domain1 :port&relation = delegate_permission/common.handle_all_urls
  2. 常に署名済みAPKでテストする
  3. テストデバイスが実行されていることを確認してくださいAndroid 6.0以降
9
Keith

あなたが二度チェックすべきいくつかの一般的な落とし穴があります(あなたが間違ったことをしたとは言いません。それは単なるチェックリストです):

  1. assetlinks.jsonが有効であり、https://example.com/.well-known/assetlinks.jsonからアクセスできるように保存されていることを確認して、https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site= https://example.com&relation=delegate_permission/common.handle_all_urlsにアクセスする必要があることを確認してください。
  2. 複数のドメインを一度にリンクする場合は、手順1ですべてのドメインが正しくセットアップされていることを確認してください。
  3. <intent-filters>タグを含む<data>の属性がAndroid:autoVerify="true"であることを確認してください。
  4. <meta-data>タグに必要な<application>タグがあることを確認します。

    <meta-data
        Android:name="asset_statements"
        Android:resource="@string/asset_statements"/>
    

    asset_statements文字列の内容は次のとおりである必要があります。

    <string name="asset_statements" translatable="false">[{\"include\": \"https://example.com/.well-known/assetlinks.json\"}]
    
  5. デバッグ用のリリース署名証明書も使用します(誤ってアップロードすることを恐れないでください)build.gradleでこれを使用します。

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            debuggable true
            signingConfig signingConfigs.release
        }
    }
    
6
rekire

更新

そこで問題を解決しました。誰がそれをやったのかわからない(組み合わせだったかもしれない)が、これは私がやったことだ:

  • 「インスタントアプリ用Google Play Services」のアンインストール:以前にインスタントアプリをいじくり回していたため、デバッグパッケージ名のように古い構成が残っている可能性があると考えましたが、これはほとんどありません。
  • プロキシの使用の停止:プロキシはネットワークコールのデバッグに役立ちますが、使用しているツールでHTTP/2が完全にサポートされていない可能性があります。
  • 従来のサブドメインのインテントフィルターを削除します:これは大きなものです。サブドメインの1つが非推奨になり、使用できなくなりました。 AndroidManifestでは、少なくとも1つのautoVerifyインテントフィルターを含むアクティビティに対して複数のホスト名が宣言されている場合、各ホストのDigital Asset Link JSONファイルがチェックされます。 autoVerifyが失敗した場合for one oneの場合、ホストはどれも自動検証されません。

元の

最初にこの問題に直面したのは、ネットワークがアプリのリンクを確認するためにGoogleのサーバーへの呼び出しをブロックしていたためです。

OPおよびその他の回答が触れられているように、一般的にエンドポイントへのAPI呼び出しは次のとおりです。

digitalassetlinks.googleapis.com

選択ダイアログをバイパスするには成功する必要があります。これはAndroidシステムがDigital Asset Link JSONファイルを検証するために行うWeb呼び出しであり、アプリのインストール/更新時に行われるようです。検索するのに役立つ場所はLogcatです。 「I/SingleHostAsyncVerifier:」というテキストが含まれるアイテムログの最後に「-> true」が表示される場合、アプリは

しかし最近、これらの呼び出しは、最近導入された可能性のあるバグと思われるものが原因で失敗しました。デバイスは上記のAPI呼び出しからこの応答を受信して​​います:

エラー:使用不可:{Host} /。well-known/assetlinks.json( '{Host} /。well-known/assetlinks.json'と同等)からステートメントをフェッチしているときに、HTTP応答ヘッダーのコンテンツタイプが間違っています:expected ' Content-Type:application/json 'ですが、{Host} ./。well-known/assetlinks.jsonからWebステートメントをフェッチしているときにtext/html [11]が見つかりました

これらのリクエストを最後に確認してからしばらく経ちましたので、以前はどのように見えたか覚えていません。しかし、App LinksまたはAndroidネットワークフレームワーク、この機能のためにプロトコルバッファーに切り替えた(そして別の機能でサポートするのを忘れていた)を含む最近の更新があった可能性があります) 。

状況が変わった可能性があることのもう1つの兆候は、今日のリクエストパスが以前の回答で言及したものと異なるように見えることです。

https://digitalassetlinks.googleapis.com/google.digitalassetlinks.v1.AssetLinks/Check

3
user3829751

私にとっては、それは私のassetlinks.jsonファイルがUTF-8であり、バイトオーダーマーク(BOM)を含んでいたという事実でした。ファイルの先頭にある3バイトのマジックナンバー。エンコードを使用プログラムに通知します。 BOMはオプションであり、明らかにGoogle/Androidツールはそれを見るのを好まない。Googleのデジタル資産リンク検証ツール(以下のURL)は、「不正なJSON」エラーを表示した。

Visual Studioを使用している場合、ファイルにBOMがあるかどうかを確認し、必要に応じて削除する方法は次のとおりです。

  1. Assetlinks.jsonファイルを右クリックします。
  2. コンテキストメニューから[...で開く]を選択します。
  3. [アプリケーションから開く]ダイアログで[バイナリエディター]を選択します。
  4. ファイルのバイト数を調べます。ファイルがEF BB BFで始まる場合、それが問題です。
  5. それらの文字を削除し(どちらかの列でこれを行うことができます)、ファイルを保存します。
  6. ファイルを再アップロードし、Googleツール(以下のURL)を使用してテストすると、正常に機能するはずです。

ファイルの確認に使用できるURLは次のとおりです(example.comを実際のURLに置き換えてください)。

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://example.com&relation=delegate_permission/common.handle_all_urls

2
Brian Rak

2つの場合のシステムアプリ選択ウィンドウ

1)ユーザーは、設定>アプリ>ギアアイコン>リンクを開く>アプリを選択する>サポートされているリンクを開く>毎回プロンプトを選択することで、リンクを開く関連設定を変更します。

2)デフォルトのアプリはユーザーによって設定されておらず、アプリのリンクがサポートされているアプリのいずれかで自動検証が有効になっていません

あなたの場合、自動検証が有効になっていると思いますので、ユーザー設定を確認してください。

0
Arnav Rao

私にとっては、assetlinks.jsonトリミングを含む空白および改行

0
TonnyL

私の場合、adb Shell dumpsys package dは、packageNameassetlinks.jsonで正しく構成されていないことを明らかにしました。 AndroidManifest.xmlpackageタグのmanifest属性値を使用していましたが、Android.defaultConfig.packageIdファイルでbuild.gradle値を使用する必要がありました。

0
asciimo