app.json: <meta-data android:name="asset_statements" />

To redirect from a website to google-play I have to add a <meta-data> to AndroidManifest.xml:
https://web.dev/get-installed-related-apps/

Is there an option to add configure this line via app.json:

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

Hi @doublex

I don’t know of something to do that, but it should be a pretty simple config plugin.

See withAndroidManifest and withStringsXml here:

See also:

@wodin

Thanks a lot for your answer!
I have adapted your suggestion a little:

const { AndroidConfig, withAndroidManifest, withStringsXml } = require('@expo/config-plugins');

module.exports = function androidManifestPlugin(config) {
  config = withAndroidManifest( config, async (config) => {
    const mainApplication = AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults);
    // https://web.dev/get-installed-related-apps/
    AndroidConfig.Manifest.addMetaDataItemToMainApplication(
      mainApplication,
      'asset_statements',
      '@string/asset_statements',
      'resource'
    );
    return config;
  });
  config = withStringsXml( config, async (config) => {
    config.modResults = await AndroidConfig.Strings.setStringItem(
      [
        {
          $: {
            name: 'asset_statements',
          },
          _: JSON.stringify(
            [
              {
                'relation': ['delegate_permission/common.handle_all_urls'],
                'target': {
                  'namespace': 'web',
                  'site': 'https://example.com',
                },
              },
            ]
          ),
        },
      ],
      config.modResults
    );
    return config;
  });
  return config;
};
1 Like

You could of course take the site as a prop instead of hard coding it.

Something like:

  "plugins": [
    [
      "./plugins/withAndroidPlayStoreRedirect",
      {
        "site": "https://example.com"
      }
    ]
  ]
module.exports = function withAndroidPlayStoreRedirect(config, { site }) {
// [...]

@wodin
You really know your stuff!

With help from @wodin

playstore-redirect.js:

const { AndroidConfig, withAndroidManifest, withStringsXml } = require('@expo/config-plugins');

module.exports = function withPlayStoreRedirect( config, { site } ) {
  config = withAndroidManifest( config, async (config) => {
    const mainApplication = AndroidConfig.Manifest.getMainApplicationOrThrow(config.modResults);
    // https://web.dev/get-installed-related-apps/
    AndroidConfig.Manifest.addMetaDataItemToMainApplication(
      mainApplication,
      'asset_statements',
      '@string/asset_statements',
      'resource'
    );
    return config;
  });
  config = withStringsXml( config, async (config) => {
    config.modResults = await AndroidConfig.Strings.setStringItem(
      [
        {
          $: {
            name: 'asset_statements',
          },
          _: JSON.stringify(
            (Array.isArray(site) ? site : [site]).map( site => ({
              'relation': ['delegate_permission/common.handle_all_urls'],
              'target': {
                'namespace': 'web',
                'site': site,
              },
            })) ),
        },
      ],
      config.modResults
    );
    return config;
  });
  return config;
};

app.json:

    "plugins": [
      [
        "./playstore-redirect",
        {
          "site": ["https://example.com", "https://www.example.com"]
        }
      ]
    ]
1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.