Cordovaconfig.xmlを介してiOS.plistファイルにエントリを追加します


80

私はCordovaCLIを初めて使用します。

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

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

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

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

私はCordova3.3.1-0.42を使用しています(最新ではないことはわかっています)。私はすでにプロジェクトを作成しましたが、すべて問題ありません。このエントリをpListに追加するだけです。


4
これに遅れる人のために、プロジェクトplistでの値の設定は、Cordova CLI7以降でサポートされるようになりました
18

回答:


67

直接の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-fileelement'セクションを参照してください。の関連セクション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>


1
@mooreds申し訳ありませんが、私はあなたの答えを誤解しました...あなたの解決策はgap:config-fileを使用していると思いました。これで、あなたのアプローチ(特定のplistの変更専用のプラグインを作成する)が理解できたので、試してみます。ありがとう!
ファファマン2015

6
@ mooreds、Cordova / PhoneGapのドキュメントは誤解を招く恐れがあります。キーはで指定する必要がparentあり、値の部分は内部XMLである必要があることがわかりました。この特定のケースでは、次のようになります。<config-file target = "* -Info.plist" parent = "GDLibraryMode"> <string> GDEnterpriseSimulation </ string> </ config-file>
Herman Kan

4
このプラグインは素晴らしい作品github.com/leecrossley/cordova-plugin-transport-securityを
rjhilgefort

1
@rjhilgefortに感謝します、とても簡単です!:)
josebailo 2015

2
参考までに、Cordova CLI 7+以降、要素を介して実行できます。これを実行する方法の詳細については、他の回答を参照してください。config.xml<config-file>
18

43

私はCordovaフックを使用した@jamesのソリューションが本当に好きです。ただし、2つの問題があります。ドキュメントの状態:

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

plistNPMパッケージを使用した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' });

};

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

  • after_prepare
  • before_compile

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

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

ノードplistライブラリでplistファイルの解析に問題があったため、このソリューションを使用できず、Macに含まれているPListBuddy実行可能ファイルを使用するJames 'を使用しました。plistライブラリだけがより信頼できるのであれば、これは良い解決策でした。config.xml推奨どおり、ファイルからスクリプトを参照しました。
stephen.hanson 2016

いいね!追加のプラグインを使用する必要はなく、魅力のように機能します!他のすべての解決策は、そのような単純な問題のために時代遅れまたは複雑になっているように見えます。
Arno van Oordt 2016

plistnpmモジュールが深刻に壊れています。ソースファイルに空の値が含まれていると、無効な.plistファイルが生成されます。代わりにsimple-plistを使用してください。
cleong 2016年

cordova @ 8でローカルプラグインを追加するのに多くの問題がありました。このソリューションは私の場合ははるかにうまく機能し、より簡単です
Jean-Baptiste Martin

32

Cordovaフックスクリプト内でPlistBuddyユーティリティを使用して、*-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はビルドエラーを報告します。より良いエラー処理は可能ですが、実装するのは面倒です。


できます!私はあなたとTachyonVortexの両方のソリューションを試しました。TachyonVortexのソリューションが使用するnode.jsライブラリは、私のPListファイルを正しく解析しませんでしたが、回答で使用されたMacに含まれているPListBuddyは解析しました。config.xmlTachyonVortexが推奨するように、フックを参照しました。
stephen.hanson 2016

1
キーがすでに存在している場合でもRemove : NSAppTransportSecurity 、常にplistを更新する場合は、addステートメントの直前に追加します。最初にNSAppTransportSecurityが削除され、次に追加されます。これは何もクラッシュしないはずです。
サミュエルトンプソン

22

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

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

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

2.次に、コマンドラインツールに移動して次のように入力します。cordovaprepare

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

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

npm install -g cordova

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

cordova platform add ios

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

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

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

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

編集

ドキュメントへのリンク


4
これが機能するために他に何か必要ですか?Cordova 6.2(最新の製品)を使用していますが、config.xmlにエントリを追加しても、plistに表示されません。Cordova Custom Configプラグイン(github.com/dpa99c/cordova-custom-config)を使用している可能性はありますか?
Tomer Cagan 2016年

1
チャームのように機能します。ありがとう。
ログ2017

この<config-file>要素はCordovaCLIバージョン7で追加されたため、Cordova CLIの最近のバージョンでは、これは機能します(cordova-custom-configの作成者による再現可能な証明については、このgithubの問題を参照してください)。
18

これは私のために働いた!ただし、プラットフォームをタグの属性として指定することは、特にiOSプラットフォームの下に既に配置されているため、冗長に思えます。それなしで私のもので働いた。
エリック

14

これは、config.xmlを使用することで可能になっているようです。少なくとも一部のコアプラグインの作成者はそう言っています。たとえば、Cordova Camera Pluginのドキュメントでは、plistに許可メッセージ文字列を指定するというiOS10の新しい要件について説明しています。これを実現するには、プラグインの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."

