config-fileとedit-configの動作の違いについて

Monacaチームの小田川です。

Monacaでアプリ開発をする際に、AndroidのAndroidManifest.xmlやiOSのInfo.plistの設定を行いたい場合があります。通常、このようなネイティブ側の設定を行う場合は、Cordovaプラグインを使用して設定を行いますが、AndroidManifest.xmlやInfo.plistの設定については、Monacaプロジェクトのルートにあるconfig.xmlからconfig-fileedit-configを利用することで対応することができます。

config.xmlやedit-configは、Cordovaが提供している機能になり、Cordovaプラグインのplugin.xmlでも利用されている設定になります。

今回は、config-fileとedit-configの動作の違いについて見ていきたいと思います。

config-file

config-fileは、設定対象のXMLドキュメントツリーに新しい子要素を追加します。AndroidManifest.xmlやInfo.plistもXML形式で構成されています。config-fileは、既存の設定を変更したり、削除することはできません。

下記の例では、AndroidManifest.xmlにuses-permission要素を追加しています。

<platform name="android">
  <config-file target="AndroidManifest.xml" parent="/*">
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
  </config-file>
</platform>

下記の例では、Info.plistにCFBundleLocalizations要素を追加しています。

<platform name="ios">
  <config-file platform="ios" parent="CFBundleLocalizations" target="*-Info.plist">
    <array>
      <string>en</string>
      <string>ja</string>
    </array>
  </config-file>
</platform>

edit-config

edit-configもXMLドキュメントツリーの設定を行いますが、edit-configでは、XMLドキュメントツリーに新しい子要素を追加するのではなく、XML要素の属性を変更します。edit-configでは、属性を変更するモードとして、mergeoverwriteが用意されています。

mergeを指定した場合は、対象のXML要素に指定された属性を追加します。指定された属性がすでに存在する場合は、既存の設定を置き換えます。overwriteを指定した場合は、対象のXML要素に設定されている属性が、指定された属性に置き換えられます。

edit-configには、1つの子要素含め、その子要素に追加する属性を設定します。下記の例では、AndroidManifest.xmlのuses-sdk要素にminSdkVersionとmaxSdkVersionを追加しています。

<edit-config file="AndroidManifest.xml" target="/manifest/uses-sdk" mode="merge">
  <uses-sdk android:minSdkVersion="16" android:maxSdkVersion="23" />
</edit-config>

下記の例では、Info.plistのNSCameraUsageDescription要素に設定した値(string)を追加し、NSPhotoLibraryUsageDescription要素では、設定した値(string)で置き換えています。

<platform name="ios">
  <edit-config target="NSCameraUsageDescription" file="*-Info.plist" mode="merge">
    <string>need camera access to take pictures</string>
  </edit-config>
  <edit-config target="NSPhotoLibraryUsageDescription" file="*-Info.plist" mode="overwrite">
    <string>need to photo library access to get pictures from there</string>
  </edit-config>
</platform>

edit-configの注意点

edit-configでは、ビルド時に同じ属性を変更することはできません。edit-configは、config.xml以外にCordovaプラグインのplugin.xmlでも使用されるため、複数のCordovaプラグインを使用している場合、設定に競合が発生する可能性があります。

edit-configの設定に競合が発生した場合は、競合が発生しているCordovaプラグインを特定し、競合が発生しているCordovaプラグインから対象のedit-config設定を削除し、config.xmlから対象のedit-config設定を行う等の対応が必要になります。

Monacaで対象のedit-config設定を削除したCordovaプラグインを使用する場合は、

  1. Cordovaプラグインを提供しているGitHubからZipファイルをダウンロードします。
  2. 解凍したZipファイルにあるplugin.xmlから対象のedit-config設定を削除します。
  3. 「2」の状態で、再度Zipファイルを作成します。

を行うことで、MonacaクラウドIDEから「3」の対応済みのCordovaプラグインをインポートして利用することができます。

おわりに

config-fileとedit-configは、Monacaプロジェクトのconfig.xmlから利用することができます。config-fileとedit-configを使用することで、Cordovaプラグインを作成しなくてもAndroidManifest.xmlやInfo.plistの設定が可能になりますので、対象のアプリでAndroidManifest.xmlやInfo.plistの設定が必要になった場合は、一度、config.xmlからconfig-fileやedit-configを利用してみてください。