I created a new phonegap (v 3.0.0-0.14.0) project with default config.xml and then added iOS and Android platforms.
The config contains all the paths to all platform icons.
I have overwritten the default icons for iOS and Android so that path and name still matches those pngs.
When running in simulator the icons don't show up. I have looked it up in xCode where it tells me that the "Resources" folder for the icons still contains the phonegap default icons. Same with Android.
What am I doing wrong?
How can I add custom app icons for iOS and Android with phonegap?
thanks
my config.xml
<icon src="icon.png" />
<icon gap:density="ldpi" gap:platform="android" src="res/icon/android/icon-36-ldpi.png" />
<icon gap:density="mdpi" gap:platform="android" src="res/icon/android/icon-48-mdpi.png" />
<icon gap:density="hdpi" gap:platform="android" src="res/icon/android/icon-72-hdpi.png" />
<icon gap:density="xhdpi" gap:platform="android" src="res/icon/android/icon-96-xhdpi.png" />
<icon gap:platform="ios" height="57" src="res/icon/ios/icon-57.png" width="57" />
<icon gap:platform="ios" height="72" src="res/icon/ios/icon-72.png" width="72" />
<icon gap:platform="ios" height="114" src="res/icon/ios/icon-57-2x.png" width="114" />
<icon gap:platform="ios" height="144" src="res/icon/ios/icon-72-2x.png" width="144" />
<icon gap:platform="blackberry" src="res/icon/blackberry/icon-80.png" />
<icon gap:platform="blackberry" gap:state="hover" src="res/icon/blackberry/icon-80.png" />
<icon gap:platform="webos" src="res/icon/webos/icon-64.png" />
<icon gap:platform="winphone" src="res/icon/windows-phone/icon-48.png" />
<icon gap:platform="winphone" gap:role="background" src="res/icon/windows-phone/icon-173.png" />
In cordova 3.3.1-0.1.2 the expected behavior is not working right.
in
http://cordova.apache.org/docs/en/3.3.0/config_ref_images.md.html#Icons%20and%20Splash%20Screens
it clearly states you're suppose to put them into your main www folder in a folder called res and icons that follow a particular naming convention instead of the original customizable config.xml specified way (in which you point to a file of your choosing, which was/is much better). it should take then from there for each platform and put them into the platforms/?android?/res/drawable-?dpi/icon.png but it does no such correct behavior at this time... bug.
so I guess we have to manually put them there for each platform. it would of course need to remove that from duplicating it into the www folder again. for me I had to totally replace the contents in the main www folder anyway because it simply didn't work with even hello world without hacking a redirect index.html to find some weird random folder there. Putting the res folder beside www makes the most sense but what ever it seems to be for me caused by this series of cascading and confusing design choices/flaws.
in some cases the internal skripts of cordova don´t put the icons in the right folder, therfore you can see the f*** cordova robot instead of your own icon.
Make use of hook script.;)
three-hooks-your-cordovaphonegap-project-needs
Create a folder "after_platform_add" in the hook folder and put/change the last skript from devgirl.
Don´t forget to set executive rights for the script, in linux
"chmod 777 <script>"
good luck!
Since most of the answers here are targeted towards iOS here's a solution for changing icon in Android.
For android:
Make changes in <project location>\platforms\android\ant-build\res and not <project location>\platforms\android\res
For some people making changes in the latter location may have worked, but having noticed Phonegap copying from \android\res into \android\ant-build\res, I decided to check in there and found a separate set of drawable folders containing the default phonegap icon.
Changing those finally worked.
Since I'm building and running locally and not using Adobe PhoneGap Build, changing icons in <project location>\www\res\icon\android didn't work either.
As of Cordova 3.5.0-0.2.6 the
<icon />
element in config.xml works with the following caveats:The
src
attribute is a path relative to your project root folder. The issue tracker about this issue reason why the change.The
<icon src="..." />
element without resolution/dpi is documented as the icon used by all platforms as the default icon. However, on android builds, the default icon is only copied to the android drawable folder, without specific resolutions set. This makes you custom icon appear in the/res/drawable
folder, and the cordova default icon with specific resolutions exists in the other folders inside the final apk (i.e./res/drawable-ldpi
). You must add one icon element inconfig.xml
for each resolution on the android platform.For instance, if your icon image is in the path
www/res/img/icon.png
relative to your root project, this lines inconfig.xml
makes your app icon in android works:With that configuration in place, you can have a single image icon for all resolutions overwriting the default cordova icon, and without custom hoooks. Simply building with
cordova build android
should do the trick.If you want an easy-to-use way to add icons automatically when building locally (
cordova emulate ios
,cordova run android
, etc) have a look at this gist:https://gist.github.com/LinusU/7515016
Hopefully this will start to work out of the box sometime in the future, here is the relevant bug report on the Cordova project:
https://issues.apache.org/jira/browse/CB-2606
FAQ: ICON / SPLASH SCREEN (Cordova 5.x / 2015)
I present my answer as a general FAQ that may help you to solve many problems I've encountered while dealing with icons/splash screens. You may find out like me that the documentation is not always very clear nor up to date. This will probably go to StackOverflow documentation when available.
First: answering the question
In your version of Cordova the
icon
tag is useless. It is not even documented in Cordova 3.0.0. You should use the documentation version that fits the cli you are using and not the latest one!The icon tag does not work for Android at all before the version 3.5.0 according to what I can see in the different versions of the documentation. In 3.4.0 they still advice to manually copy the files
In newer versions: your
config.xml
looks better for newer Cordova versions. However there are still many things you may want to know. If you decide to upgrade here are some useful things to modify:gap:
namespace<preference name="SplashScreen" value="screen" />
for AndroidHere are more details of the questions you might ask yourself when trying to deal with icons and splash screen:
Can I use an old version of Cordova / Phonegap
No, the icon/splashscreen feature was not in former versions of Cordova so you must use a recent version. In former versions, only Phonegap Build did handle the icons/splash screen so building locally and handling icons was only possible with a hook. I don't know the minimum version to use this feature but with 5.1.1 it works fine in both Cordova/Phonegap cli. With Cordova 3.5 it didn't work for me.
Edit: for Android you must use at least 3.5.0
How can I debug the build process about icons?
The cli use a CP command. If you provide an invalid icon path, it will show a
cp
error:Edit: you have use
cordova build <platform> --verbose
to get logs of cp command usage to see where your icons gets copiedThe icons should go in a folder according to the config. For me it goes in many subfolders in :
platforms/android/build/intermediates/res/armv7/debug/drawable-hdpi-v4/icon.png
Then you can find the APK, and open it as a zip archive to check the icons are present. They must be in a
res/drawable*
folder because it's a special folder for Android.Where should I put the icons/splash screens in my project?
In many examples you will find the icons/splash screens are declared inside a
res
folder. Thisres
is a special Android folder in the output APK, but it does not mean you have to use ares
folder in your project.You can put your icon anywhere, but the path you use must be relative to the root of the project, and not
www
so take care! This is documented, but not clearly because all the examples are usingres
and you don't know where this folder is :(I mean if you put the icon in
www/icon.png
you absolutly must includewww
in your path.Edit Mars 2016: after upgrading my versions, now it seems that icons are relative to
www
folder but documentation has not been changed (issue)Does
<icon src="icon.png"/>
work?No it does not!.
On Android, it seems it used to work before (when the density attribute was not supported yet?) but not anymore. See this Cordova issue
On iOS, it seems using this global declaration may override more specific declarations so take care and build with
--verbose
to ensure everything works as expected.Can I use the same icon/splash screen file for all the densities.
Yes you can. You can even use the same file for both the icon, and splash screen (just to test!). I have used a "big" icon file of 65kb without any problem.
What's the difference when using the platform tag vs the platform attribute
is the same as
Should I use the gap: namespace if using Phonegap?
In my experience new versions of Phonegap or Cordova are both able to understand icon declarations without using any
gap:
xml namespace.However I'm still waiting for a valid answer here: cordova/phonegap plugin add VS config.xml
As far as I understand, some features with the
gap:
namespace may be available earlier in PhonegapBuild, then in Phonegap and then being ported to Cordova (?)Is
<preference name="SplashScreen" value="screen" />
required?At least for Android yes it is. I opened an issue with additional explainations.
Does icon declaration order matters?
Yes it does! It may not have any impact on Android but it has on iOS according to my tests. This is unexpected and undocumented behavior so I opened another issue.
Do I need
cordova-plugin-splashscreen
?Yes this is absolutly required if you want the splash screen to work. The documentation is not clear (issue) and let us think that the plugin is required only to offer a splash screen javascript API.
How can I resize the images for all width/height/densities fastly
There are tools to help you do that. The best one for me is http://makeappicon.com/ but it requires to provide an email address.
Other possible solutions are:
Can you give me an example config?
Yes. Here's my real
config.xml
A good source of examples are starter kits. Like phonegap-start or Ionic starter