ホームページ  >  記事  >  ウェブフロントエンド  >  H5を介してローカルアプリを呼び出す方法の詳細な説明

H5を介してローカルアプリを呼び出す方法の詳細な説明

小云云
小云云オリジナル
2017-12-13 10:28:0814753ブラウズ

H5 はどのように携帯電話でローカル アプリを開いたり呼び出したりするのですか? Baidu と Google での回答を見ると 2 種類しかありません: この記事では主に H5 (ブラウザー) を通じてローカル アプリを呼び出す方法に関する関連情報を紹介します。 /WebView/others) 編集者はこれが非常に優れていると考えているので、皆さんの参考になれば幸いです。

最初の方法:

HTML の a タグ内の href で Android 側のスキーマを直接設定します。 もちろん、他のホスト設定がある場合は、それに従うだけです。次のように:

Android 側の設定:

    <activity android:name = ".MainActivity">
        <intent-filter>
            <action android:name = "android.intent.action.MAIN" />
            <category android:name = "android.intent.category.LAUNCHER" />
        </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"/>
            <data            android:host="jingewenku.com"
                             android:scheme="abraham"/>
        </intent-filter>
    </activity>

注: これが起動ページで設定されている場合は、ラベルと並べて配置する必要があります。そうしないと、実行後にモバイル アプリのアイコンが表示されません。例外!

<html>
       <head>
       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
                      <title>Insert title here</title>
       </head> 
        <body> 
            <a href="abraham://jingewenku.com/?pid=1">打开app</a><br/>
        </body>
</html>

スキーマ スプライシング プロトコルの形式を見てみましょう。各プロジェクトの意味は次のとおりです:

スキーム: 開始されたアプリを決定します。 ※詳しくは後述

host: 適当な記述

path: 値を渡す際に必要なキー ※なくても大丈夫

query: 値のKeyとValueを取得 ※なくても大丈夫もちろん、これはアプリが存在する場合に限ります。それ以外の場合は応答がありません。

Android で設定されているスキーマ プロトコルは上記の HTML コードで設定されているのではないかと疑問に思われるかもしれません。明らかに pid を設定していないのに、なぜこれを書く必要があるのでしょうか?これは、ローカル アプリを呼び出すときに、いくつかのパラメーターをアプリに渡す場合があるためです。これらのパラメーターは、oncreate で取得するだけで済みます。 Android で設定されたスキーマ プロトコルを取得したい場合は、次のようにすることもできます:

< a href="[scheme]://[host]/[path]?[query]">启动应用程序< /a>

スキーマが有効かどうかを判断する方法:

Intent intent = getIntent();
    Uri uri = intent.getData();
    if (uri != null) {
        String pid = uri.getQueryParameter("pid");
    }

この方法は、Android で最も人気のある方法でもあります。 Baidu しかし、これは問題を引き起こします。上記の要件は、「ページにリンクがあります。ユーザーが APP をインストールしている場合は、クリックして対応する APP を開きます。ユーザーがインストールしていない場合は、クリックして対応する APP を開きます」と述べています。設定接続。」 これは明らかに要件を満たしておらず、一部の個別の要件としてのみ使用できます。

2 番目の方法:

href でスキーマ プロトコルを構成することはできないため、JS コードを通じてのみ実現できます。この方法でのみ、アプリが利用可能なときに判断に従って開き、利用可能なときにジャンプできます。ダウンロードリンクにアクセスしてダウンロードしてください。

js は特定のアプリが携帯電話にインストールされているかどうかを判断できないことを知っているため、曲線を通じてのみ国を保存できます。アプリが長時間呼び出されない場合は、デフォルトの時間が取得されます。アプリがインストールされていない場合は、ダウンロードページに移動します。もちろん、これは私が考えたものではなく、インターネット上のみんなのアイデアです。ここで、それを 2 つの状況に分類する必要があります。

1. 直接ウェイクアップ

手順: たとえば、URL にアクセスし、ボタンをクリックしてアプリケーションを開き、アプリケーション APP がインストールされていない場合は、そのアプリケーションに直接ジャンプします。 App Store の APP ダウンロード ページをクリックすると、この方法は互換性が高く、アプリがインストールされている場合は、主要なモバイル ブラウザー (360 ブラウザー、uc ブラウザー、Sogou ブラウザー、QQ ブラウザー、Baidu ブラウザー) および QQ クライアントで起動できます。 WeChat、Sina Weibo クライアント、Tencent Weibo クライアントは起動できません。

コードは次のとおりです:

Uri uri = getIntent().getData();
if(uri != null) {
 // 完整的url信息
 String url = uri.toString();
 Log.e(TAG, "url: "  + uri);
 // scheme部分
 String scheme = uri.getScheme();
 Log.e(TAG, "scheme: "  + scheme);
 // host部分
 String host = uri.getHost();
 Log.e(TAG, "host: "  + host);
 //port部分
 int port = uri.getPort();
 Log.e(TAG, "host: "  + port);
 // 访问路劲
 String path = uri.getPath();
 Log.e(TAG, "path: "  + path);
 List<String> pathSegments = uri.getPathSegments();
 // Query部分
 String query = uri.getQuery();
 Log.e(TAG, "query: "  + query);
 //获取指定参数值
 String goodsId = uri.getQueryParameter("goodsId");
 Log.e(TAG, "goodsId: "  + goodsId);
}

2. クリックして起動します

手順: URL にアクセスすると、アプリケーションを直接起動できます。 APP がインストールされていない場合は、App Store の APP ダウンロード ページに直接ジャンプします。互換性は平均的です。すべての主要な携帯電話ブラウザ (360 ブラウザ、uc ブラウザ、Sogou ブラウザ、QQ ブラウザ、Baidu ブラウザ) で起動できます。 WeChat、QQ クライアント、Sina Weibo クライアント、Tencent Weibo クライアントは起動できません。


