web-dev-qa-db-ja.com

Cordova config.xml経由でiOS .plistファイルにエントリを追加します

Cordova CLIを初めて使用します。

Cordovaを介して次の手順をプログラムで実行する必要があります。

  1. プロジェクト.plistに新しい行を追加します
  2. 新しい行に次の値を入力します。
  3. キー:GDLibraryMode タイプ:String(デフォルト):GDEnterpriseSimulation

プロジェクトのルート(または「プラットフォーム」フォルダーにある)のconfig.xmlファイルでこれを行う必要があると思います。

上記のエントリがコンパイル時に追加されるように、config.xmlを介してエントリを追加する方法を誰かに説明できますか?

Cordova 3.3.1-0.42を使用しています(最新ではありません)。私はすでに自分のプロジェクトを作成しており、すべて問題ありません。このエントリをpListに追加するだけです。

76
Red2678

config.xmlを直接修正することでこれを行えるとは思いません。少なくとも、ドキュメントにはこれに関する言及はありませんでした: http://cordova.Apache.org/docs/en/3.3.0/config_ref_index.md.html

プラグインはplistエントリを挿入できるため、プラグインを作成する必要があると思います: http://docs.phonegap.com/en/3.3.0/plugin_ref_spec.md.html#Plugin%20Specification

「config-file要素」セクションを参照してください。 plugin.xmlの関連セクションがどのようになるかについての推測は次のとおりです。

<platform name="ios">
<config-file target="*-Info.plist" parent="CFBundleURLTypes">
<array>
    <dict>
        <key>GDLibraryMode</key>
        <string>GDEnterpriseSimulation</string>
    </dict>
</array>
</config-file>
</platform>

次に、プラグインをインストールできます:cordova plugin add <your plugin name or file location>

61
mooreds

@jamesの solution がCordovaフックを使用しているのが本当に好きです。ただし、2つの問題があります。 docs 状態:

  • " Node.js "を使用してフックを記述することを強くお勧めします
  • /hooksディレクトリは、config.xmlのフック要素を支持して非推奨と見なされます。」

plist NPMパッケージを使用したNode.js実装は次のとおりです。

var fs    = require('fs');     // nodejs.org/api/fs.html
var plist = require('plist');  // www.npmjs.com/package/plist

var FILEPATH = 'platforms/ios/.../...-Info.plist';

module.exports = function (context) {

    var xml = fs.readFileSync(FILEPATH, 'utf8');
    var obj = plist.parse(xml);

    obj.GDLibraryMode = 'GDEnterpriseSimulation';

    xml = plist.build(obj);
    fs.writeFileSync(FILEPATH, xml, { encoding: 'utf8' });

};

Cordovaが提供するすべてのフックタイプのうち、状況に関連するものは次のとおりです。

  • after_prepare
  • before_compile

フックタイプを選択し、config.xmlファイルにフックを追加します。

<platform name="ios">
    <hook type="after_prepare" src="scripts/my-hook.js" />
</platform>
41
TachyonVortex

PlistBuddy ユーティリティを Cordovaフック スクリプト内で使用して、*-Info.plistファイルを変更できます。

たとえば、辞書プロパティを追加し、その辞書内にエントリを追加する<project-root>/hooks/after_prepare/010_modify_plist.shの下に次のスクリプトがあります。

#!/bin/bash

