Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cordova: How to set Platform-specific config.xml file which is not overwritten after cordova build?

I use Cordova with two platforms ios and android. When I change something in my

Project/config.xml 

it will be merged into

Project/platforms/android/res/xml/config.xml  
Project/platforms/ios/Project/config.xml

after doing cordova build.

How can I set platform specific settings which will not be overwritten with cordova build?

like image 489
confile Avatar asked Apr 04 '14 15:04

confile


2 Answers

Define your platform specific configuration inside platform elements.

<platform name="android">
    <preference name="Fullscreen" value="true" />
    ...
</platform>

See bottom of: http://cordova.apache.org/docs/en/4.0.0/config_ref_index.md.html

And if you use an older version of Cordova, consider updating as many critical issues were fixed.

like image 86
CKK Avatar answered Sep 23 '22 03:09

CKK


You need a cordova hook. I strongly recommend you see this link: Cordova Hooks

More specifically:

  1. In the hooks/ top-level folder of your app, create a subfolder named "after_prepare".
  2. In hooks/after_prepare , create an executable script that your platform knows how to run (e.g. on Linux: create a BASH script; on Windows: create a BAT file; on any platform: create a Node.js script). Let's say you want a bash script:

create an "after_prepare" cordova hook script file

mkdir -p hooks/after_prepare
touch hooks/after_prepare/change_my_configxml.sh
chmod 755 hooks/after_prepare/change_my_configxml.sh
edit hooks/after_prepare_change_my_configxml.sh

hooks/after_prepare/change_my_configxml.sh

#!/bin/bash

echo ${CORDOVA_VERSION};
echo ${CORDOVA_PLATFORMS};
echo ${CORDOVA_PLUGINS};
echo ${CORDOVA_HOOK};
echo ${CORDOVA_CMDLINE};
# == put commands to make your config xml changes here ==
# == replace this statement with your own ==
sed "s/index\.html/http:\/\/my.example.com\?platform=ios\&amp;cordova=3.4.0/" platforms/ios/www/config.xml > config.tmp && mv -f -v config.tmp platforms/ios/www/config.xml

Note that cordova hooks were originally placed in .cordova/hooks/... , but recently they have moved to a top-level hooks/ folder.

EDIT:

Here is a fully working script to create and run two slightly different cordova apps. Interestingly, the attribute in the iOS platform folder's config.xml seems to get ignored, so this script updates the top-level config.xml when dealing with iOS.

createMultiPlatformCordovaApp.sh

#!/bin/bash
# ==== Create cordova apps with different URLs for android and iOS
cordova create appFolder com.example.myApp "My App"

cd appFolder/

cordova platform add ios
cordova platform add android

# ==== make an after_prepare hook script
mkdir -p hooks/after_prepare 
touch hooks/after_prepare/change_my_configxml.sh
chmod 755 hooks/after_prepare/change_my_configxml.sh
# ==== start of hook script content ====
echo '#!/bin/bash

    echo "CORDOVA_VERSION: ${CORDOVA_VERSION}";
    echo "CORDOVA_PLATFORMS: ${CORDOVA_PLATFORMS}";
    echo "CORDOVA_PLUGINS: ${CORDOVA_PLUGINS}";
    echo "CORDOVA_HOOK: ${CORDOVA_HOOK}";
    echo "CORDOVA_CMDLINE: ${CORDOVA_CMDLINE}";
    # == put commands to make your config xml changes here ==
    # == replace these statement with your own ==

    if [ ! -f platforms/android/res/xml/config.xml ] 
    then 
      cp -v -f config.xml platforms/android/res/xml/config.xml; 
    fi
    if [[ ${CORDOVA_PLATFORMS} == android ]]; then
        sed -E "s/<content src=\"[^\"]+\"/<content src=\"http:\/\/www.google.com\/search\?q=Google%20Nexus%205\&amp;hl=xx-bork\"/" platforms/android/res/xml/config.xml > config.tmp && mv -f -v config.tmp platforms/android/res/xml/config.xml
    fi
    if [[ ${CORDOVA_PLATFORMS} == ios ]]; then
        sed -E "s/<content src=\"[^\"]+\"/<content src=\"http:\/\/www.google.com\/search\?q=iPad%20Retina\&amp;hl=xx-bork\"/"  config.xml > config.tmp && mv -f -v config.tmp config.xml
    fi
' > hooks/after_prepare/change_my_configxml.sh
# ==== end of hook script content ====

cordova prepare android
cordova build android
cordova emulate android

cordova prepare ios
cordova build ios
cordova emulate ios
like image 32
cobberboy Avatar answered Sep 21 '22 03:09

cobberboy