コードは次のとおりです:

PackageManager packageManager = getPackageManager();
Intent intent = newIntent(Intent.ACTION_VIEW, Uri.parse("abraham://jingewenku.com:8888/goodsDetail?goodsId=10011002"));
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
booleanisValid = !activities.isEmpty();
if(isValid) {
 startActivity(intent);
}

これで私たちのニーズは完了しました。その過程で、最初は私のニーズを理解できず、考えていた人々もここに記録します。 Android 側で実装されています。パッケージ名を通じてアプリがインストールされているかどうかを確認します。コードは次のとおりです。

その他のメソッドについては、私のツール クラスを確認してください。

その他、アプリにWebViewをロードしてローカルアプリを起動したいと考えました。コードは次のとおりです。

また、WeChat でローカル アプリを呼び出す場合、携帯電話の WeChat は WeChat の組み込みブラウザを使用することにも注意してください (サーバー上で以前に取得したページのアドレスを連絡先に送信できます。[送信] をクリックします) Web ページを開くためのメッセージ) その単純な HTML ページを開きます。 注: Schema://host/datastring を直接開くことはできません。WeChat はこの文字列を URL に解析しません。 WeChatを使用するためのページが開きます。入力すると、先ほどデザインしたページが表示されます。現時点では、「アプリケーションの開始」を直接クリックしても、以前にインストールしたアプリは起動しません。WeChat がブロックしているため、右上隅のメニューから「ブラウザで開く」を選択する必要があります。このとき、一部のブラウザは起動できますが、一部のブラウザは起動できません。たとえば、作者のテスト マシン MX4 の内蔵ブラウザが動作しない場合、UC Browser が起動する可能性があります。いくつかのブラウザは起動できません。私は多くの情報を調べましたが、完全に解決することはできません。今考えられるのは、問題が発生したブラウザをフロントエンドに判断させることです。サポートされていないので、どのブラウザを使用する必要がありますか。解決策を知っている読者の方がいらっしゃいましたら、メッセージを残してください。ありがとうございます。

追記:

WeChat でアプリを起動できず、「ブラウザで開く」必要があるのはなぜですか?

WeChat はすべての共有接続にスキーム シールドを実装しているため、つまり、共有接続内のスキームへのすべての呼び出しが WeChat によってブロックされています。

では、なぜ Dianping や Didi Taxi などの一部のアプリが刺激的なのでしょうか?

非技術的な観点から見ると、Dianping と Didi Taxi は両方とも WeChat の名付け子であり、実子です。彼は息子に対して特別な配慮を持っています。

技術的な観点から見ると、WeChat にはホワイトリストがあり、ホワイトリスト内の共有接続に対してスキーム呼び出しはブロックされません。

理解できない?例を挙げてみましょう。

たとえば、Dianping の共有リンクは http://dazhongdianping.share.1.com です

WeChat ホワイトリストに対応して、このリンクから発信されるすべての共有スキームはブロックされません。

http://dazhongdianping.share.2.comなど
http://dazhongdianping.share.3.com

Dianpingの子会社でもhttp://zigongsi.dazhongdianping.com、ルート ドメイン名もホワイトリストに含まれているため、使用することもできます。

現時点では、共有リンクを Dianping のルート ドメイン名にリンクできない限り、Dianping のスキームを借用してこの問題を回避することは不可能であることを誰もが理解する必要があります。

さらに、WeChat は APK のダウンロードなどのあらゆるアプリケーションをブロックするため、ダウンロード リンクを提供したい場合は、息子であるかどうかに関係なく、逃れることはできません。ブラウザの使用

付録: 共通アプリケーション URL スキーム

1、システムデフォルトアプリケーション


sms://メールmailto://iBooksibooks://App Storeitms-apps://itunes.apple.com 音楽music://動画videos://

2. 一般的に使用されるサードパーティ ソフトウェア


名前 URL スキーム バンドル識別子
Safari html
名前 URL スキーム バンドル識別子
QQ mqq://
WeChat 微信: //
テンセント微博 テンセント微博://
タオバオ タオバオ://
Alipay alipay://
Weibo sinaweibo://
weico微博 weico://
QQブラウザ mqqbrowser:// com.tencent.mttlite
UCブラウザ ドルフィン:// com.dolphin.browser.iphone.chinese
ブラウザを開く ohttp:// com.oupeng.mini
Sogouブラウザ SogouMSE:// com.sogou .SogouExplorerMobile
Baidu Map baidumap:// com.baidu.map
Chrome googlechrome://
Youku youku://
JD openapp.jdmoble://
人人 renren://
Meituan imeituan://
1 ハオディアン wccbyihaodian:/ /
チェックしてます wcc://
Youdao Dictionary yddictproapp://
Zhihu zhihu: //
レビュー dianping://
microdisk sinavdisk://
doubanfm doubanradi o://
NetEase public Le sson ntesopen://
名刺の万能王 camcard://
QQ Music qqmusic://
TEN ニュースビデオ tenvideo://
Douban Movie doubanmovie://
NetEase Cloud Music orpheus://
NetEase News newsapp://
NetEase アプリケーション apper:/ /
NetEase Lottery ntescaipiao://
Youdao Cloud Notes youdaonote://
もっと見る duokan-reader ://
全国大気質指数 dirtybeijing://
Baidu Music baidumusic://
キッチンへ x cfapp://

H5 でマルチスレッドを使用して Web ワーカーを実装する方法

H5 がデスクトップ通知とプロンプト機能を実装する方法の例

H5 でカスタム プロパティを取得および設定する方法

以上がH5を介してローカルアプリを呼び出す方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。