PLIST=platforms/ios/*/*-Info.plist

cat << EOF |
Add :NSAppTransportSecurity dict
Add :NSAppTransportSecurity:NSAllowsArbitraryLoads bool YES
EOF
while read line
do
    /usr/libexec/PlistBuddy -c "$line" $PLIST
done

true

必ずスクリプトを実行可能にしてください(chmod +x)。

スクリプトの最後にあるtrueは、追加するキーが既に存在する場合、PlistBuddyがエラー終了コードを返し、キーが既に存在するかどうかを検出する方法を提供しないためです。フックスクリプトがエラーステータスで終了した場合、Cordovaはビルドエラーを報告します。より良いエラー処理は可能ですが、実装するのは大変です。

32
James

これらは、アプリケーションがデバイス間でiTunesを介してファイルを共有できるようにするために行った手順です。

1.アプリケーションで、config.xmlに移動します。プラットフォームタグ<platform name="ios">の下の構成にこの部分を入力します。

 <config-file platform="ios" target="*-Info.plist" parent="UIFileSharingEnabled">
      <true/>
  </config-file>

2.次に、コマンドラインツールに移動して、次を入力します。cordova prepare

  1. デバイス上のアプリケーションをアンインストールして再インストールすると、iTunesにアプリが表示され、デバイス間でファイルを共有できるようになります。

いくつかのこと、cordovaが最新であること、およびiOS用のプラットフォームを追加したことを確認してください。

npm install -g cordova

このコマンドはcordovaをインストールします。

cordova platform add ios

このコマンドは、iosのプラットフォームを追加します。

何が起こっているかは、platform/iosフォルダーに生成されたAppleのXcode SDKを使用しているcordova prepareコマンドを実行したときです。ここで、アプリケーション用に生成されたplistファイルを確認できます。このファイルには、「yourApp-info.plist」というラベルが付いています。 xmlレイアウトで生成された新しいキーと文字列が次のように表示されます。

 <key>UIFileSharingEnabled</key>
 <true/>

また、警告の言葉として、私の会社はこのionicフレームワークアプリケーションを数週間前に私のラップに落としました(本当に短い期限で)。私があなたに言っていることはすべて、数週間の学習に基づいています。したがって、これはベストプラクティスではないかもしれませんが、誰かの助けになることを願っています。

19
Eric Weiss

これは、config.xmlを使用することで可能になったようです。少なくとも一部のコアプラグイン作成者はそう言っています。たとえば、 Cordova Camera Plugin のドキュメントでは、plistで許可メッセージ文字列を提供するというiOS 10の新しい要件について説明しています。それを達成するために、彼らはプラグインを引数付きでaddコマンドを実行することを提案します。

cordova plugin add cordova-plugin-camera --variable CAMERA_USAGE_DESCRIPTION="My App would like to access your camera, to take photos of your documents."

これにより、config_xmlに新しい<plugin>が追加されるだけでなく、<variable>子が追加されます。

<plugin name="cordova-plugin-camera" spec="~2.3.0">
    <variable name="CAMERA_USAGE_DESCRIPTION" value="My App would like to access your camera, to take photos of your documents." />
</plugin>

Info.plistの新しいキーと相関しているように見えますが、おそらく実行時に値を渡すのでしょうか?

  <key>NSCameraUsageDescription</key>
  <string/>
  <key>NSPhotoLibraryUsageDescription</key>
  <string/>

私はそれがどのように機能するかを正確に知っていると言ったら嘘をつきますが、それは道を指しているようです。

13
XML

更新:10以上のiOSでカメラを使用したい場合。通常、プラグインで次のように設定できます。

 <!-- ios -->
 <platform name="ios">

     <config-file target="*-Info.plist" parent="NSLocationWhenInUseUsageDescription">
         <string></string>
     </config-file>
     <config-file target="*-Info.plist" parent="NSCameraUsageDescription">
         <string></string>
     </config-file>
      <config-file target="*-Info.plist" parent="NSPhotoLibraryUsageDescription">
         <string></string>
     </config-file>

 </platform>

しかし、今のところ、プラグインでNSCameraUsageDescriptionNSPhotoLibraryUsageDescriptionを設定することはできません。プラットフォーム-> XcodeによるiOSプロジェクトまたは*-Info.plistファイルで設定する必要があります。

IOS 10以降、info.plistにNSCameraUsageDescriptionとNSPhotoLibraryUsageDescriptionを追加することが必須です。

詳細: https://www.npmjs.com/package/cordova-plugin-camera

9
Hung

私はionicで追加のプラグインやインポートなしで次を使用していますが、これは他の人に役立つと思います:

<platform name="ios">
    <edit-config file="*-Info.plist" mode="merge" target="NSLocationWhenInUseUsageDescription">
        <string>Location is required so we can show you your nearby projects to support.</string>
    </edit-config>
    <edit-config file="*-Info.plist" mode="merge" target="NSCameraUsageDescription">
        <string>Camera accesss required in order to let you select profile picture from camera.</string>
    </edit-config>
    <edit-config file="*-Info.plist" mode="merge" target="NSPhotoLibraryUsageDescription">
        <string>Photo library accesss required in order to let you select profile picture from gallery / library.</string>
    </edit-config>
</platform>
7
necixy

Pluginsディレクトリのios.jsonを直接編集することにより、アプリのplistに表示名を設定できます。

Ios.jsonファイルのconfig_munge.filesセクションに以下を追加すると、トリックが行われ、CLIを使用している場合でも維持されます。

"*-Info.plist": {

    "parents": {
        "CFBundleDisplayName": [
            {
                "xml": "<string>RevMob Ads Cordova Plugin Demo</string>",
                "count": 1
            }
        ]
    }
}

完全な例

4
blakgeek

@TachyonVortex solution は最良のオプションのようですが、私の場合はクラッシュしていました。この問題は、plist NPMパッケージによって正しく変換されない空のNSMainNibFileフィールドが原因で発生しました。 。plistファイル

    <key>NSMainNibFile</key>
    <string></string>
    <key>NSMainNibFile~ipad</key>
    <string></string>

に変換されます:

    <key>NSMainNibFile</key>
    <string>NSMainNibFile~ipad</string>

スクリプトに追加して修正しました:

    obj.NSMainNibFile = '';
    obj['NSMainNibFile~ipad'] = '';

スクリプトは最終的に次のようになります(scripts/my-hook.js):

var fs    = require('fs');     // nodejs.org/api/fs.html
var plist = require('plist');  // www.npmjs.com/package/plist

var FILEPATH = 'platforms/ios/***/***-Info.plist';

