Config-файл не работает в config.xml в кордове

Относится к edit-config не работает в config.xml в кордове

❯ cordova --version
6.5.0

Я хотел бы добавить в AndroidManifest.xml следующую конфигурацию

<intent-filter>
  <action android:name="android.intent.action.SEND" />
  <action android:name="android.intent.action.SEND_MULTIPLE" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:mimeType="*/*" />
</intent-filter>

Я проверил официальные документы Cordova, из которого следующий пример

<config-file target="AndroidManifest.xml" parent="/manifest/application">
  <activity android:name="com.foo.Foo" android:label="@string/app_name">
    <intent-filter></intent-filter>
  </activity>
</config-file>

Итак, я добавил следующий блок в свой файл config.xml

<config-file target="AndroidManifest.xml" platform="android" parent="/manifest/application/activity" mode="merge">
  <intent-filter>
    <action android:name="android.intent.action.SEND" />
    <action android:name="android.intent.action.SEND_MULTIPLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="*/*" />
  </intent-filter>
</config-file>

💔 Безуспешно.

Примечание: Я использую этот плагин darryncampbell-cordova-plugin-intent, который использует тег config-file в своем файле plugin.xml. Но этот же тег не работает с файлом config.xml.

Пока все хорошо, я постарался еще раз с другой документацией. Как объяснено в устаревший плагин cordova-plugin-intent

It is recommended to use a hook or the custom config plugin to ensure that the above XML will automatically added in case you want to have a fresh checkout or remove/add the platform.

Итак, я пошел к рекомендуемый плагин cordova-custom-config, также указанному в связанный вопрос о теге edit-config. И документация этого плагина говорит мне то же самое, что и официальная документация Cordova о теге config-file в config.xml

However: recent versions of the Cordova/Phonegap CLI have added official support for and blocks in the config.xml (previously they only worked in plugin.xml).

So if all you want to do is insert a block of native config or change a native preference, you probably don't need this plugin at all.

Мне удалось использовать edit-config для слияния настраиваемого атрибута из config.xml в AndroidManifest.xml, как показано ниже зеленым цветом.

Но я до сих пор не знаю, как использовать config-file для обновления AndroidManifest.xml, как показано выше красным.

❓ Итак, вопрос: действительно ли документация Cordova неверна относительно config-file? Какое лучшее решение в 2018 году для добавления пользовательского intent-filter к AndroidManifest.xml?


Замечание о Кордова-заказ-конфигурация

Добавляю в config.xml

<platform name="android">
  <allow-intent href="market:*" />
  <custom-config-file target="AndroidManifest.xml" parent="./application/activity">
    <intent-filter>
      <action android:name="android.intent.action.SEND" />
      <action android:name="android.intent.action.SEND_MULTIPLE" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:mimeType="*/*" />
    </intent-filter>
  </custom-config-file>
</platform>

И плагин применил кастомную конфигурацию с config.xml на AndroidManifest.xml.

<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
  <intent-filter>
    <action android:name="android.intent.action.SEND" />
    <action android:name="android.intent.action.SEND_MULTIPLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="*/*" />
  </intent-filter>
  <intent-filter>
    <action android:name="com.darryncampbell.cordova.plugin.intent.ACTION" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Но пользовательский intent-filter не был добавлен в список intent-filter, а заменил первый, который был

<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
  <intent-filter android:label="@string/launcher_name">
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  <intent-filter>
    <action android:name="com.darryncampbell.cordova.plugin.intent.ACTION" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>
3
0
2 856
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Когда вы используете cordova-custom-config для установки элементов <intent-filter> с несколькими родственниками, вы должны убедиться, что они имеют уникальный атрибут метки, такой как плагин отличает их лейблом. Вы можете увидеть это проиллюстрировано в пример проекта.

Так что-то вроде этого:

<custom-config-file target="AndroidManifest.xml" parent="./application/activity/[@android:name='MainActivity']">
    <intent-filter android:label="custom_filter">
        <action android:name="android.intent.action.SEND" />
        <action android:name="android.intent.action.SEND_MULTIPLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="*/*" />
    </intent-filter>
</custom-config-file>

Отказ от ответственности: я являюсь автором cordova-custom-config

❤️ Большое спасибо за вашу заботу! Я попытался установить android:label на свой собственный тег intent-filter. Но тот, у которого есть android:label="@string/launcher_name" (см. Подробности и контекст моего вопроса), все равно заменен. Без него приложение больше не отображается в лаунчере.

enguerran 11.04.2018 14:45

Возможно, вам потребуется установить родительский элемент, чтобы он точно соответствовал что ожидает плагин - см. Значение родительского атрибута в моем ответе на обновление

DaveAlden 11.04.2018 14:49

Изменяя атрибут parent, он работает как шарм! Большое вам спасибо!

enguerran 11.04.2018 14:53

Я жду, появится ли ответ о встроенной поддержке Cordova, в противном случае я подтверждаю ваш ответ, позволяющий двигаться дальше.

enguerran 11.04.2018 14:55

Текущая проблема со встроенной поддержкой <config-file> в Cordova CLI заключается в том, что блоки <config-file> в config.xml применяются до значений по умолчанию, которые Cordova устанавливает в собственной конфигурации, что означает, что если ваши блоки <config-file> изменяют те же части собственной конфигурации, что и значения по умолчанию для Cordova. настройки, ваши изменения будут удалены, когда Кордова установит значения по умолчанию. cordova-custom-config пытается обойти это, применяя изменения к хуку after_prepare, то есть после Cordova.

DaveAlden 11.04.2018 15:02

(это будет комментарий, но у меня недостаточно репутации)

Подтверждаю: <config-file> не работает на Cordova 7.0 (хотя <edit-config> работает), см. Мой config.xml:

<?xml version='1.0' encoding='utf-8'?>
<widget ...>
    <platform name="android">
        <config-file parent="/manifest/application" target="AndroidManifest.xml">
            <test1 />
        </config-file>
        <config-file parent="./application" target="AndroidManifest.xml">
            <test2 />
        </config-file>
    </platform>

... полностью игнорируется.

Простая установка Кордова-заказ-конфигурация решила проблему. Вам нужно использовать только относительный XPath, например ./application, иначе вы получите ошибку:

cordova-custom-config: Error updating config for platform 'android': Cannot use absolute path on element

Другие вопросы по теме