Titanium Alloy theme switcher with theme-based tiapp.xml support
Allows you to switch Alloy themes from the command line and also supports theme based TiApp.xml files.
This was an experiement to solve an issue I have with an app (or series of apps) built from a single code base. I first attempted to solve it with TiCh which kind of works, but isn’t great when it comes to having Android sections in the Tiapp.xml file.
The only way to resolve that was to have separate TiApp.xml files for each app. So the solution I came up with was have a “throwaway” tiapp.xml file that can get replaced with the correct one for each theme.
As global CLI:
$ npm install -g tith
For detailed usage information use the help option, -h
$ tith -h
or with a specific command
$ tith set -h
This will show the current theme name:
$ tith status
$ tith set <name> [platform]
if you omit a platform (ios or android) it’ll default to ios.
A handy feature is the ability to switch tiapp.xml files with the theme change. This means you can have one code base, use themes for different clients / apps and switch the tiapp.xml file to change the app name, id etc.
The simplest way to use the tiapp.xml theming is to place your tiapp.xml file for each theme in the relevant folder. There’s support for a single tiapp.xml file, or files per platform.
Valid paths are (in order they are checked):
- app/themes/app1/ios/tiapp.xml
- app/themes/app1/android/tiapp.xml
- app/themes/app1/tiapp.xml
As of version 1.1.2 you can also theme the DefaultIcon.png — DefaultIcon.png was added in Titanium SDK 5.0.0+ to auto-generate all required App Icons. Unfortunately DefaultIcon.png isn’t supported with themes out-of-the-box with Titanium so TiTh now supports this.
Like the tiapp.xml, just drop a DefaultIcon.png in the theme folder OR the platform folder and TiTh will find this and copy to the project root.
Valid paths are (in order they are checked):
- app/themes/app1/ios/DefaultIcon.png
- app/themes/app1/android/DefaultIcon.png
- app/themes/app1/DefaultIcon.png
Using the config above, the following will update the theme to app1 and copy the tiapp.xml file from it’s theme folder to the app root.
$ tith set app1 ios ;
To clear the theme, just use
$ tith clear;
However, if you want to have a default tiapp.xml file when no theme is specified, you can do this by creating a specially named folder in themes folder, prefixed with an underscore. So:
- app/themes/_default/tiapp.xml
- app/themes/_default/ios/tiapp.xml
- app/themes/_default/android/tiapp.xml
(If a theme folder is prefixed with _ then the theme will be cleared in config.json but the tiapp.xml will still be used).
This module also contains support for building apps with Fastlane. Currently it only supports the copying of Appfiles, but copying application metadata for updating store listings is a planned feature for the future.
To copy Fastlane files use the fastlane option
$ tith set -F <theme> <platform>
or
$ tith set --fastlane <theme> <platform>
Note that the platform parameter is required when using the fastlane option and will not default to ios
There are a few requirements for setup:
platform/<platform>/fastlane
directory so for example the full path to an Appfile should be app/themes/<theme>/platform/<platform>/fastlane/Appfile
.[appc] ti config cli.ignoreDirs "^(\\.svn|_svn|\\.git|\\.hg|\\.?[Cc][Vv][Ss]|\\.bzr|\\$RECYCLE\\.BIN|fastlane)$"
.If your project is version managed, it is also recommended to add the Appfile located in the fastlane directory to your .gitignore
since it will only be used as a dummy file to be replaced, much like the root tiapp.xml
Copyright 2015 Jason Kneen
Licensed under the Apache License, Version 2.0 (the “License”);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.