如何使用NFC重定向或打开我的Progressive Web App?

时间:2017-10-09 15:43:11

标签: android nfc progressive-web-apps

我在Android上使用Chrome的“添加到主屏幕”按钮创建了一个渐进式网络应用app.example.com

我有一个NFC标签,通常会在Chrome中点按app.example.com/nfc_app

如何点击此NFC标签,以便在点按时打开app.example.com/nfc_app PWA而不是Chrome?

2 个答案:

答案 0 :(得分:0)

添加帮助应用程序作为解决方法:

package com.something;

import android.content.Intent;
import android.net.Uri;
import android.nfc.NfcAdapter;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    private void handleNfcIntent(@Nullable Intent intent) {
        if (intent != null && NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
            //clear the intent so it doesn't come back
            intent.setAction("");
            Uri uri = intent.getData();
            if (uri != null) {
                Intent uriOnlyIntent = new Intent(Intent.ACTION_VIEW, uri);
                //call the progressive web app registered to view the uri
                startActivity(uriOnlyIntent);
            }
        }
    }

    @Override
    protected void onNewIntent(final Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
    }

    @Override
    protected void onResume() {
        super.onResume();
        //https://stackoverflow.com/a/36942185 provided the insight for handling this way
        //always called after onNewIntent and onCreate allowing a tag reward for a closed app
        handleNfcIntent(getIntent());

    }
}

您的AndroidManifest.xml会侦听您的目标网址:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.something">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <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.nfc.action.NDEF_DISCOVERED"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:host="something.com" android:scheme="https" />
            </intent-filter>
        </activity>
    </application>
</manifest>

现在,当您扫描标签时,NFC意图将由安装的应用程序处理,该应用程序转发到您的Progressive Web App注册的View Intent。

对我来说,这仅适用于Android 8,而不适用于Android 6,因为通过点击Chrome中的链接显然打开了PWA也不受支持。

一个不幸的解决方案,所以我希望能找到更好的答案。

答案 1 :(得分:0)

可以确认,Android 8,其他网站或其他应用程序上的链接打开PWA就好了,但NFC意图会打开Chrome。这是另一种解决方法,不需要您安装本机帮助程序APK:

创建一个简单的重定向HTML文件pwa.html并从其他域提供服务,比如说other.example.com:

<html>
    <body><a id="link"></a></body>
    <script type="text/javascript">
        var a = document.getElementById('link');
        // set the target link as desired, may add routes and params etc.
        a.href = "https://app.example.com/...";
        a.click();
    </script>
</html>

然后,您不必将NFC标记指向https://app.example.com,而是将其编程为指向您的重定向HTML https://other.example.com/pwa.html。它并不完美,实际上只是一种解决方法,但比构建和安装单独的APK更简单。