2013-09-04 4 views
2

Часть plugin.xmlCordova 3,0 плагин PLIST конфигурации

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

    <config-file target="config.xml" parent="/*"> 
     <feature name="MyPlugin"> 
      <param name="ios-package" value="MyPlugin"/> 
     </feature> 
    </config-file> 

    <!--this need to be added to the .plist file--> 
    <config-file target="*-Info.plist" parent="UIBackgroundModes"> 
     <array> 
      <string>location</string> 
     </array> 
    </config-file> 

    <header-file src="src/ios/MyPlugin.h" /> 
    <source-file src="src/ios/MyPlugin.m" /> 
</platform> 

Левая сторона Перед установкой мой плагин, правая сторона После:

Difference

Как вы можете видеть, прежде чем :

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

И после

<key>NSMainNibFile</key> 
<string> 

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

    </string> 

Какая разница! Если я удалю эти пробелы, о которых я не знаю, откуда они пришли, у меня нет сбоев после запуска!

ИОС 6 выход имитатора (но такое же на устройстве тоже)

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/myusername/Library/Application Support/iPhone Simulator/6.0/Applications/F4FDE3C4-D7A8-440F-866D-D0DECD79E2F5/My.app> (loaded)' with name ' 

    '' 
*** First throw call stack: 
(0xea012 0x2848e7e 0xe9deb 0x540fac 0x54298d 0x324ceb 0x325002 0x323ed6 0x335315 0x33624b 0x327cf8 0x367adf9 0x367aad0 0x5fbf5 0x5f962 0x90bb6 0x8ff44 0x8fe1b 0x3237da 0x32565c 0x1fe3c 0x1fd9d) 
libc++abi.dylib: terminate called throwing an exception 
(lldb) 

Я думаю, что это ошибка в Кордова/PhoneGap, но это не делает мой босс счастливым. Как это решить? . .plist сгенерирован каждый раз при запуске из командной строки, поэтому его нельзя вручную редактировать.

Не удается найти документацию, только this, и я не знаю, почему добавлено мое местоположение 4 раза, если я написал только 1 раз.

Edit: После установки мой плагин из командной строки (но не компиляции или выполнения) PLIST выглядит следующим образом:

<key>NSMainNibFile</key> 
<string> 

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

</string> 
<key>UIBackgroundModes</key> 
<array> 
    <string>location</string> 
</array> 


$ phonegap build ios 


<key>NSMainNibFile</key> 
<string> 

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

</string> 
<key>UIBackgroundModes</key> 
<array> 
    <string>location</string> 
    <string>location</string> 
</array> 

-observe: есть строка с добавленным место!

$ phonegap run ios 
[phonegap] detecting iOS SDK environment... 
[phonegap] using the local environment 
[phonegap] compiling iOS... 
[phonegap] successfully compiled iOS app 
[phonegap] trying to install app onto device 
[phonegap] no device was found 
[phonegap] trying to install app onto emulator 
[phonegap] successfully installed onto emulator 

PLIST будет очищено 2 раза: те будут удалены 2x, наконец, он снова будет добавлен. Теперь PLIST выглядит следующим образом:

<key>NSMainNibFile</key> 
<string> 

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

</string> 
<key>UIBackgroundModes</key> 
<array> 
    <string>location</string> 
    <string>location</string> 
    <string>location</string> 
    <string>location</string> 
    <string>location</string> 
</array> 

edit2:

cordova prepare 

СЛУЧАЙНО очищает <string></string> пробелы И всегда добавить <string>location</string> в UIBackgroundModes массив!

+0

https://issues.apache.org/jira/browse/CB-4731 –

ответ

3

Да, это похоже на ошибку в обработке Кордовы настроек конфигурации плагинов для файлов plist.

Дублирующие записи массива раздражают, но не должны нарушать сборку или влияние приложения. Однако пробелы, добавленные в настройки NSMainNibFile *, заставляют XCode не скомпилироваться с сообщением об ошибке NSInternalInconsistencyException, которое вы видели.

До этого фиксирован я работаю вокруг него, используя следующий скрипт ловушки - помещается в .cordova/hooks/after_platform_add/patch_plist.sh:

#!/bin/bash 
if pushd platforms/ios 2>/dev/null ; then # iOS-specific actions... 
    # Patch *-Info.plist 
    PROJNAME=$(echo *.xcodeproj|sed -e 's/\..*//') 
    sed -i '' '/<key>NSMainNibFile<\/key>/,/<\/string>/d' $PROJNAME/*-Info.plist 
    sed -i '' '/<key>NSMainNibFile~ipad<\/key>/,/<\/string>/d' $PROJNAME/*-Info.plist 
    popd 
fi 

Это удаляет эти параметры из списка свойств полностью, так как они не нужны.Удаление их не позволяет Кордове добавить их обратно в разбитое состояние после prepare.

Сценарий должен быть исполняемым:

chmod a+x .cordova/hooks/after_platform_add/patch_plist.sh 

Это должно выполняться после каждой platform add команды, когда PLIST генерируется - так что вам необходимо выполнить следующие команды после этого, чтобы восстановить его и применить патч:

cordova platform rm ios -d 
cordova platform add ios -d 
+0

+1, спасибо большое –

+0

есть ли способ поставить patch_plist.sh в моей папке плагина и распространять на этом пути и при установке время скопировать patch_plist.sh в папку .cordova/hooks/after_platform_add? –

+0

@matheszabi Я пока не нашел способ сделать это, к сожалению. Я предполагаю, что ручной шаг требуется, пока это не будет зафиксировано в Кордове. – Tom

1

это не является хорошим решением, но то, что я нашел, работает, чтобы предотвратить дублирование, пока не будет исправлена ​​в plugman является следующее:

<!-- clobber old array value in .plist --> 
<config-file target="*-Info.plist" parent="UIBackgroundModes"> 
    <string>CLOBBER</string> 
</config-file> 

<!-- replace clobbered value with proper array in .plist --> 
<config-file target="*-Info.plist" parent="UIBackgroundModes"> 
    <array> 
     <string>location</string> 
    </array> 
</config-file> 

т. Е. Сблизить узел с одномерным узлом, а затем повторно скрыть его соответствующим массивом.

0

просто добавить эти строки в config.xml

<platform name="ios"> 
    <config-file platform="ios" target="*-Info.plist" parent="NSMainNibFile"> 
     <string></string> 
    </config-file> 
</platform> 
<platform name="ios"> 
    <config-file platform="ios" target="*-Info.plist" parent="NSMainNibFile~ipad"> 
     <string></string> 
    </config-file> 
</platform> 
Смежные вопросы