Cordova config.xml을 통해 iOS .plist 파일에 항목 추가


80

Cordova CLI를 처음 사용합니다.

Cordova를 통해 프로그래밍 방식으로 다음 단계를 수행해야합니다.

  1. 프로젝트 .plist에서 새 행 추가
  2. 새 행에 다음 값을 입력하십시오.
  3. : GDLibraryMode 유형 : 문자열 (기본값) : GDEnterpriseSimulation

내 프로젝트의 루트 (또는 "platforms"폴더에있는 파일)에있는 config.xml 파일에서이 작업을 수행해야한다고 생각합니다.

누군가가 config.xml을 통해 항목을 추가하는 방법을 설명하여 위의 항목이 컴파일 타임에 추가되도록 할 수 있습니까?

Cordova 3.3.1-0.42를 사용하고 있습니다 (최신 버전이 아님). 이미 내 프로젝트를 만들었고 모든 것이 괜찮습니다.이 항목을 pList에 추가하기 만하면됩니다.


4
이것에 늦게 오는 모든 사람들을 위해 프로젝트 plist의 값 설정은 이제 Cordova CLI 7 이상에서 지원됩니다 .
decates

답변:


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

'구성 파일 요소'섹션을 참조하십시오. 의 관련 섹션이 어떻게 생겼는지 추측 해 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 수정을위한 전용 플러그인 생성)을 이해했습니다. 시도해 보겠습니다. 감사!
Fafaman

6
@mooreds, Cordova / PhoneGap 문서는 오해의 소지가 있습니다. 키는에서 지정해야 parent하고 값 부분은 내부 XML이어야한다는 것을 알았습니다 . 이 특별한 경우에는 다음과 같아야합니다. <config-file target = "*-Info.plist"parent = "GDLibraryMode"> <string> GDEnterpriseSimulation </ string> </ config-file>
Herman Kan


1
감사합니다 @rjhilgefort, 훨씬 쉽습니다! :)
josebailo

2
참고로 Cordova CLI 7+부터는 요소 를 통해 수행 할 있습니다. 수행 방법에 대한 자세한 내용은 다른 답변을 참조하십시오. config.xml<config-file>
decates

43

Cordova 후크를 사용하는 @james의 솔루션 을 정말 좋아 합니다. 그러나 두 가지 문제가 있습니다. 워드 프로세서 상태 :

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

노드 plist라이브러리에는 내 plist 파일을 구문 분석하는 데 문제가 있었기 때문에이 솔루션을 사용할 수 없었고 Mac에 포함 된 PListBuddy 실행 파일을 사용하는 James '를 사용했습니다. plist라이브러리 만 더 신뢰할 수 있다면 이것은 좋은 솔루션 이었습니다. config.xml권장 한대로 파일 에서 내 스크립트를 참조했습니다 .
stephen.hanson

좋은! 추가 플러그인을 사용할 필요가 없으며 매력처럼 작동합니다! 다른 모든 솔루션은 이러한 간단한 문제로 인해 구식이거나 복잡해 보입니다.
Arno van Oordt

plist npm 모듈이 심각하게 손상되었습니다. 소스 파일에 빈 값이 포함되어 있으면 잘못된 .plist 파일이 생성됩니다. 대신 simple-plist를 사용하십시오.
cleong

나는 코르도바와 지역 플러그인을 추가하는 문제를 많이했다 @ 8,이 솔루션은 내 경우에는 훨씬 더 잘 작동하고 간단합니다
장 - 밥 티스트 마틴

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.xml그래도 TachyonVortex가 권장 하는 후크를 참조했습니다 .
stephen.hanson

1
키가 이미 존재하더라도 항상 plist를 업데이트하려면 Remove : NSAppTransportSecurity add 문 바로 앞에 추가하면 먼저 NSAppTransportSecurity를 ​​삭제 한 다음 추가합니다. 이것은 아무것도 충돌해서는 안됩니다.
사무엘 톰슨

22

다음은 내 응용 프로그램이 장치간에 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 용 플랫폼을 추가합니다.

무슨 일이 일어나고 있는지는 cordova prepare 명령을 실행할 때 platform / ios 폴더에 생성되는 Apple의 Xcode SDK를 사용하는 것입니다. 여기에서 "yourApp-info.plist"로 레이블이 지정된 애플리케이션에 대해 생성 된 plist 파일을 볼 수 있습니다. 다음과 같은 xml 레이아웃에서 생성 된 새 키와 문자열을 볼 수 있습니다.

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

또한 경고의 한마디로, 우리 회사는 몇 주 전에이 이온 프레임 워크 애플리케이션을 제 무릎에 떨어 뜨 렸습니다 (정말 짧은 기한으로). 내가 말하는 모든 것은 2 주간의 학습을 기반으로합니다. 따라서 이것은 모범 사례가 아닐 수도 있지만 누군가에게 도움이되기를 바랍니다.

편집하다

문서 링크


4
이것이 작동하는 데 필요한 다른 것이 있습니까? Cordova 6.2 (최신 프로덕션)를 사용하고 있으며 항목을 config.xml에 추가했지만 plist에 표시되지 않습니다. Cordova Custom Config 플러그인 ( github.com/dpa99c/cordova-custom-config )이있을 수 있습니까?
토 메르 Cagan

1
매력처럼 작동합니다. 감사.
Logus

<config-file>요소는 Cordova CLI 버전 7에 추가되었으므로 최신 버전의 Cordova CLI에서 작동합니다 ( cordova-custom-config 작성자의 재현 가능한 증명이 github 문제 참조 ).
decates

