有没有一种方法可以在Google Play上提交ReactJS PWA?

3

我想使用“一次编写,到处运行”。

因此,我使用create-react-app在reactjs中创建了一个PWA。

我的应用程序工作得非常好,我可以从网站将其放置在移动设备的主屏幕上。 但是,我也想在移动应用商店(从Google Play开始)中可见。

我尝试过:

今天是否有一种方法可以在商店中部署reactjs PWA应用程序? 这将实现我对渐进式Web应用程序的美好梦想 :)


PWABuilder出了什么问题?您能否在PWABuilder的GitHub存储库上提交一个问题?https://github.com/pwa-builder/PWABuilder/issues - Mark Szabo
4个回答

1
几个月前,我开发了一个使用Cordova / Phonegap的小型ReactJS应用程序,它实际上可以运行,所以我认为您需要注意一些细节才能使您的应用程序正常工作。
首先,您是否在引导ReactJS之前等待了deviceready事件? 您的入口点应该像这样(代码相当老,我在旧的AngularJS应用中使用它,并进行了适当的修改以启动ReactJS)。
var appName = 'myApp';

var PhoneGapInit = function (appName) {
  this.boot = function (appName) {
    ReactDOM.render(
        <Router>
          <Route exact path="*" component={ApplicationAsync} />
        </Router>,
        document.getElementById('root')
      );
  };

  if (window.cordova !== undefined) {
    // "Found Cordova";
    var self = this;
    document.addEventListener('deviceready', function() {
      self.boot(appName);
    }, false);

    return;
  }

  // 'PhoneGap not found, booting manually';
  this.boot(appName);
};

window.addEventListener('load', () => {
  new PhoneGapInit(appName);
});

第二,使用Webpack时我发现需要使用这个Webpack插件才能使cordova对象可用,https://github.com/markmarijnissen/webpack-cordova-plugin(所有内容都在那里解释)。
此外,您的index.html应该包含一个像这样的body标签。
<body>
    <noscript>
      You need to enable JavaScript to run this app.
    </noscript>
    <div id="root"></div>
    <script type="text/javascript" src="cordova.js"></script>
</body>

第一步应该足以使您的应用程序运行。

此外,重要的是要知道,使用Chrome可以访问控制台以查看应用程序中正在发生的情况,只需按照以下步骤操作:

  1. 连接已安装应用程序的设备(必须是DEBUG版本,而不是发布版本)
  2. 打开Chrome控制台,在最后一个选项卡附近,您应该会看到一个三个竖点的图标,请单击它并选择“更多工具”,然后选择“远程设备”,您应该会看到列出了连接的设备。选择它
  3. 在列表中找到您的应用程序并单击“检查”按钮,此时您应该也在Chrome浏览器中打开了应用程序。

希望这有所帮助


谢谢你的回答Sergio。根据你在Chrome中的调试建议,我能够理解到一些资源未被找到。使用create-react-app时,有一个PUBLIC_URL未填写。 浏览器似乎对路径解析中的此错误很宽容,但安卓不是。添加了一个文件后,一切都很好! - user1864070

1
问题是关于create-react-app PUBLIC_URL环境变量未填充的问题。
使用cordova run browser,所有似乎都很好,因为浏览器在路径解析方面更加宽容。 我有一个例子是/favicon.ico 但是当我执行cordova run android时,运行时找不到路径。
通过创建一个新文件.env并将其放入其中:
PUBLIC_URL=.

已解决路径错误,应用程序现在运行良好!

Sergio建议使用chrome在设备上运行chrome://inspect非常有帮助


0

是的,有一种方法可以将您的PWAs发布到PlayStore。

TWAs

可信任的Web活动是一种新的方式,可以使用基于自定义选项卡的协议将您的Web应用程序内容(例如PWA)与Android应用程序集成。

TWAs使用数字资产链接协议和API使应用程序或网站可以公开、可验证地声明其他应用程序或网站。例如,网站可以声明它与特定的Android应用程序相关联,或者它可以声明它想要与另一个网站共享用户凭据。

请查看以下链接,了解由Google Developers论坛发布PWA到Appstore的完整指南以及由Maximiliano Firtman在medium上的教程指南这里


0
简单的答案是目前没有直接将您的PWA添加到Google Play商店、苹果iTunes或微软应用商店的方法。但是,您可以直接将您的PWA添加到亚马逊应用商店。对于其他商店,您需要先为其创建一个包装器,然后将包装器包部署到商店中。由于您特别问及Google Play商店,您基本上需要两个文件(见下文),以及一些支持文件,当您在Android Studio(或类似环境)中创建新的Android项目时,这些文件将自动为您创建。您需要一个启动您的PWA起始URL的主要活动,例如:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView webView = (WebView) findViewById(R.id.webview);
    WebSettings webSettings = webView.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDomStorageEnabled(true);
    webSettings.setDatabaseEnabled(true);
    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            view.loadUrl("about:blank");
            Toast.makeText(MainActivity.this,
                    "Failed loading initial resources. Online access is needed when starting the app up for the first time. Close and try again with network connectivity", Toast.LENGTH_LONG).show();
            super.onReceivedError(view, request, error);
        }
    });
    webView.loadUrl(APPLICATION_URL);
}
}

您不需要一个 XML 布局文件(您可以在代码中创建 WebView),但是如果您喜欢在 xml 中配置选项,那么它会类似于这样:

<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mypackage.myapp.MainActivity"/>

最后,您需要AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mypackage.myapp">
<uses-permission android:name="android.permission.INTERNET"/>
<application
        android:allowBackup="true"
        android:icon="@mipmap/my_logo"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/my_logo"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
    <activity android:name=".MainActivity"
              android:configChanges="keyboardHidden|orientation|screenSize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>
</manifest>

然后,您需要Android构建工具来创建您的包。如果您已经下载了Android Studio,则准备就绪。好处是,一旦发布了您的包装应用程序,您不需要进行太多更改,只需专注于更新您的PWA。

对于Microsoft应用商店,该过程类似。您不一定需要Visual Studio。您可以使用PWABuilder的包作为基础,删除您不需要的任何内容,并使用(Windows)命令行工具创建“应用程序包上传文件”

对于iTunes,您需要另一个包装器,据我所知,创建包装器的唯一方法是使用(苹果的)Xcode IDE。


这是我在Google Play商店上发布的一个小型PWA应用程序(包装器)之一:https://play.google.com/store/apps/details?id=com.coachaide.tacticboard.soccer&hl=en_US,实际的PWA可在https://soccer.coachaide.com上获得。 - Kalle
刚刚测试了你的解决方案。好的一点是包装很好,但是我失去了“离线”部分:应用程序尝试在每次启动时加载网站,而不是保留旧启动的数据,直到获得最新的数据。 - user1864070
1
你确定你的服务工作线程缓存运行正确吗?如果是这样,请确保你已经正确配置了你的WebView(需要同时设置webSettings.setDomStorageEnabled(true)和webSettings.setDatabaseEnabled(true)来使缓存存储正常工作)。最后,确保你的索引/启动页面可被缓存。如果你将CoachAide安装为应用程序(带有包装器),你会发现离线模式可以正常工作。 - Kalle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接