これにより、<plugin>config.xmlに新しいものが追加されるだけでなく、<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/>

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


CAMERA_USAGE_DESCRIPTIONはNSCameraUsageDescriptionに渡されます。NSPhotoLibraryUsageDescriptionの値を追加する場合は、追加する必要があります<variable name="PHOTOLIBRARY_USAGE_DESCRIPTION" value="whatever" />
Nico

1
PhoneGap Buildサービスを使用している場合、これはこれらの値を設定するための推奨される方法です
Nico Westerdale 2017年

ビルドを受け入れるに<string>Random camera usage text</string>は、キーの下に以下を追加<key>NSCameraUsageDescription</key>する必要がありました。構成はテキストを追加しません
Slartibartfast 2017

9

更新:iOS> = 10でカメラを使用したい人のために。これは、通常、プラグインで次のように構成できることを意味します。

 <!-- 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プラグインインチ プラットフォーム-> iOSプロジェクトでXcodeまたは*-Info.plistファイルでそれらを構成する必要があります。

iOS 10以降、info.plistにNSCameraUsageDescriptionとNSPhotoLibraryUsageDescriptionを追加する必要があります。

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


8

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

<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>

4

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

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

"*-Info.plist": {

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

これが完全な例です


1
Visual Sutdio Tools for Cordovaから実行する場合、ios.jsonがツールによって上書きされるため、これは機能しないことに注意してください。
ハーマンカン

2
この回答には2つの問題があります。まず、を/plugins/ios.json実行すると、への手動編集はすべて失われ、cordova platform remove iosその後にcordova platform add ios。が続きます。次に、@ Red2678は、「Cordovaを介してプログラムで編集を実行し、コンパイル時に新しいエントリが追加されるようにする」ための解決策を求めました。
TachyonVortex 2015年

3

@TachyonVortexソリューションが最良のオプションのようですが、私の場合はクラッシュしていました。この問題は、plistNPMパッケージによって正しく変換されない空の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>

私が書いたpatch_plist.js中でhooks/after_platform_add、このコードのあるディレクトリ。しかし、私はまだ<key>NSMainNibFile</key><string>NSMainNibFile~ipad</string>私のplistファイルを取得します。この問題をどのように解決できるかについてのアイデアはありますか?
Romain R.


2

はい、可能です!

私はCordova9.0.0(cordova-lib@9.0.1)を使用しています。

たとえば、これは新しい文字列値を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

edit-configターゲットがすでにplistに存在することを前提としています。明確にするために、新しいキーと文字列のペアを追加する場合は、config-file代わりに使用する必要があります。これにより、xmlツリーに新しい子が追加されます
DanielLizik19年

1

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

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

    plutil -convert xml1 Info.plist

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

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

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

これは、複数のトップレベルプロパティを追加するために機能する完全な例です。

<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>

これは私にはうまくいきませんでした。私はあなたが上に持っているものを追加しようとしましたが、私のplistには何も変わりませんでした
Samuel Thompson

最初にルートディレクトリにplistを配置して、原因を絞り込んでみてください。残念ながら、私が知る限り、この機能は黙って失敗します。
スカイケルシー

0

大規模なプロジェクトや、同じ権限を使用する複数のプラグインがある場合は、after_prepareフックをお勧めします。しかし、あなたはいつでも簡単な方法で行くことができます:

簡単に言うと、-必要な権限が必要なプラグインを削除します-config.xmlに--saveを付けて再度追加します-プラグインには、入力可能な空白の説明を含む新しい変数があります-iOSをビルドします-リリースとそれらが設定されます。


-4

次の手順1が必要です。

プロジェクトナビゲーターに移動しますターゲットを選択しますタブオプションから情報をクリックします他のオプションはビルド設定ビルドフェーズですキータイプの値が表示されますキー名をポイントすると+と-記号が表示されます+記号をクリックします書き込み Key: GDLibraryModeキーセクションの Type:StringValue:GDEnterpriseSimulation値セクションのtyoeセクション


1
完全にやりたいのですが、CLIからCordovaアプリをコンパイルすると、基本的にプロジェクトのフォルダーが削除されて作り直されます。その後、コンパイルするたびに上記を実行する必要がありますが(難しいことではありません)、Cordovaのconfig.xmlを使用して実行したいと思っていました。
red2678 2014年

コンパイルする必要がある理由を教えてくださいxcodeを介してアプリを実行すると、このソリューションが機能します
Nitin

2
こんにちは@Nitin、まあ、それはコルドバCLIを使用する標準的な方法であるため、それほど「要件」ではありません。「コマンドCordovabuild」を使用すると、そのコマンドを実行するたびにプロジェクトフォルダーが削除され、再作成されます。
red2678 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.