module.exports = function (context) {

    var xml = fs.readFileSync(FILEPATH, 'utf8');
    var obj = plist.parse(xml);

    obj.GDLibraryMode = 'GDEnterpriseSimulation';
    obj.NSMainNibFile = '';
    obj['NSMainNibFile~ipad'] = '';

    xml = plist.build(obj);
    fs.writeFileSync(FILEPATH, xml, { encoding: 'utf8' });

};

およびconfig.xml:

<platform name="ios">
    <hook type="before_build" src="scripts/my-hook.js" />
</platform>
3
Sebastien Horin

このプラグインを使用して問題を解決しましたが、おそらくあなたを助けることができます:

https://www.npmjs.com/package/cordova-plugin-queries-schemes

2
Malo Degachi

私は、より大きなプロジェクトや、同じ許可を使用する複数のプラグインがある場合、after_prepareフックを好みます。しかし、あなたはいつでも簡単な方法で行くことができます:

単純に:-必要な許可を必要とするプラグインを削除します-再度保存しますそれらが設定されます。

0
Emanuel

.plist<config-file>タグを付けて、ネイティブiOSプラグインのplugin.xmlを変更しようとしている場合、以下を行う必要があります。

  1. .plistがバイナリではなくxmlであることを確認してください!plutilを使用してバイナリ.plistをxmlに変換し、バージョン管理にコミットできます。

    plutil -convert xml1 Info.plist

  2. <config-file>の指示は、target=platforms/ios/<project>/で生成されたxcodeプロジェクトに関連していることを示していますが、それを機能させるにはパスにワイルドカード文字を追加する必要があることがわかりました。

    target="*/Resources/MyResources.bundle/Info.plist"

  3. .plistの最上位にキーを追加する場合は、親をキー名と同じに設定してから、値で<string>タグをネストする必要があります。 <array>または<dict>を使用すると、これらのキーはネストされますnderparent

以下に、複数のトップレベルプロパティを追加するのに役立つ完全な例を示します。

<platform name="ios">
    <config-file target="*/Resources/MyResources.bundle/Info.plist" parent="MyDistribution">
        <string>Cordova</string>
    </config-file>
    <config-file target="*/Resources/MyResources.bundle/Info.plist" parent="MyVersion">
        <string>3.2.0</string>
    </config-file>
</platform>
0
Sky Kelsey

はい、可能です!

Cordova 9.0.0([email protected])を使用しています。

たとえば、これはInfo.plistに新しい文字列値を挿入するために使用した構成ファイルです。

<platform name="ios">
    <edit-config file="*-Info.plist" mode="merge" target="NSMicrophoneUsageDescription">
        <string>My awesome app wish to hear your awesome voice through Microphone. Not for fancy stuff, just want to hear you.</string>
    </edit-config>
    <edit-config file="*-Info.plist" mode="merge" target="---Key configuration---">
        <string>---string value---</string>
    </edit-config>
</platform>

その後、ターミナルで次の2つのコマンドを実行してステージングファイルを再構築することを忘れないでください。

cordova platform rm ios
cordova platform add ios

変更を確認するには、xCodeで開いて、新しく生成された.plistファイルを確認できます。

-Info.plistファイルは次の場所にあります。

./platform/ios/[your app name]/[your app name]-Info.plist
0
Donovan P