이것은 나를 위해 일했습니다! 그러나 태그의 속성으로 플랫폼을 지정하는 것은 특히 이미 iOS 플랫폼 아래에 있기 때문에 중복 된 것처럼 보입니다. 그것 없이는 작동했습니다.
Eric F.

14

이것은 이제 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."

결과적 <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" />
니코 Westerdale

1
당신은 폰갭 빌드 서비스를 사용하는 경우이 그 값을 설정하기 위해 권장되는 방법입니다
니코 Westerdale

내 빌드를 수락 <string>Random camera usage text</string>하려면 키 아래 에 추가해야했습니다 <key>NSCameraUsageDescription</key>. 구성은 텍스트 추가하지 않습니다
슬라 티 바트 패스트

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>

하지만 지금, 당신은 할 수 config (설정) NSCameraUsageDescriptionNSPhotoLibraryUsageDescription플러그인이다. 플랫폼-> iOS 프로젝트에서 Xcode 또는 *-Info.plist파일 로 구성해야 합니다.

iOS 10부터는 info.plist에 NSCameraUsageDescription 및 NSPhotoLibraryUsageDescription을 추가해야합니다.

자세히 알아보기 : https://www.npmjs.com/package/cordova-plugin-camera


8

추가 플러그인이나 가져 오기없이 ionic 3 에서 다음을 사용하고 있으며 이것이 다른 사람들에게 도움이 될 수 있다고 생각합니다.

<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

plugins 디렉토리에서 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이 도구에 의해 덮어 쓰이기 때문에이 기능이 작동하지 않습니다.
Herman Kan

2
이 답변에는 두 가지 문제가 있습니다. 첫째, 직접 수정을하는 /plugins/ios.json실행할 때 손실됩니다 cordova platform remove ios다음 cordova platform add ios. 둘째, @ Red2678은 "Cordova를 통해 프로그래밍 방식으로 편집을 수행하여 컴파일 타임에 새 항목이 추가되도록"솔루션을 요청했습니다.
TachyonVortex 2015 년

3

@TachyonVortex 솔루션 이 최선의 선택 인 것 같지만 제 경우에는 무너졌습니다. 이 문제는 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>

내가 쓴 patch_plist.jshooks/after_platform_add이 코드 디렉토리. 하지만 여전히 <key>NSMainNibFile</key><string>NSMainNibFile~ipad</string>plist 파일에 들어갑니다. 이 문제를 어떻게 해결할 수 있을지 아십니까?
Romain R.


2

예, 가능합니다!

Cordova 9.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>

그런 다음 터미널에서 다음 두 명령을 실행하여 스테이징 파일을 다시 빌드하는 것을 잊지 마십시오.

cordova platform rm ios
cordova platform add ios

변경 사항을 확인하려면 새로 생성 된 .plist 파일을 xCode로 열어 확인할 수 있습니다.

-Info.plist 파일 위치 :

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

edit-config대상이 이미 plist에 있다고 가정합니다. 당신이, 당신이 사용해야하는 새로운 키 / 문자열 쌍을 추가 할 경우 그냥 명확하게하기 위해 config-fileXML 트리에 새 자식을 추가하는 대신
다니엘 Lizik

1

.plist에서 <config-file>태그를 사용하여 네이티브 iOS 플러그인에서을 수정하려는 경우 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에 변경되지 않습니다
사무엘 톰슨

처음에 루트 디렉토리에 plist를 배치하여 원인을 좁혀보십시오. 불행히도이 기능은 내가 말할 수있는 한 조용히 실패합니다.
Sky Kelsey 2016 년

0

더 큰 프로젝트 나 동일한 권한을 사용하는 여러 플러그인이있는 경우 after_prepare 후크를 선호합니다. 그러나 항상 간단한 방법으로 갈 수 있습니다.

간단히 :-원하는 권한이 필요한 플러그인을 제거합니다.-config.xml에서 --save를 사용하여 다시 추가합니다. 이제 플러그인에 입력 할 수있는 빈 설명이있는 새 변수가 있습니다.-이제 릴리스 및 설정됩니다.


-4

다음 단계 1이 필요합니다.

당신이 + 찾을 것이다 아무 키나 이름을 가리킬 때 키 입력 값을 볼 수 빌드 설정 빌드 단계는 탭 옵션을 다른 옵션에서 정보의 대상 클릭을 선택 네비게이터 프로젝트로 이동 - + 기호 쓰기에 기호를 클릭 Key: GDLibraryMode키 섹션 Type:String에서 Value:GDEnterpriseSimulation값 섹션의 tyoe 섹션


1
전적으로 이것을하고 싶지만 CLI에서 Cordova 앱을 컴파일하면 프로젝트의 폴더가 기본적으로 삭제되고 다시 만들어집니다. 그런 다음 컴파일 할 때마다 위의 작업을 수행해야했지만 (그게 어렵지는 않지만) Cordova의 config.xml을 사용하여이를 수행하기를 바랐습니다.
Red2678

xcode를 통해 앱을 실행해야하는 이유를 알려주세요. 그러면이 솔루션이 효과가 있습니다
Nitin

2
안녕하세요 @Nitin, Cordova CLI를 사용하는 표준 방식이므로 "요구 사항"이 아닙니다. "Command Cordova build"를 사용하면 해당 명령을 실행할 때마다 프로젝트 폴더가 삭제되고 다시 만들어집니다.
Red2678
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.