Saturday, 21 April 2012

AppCode Delegate Pattern Live Template

Here's a Live Template to generate a common delegate pattern in AppCode, JetBrain's Objective-C IDE.
Variables set as:
name expression default value
---------------------------------
class CLASS
class2 decapitalize(class)
---------------------------------
@class $class$;
@protocol $class$Delegate <NSObject>
-(void)$class2$DidSave:($class$*) sender;
-(void)$class2$DidCancel:($class$*) sender;
$end$
@end
---------------------------------
Output:
Type in FooBarViewController.
@class FooBarViewController;
@protocol FooBarViewControllerDelegate <NSObject>
-(void)fooBarViewControllerDidSave:(FooBarViewController*) sender;
-(void)fooBarViewControllerDidCancel:(FooBarViewController*) sender;
@end
view raw Live template hosted with ❤ by GitHub

Thursday, 19 April 2012

Script to automatically create retina and non-retina versions of images

I often get sets of files from graphic designers for iOS apps. Ensuring that the standard and @2x versions of all the files are present and correct is a bit of a pain, for the artist and for myself. The number of times there's been a mispelling in one of the images has been.. well .. many.
Instead I now ask them to send only the retina versions of the images, without the @2x tag in the filename (this has caused confusion).

I then run this script on the whole folder of files, and out pops a folder containing all the files properly renamed and resized. I use the incredible useful 'sips' command-line application that comes with OSX.

The fiddly bit of this script was working out the new size of non-retina images. Yes, they're half the size, but sips doesn't support percentages.
Credit to (person on superuser.com who I'll find eventually) for the neat sed command to extract the pixel size from the output of sips.
Note: clearly the file extension part can be done better. But it works for me right now.
#!/bin/sh
echo "This script will take an input folder full of images and assuming they're all retina sized, output the second folder to have retina and standard sized images."
if [ ! $# == 2 ]; then
echo "Usage: $0 in out"
exit
fi
if [ ! -d $1 ]
then
echo "Please provide a valid input path as first parameter"
exit
fi
if [ ! -d $2 ]
then
echo "Please provide a valid output path as second parameter"
exit
fi
here=`pwd`
inDir="$1"
outDir="$2"
echo "Processing $1.."
cd ${inDir}
# $1 file path of image to process $2 the extension of said file
function process_extension() {
local file="$1"
local ext="$2"
local height=`sips --getProperty pixelHeight "$file" | sed -E "s/.*pixelHeight: ([0-9]+)/\1/g" | tail -1`
local width=`sips --getProperty pixelWidth "$file" | sed -E "s/.*pixelWidth: ([0-9]+)/\1/g" | tail -1`
local at2xFile=`echo "$file" | sed -E "s/(.*)\.$ext/\1@2x.$ext/g"`
echo "$at2xFile @ $height x $width"
local smallHeight=$(($height/2))
local smallWidth=$(($width/2))
echo "$file @ $smallHeight x $smallWidth"
local outFolder="`dirname "$here/$outDir/$file"`"
mkdir -p "$outFolder"
#cp "$here/$inDir/$file" "$here/$outDir/$at2xFile"
# version 2 - re-process EVERYTHING. Useful if silly export settings are used.
sips -z $height $width "$here/$inDir/$file" --out "$here/$outDir/$at2xFile"
sips -z $smallHeight $smallWidth "$here/$inDir/$file" --out "$here/$outDir/$file"
}
# files all files with given extension in folder
# $1 the extension (e.g. png). NO DOT
function do_for_extension () {
local ext=$1
echo "==============================="
echo " Doing $ext files"
echo "==============================="
find * -not -iwholename '*.svn*' -name "*.$ext" | while read file; do
process_extension "$file" $ext
done
}
do_for_extension png
do_for_extension PNG
do_for_extension jpg
do_for_extension JPG
do_for_extension jpeg
do_for_extension JPEG
echo "------------------------------"
echo "DONE"
# go back to original folder
cd -
view raw process.sh hosted with ❤ by GitHub

Thursday, 5 April 2012

Get version number of live app on App Store in Phonegap app

A nice feature you might want to add to your iOS app is to notify the user when a new version is available on the App Store. Of course the user can go to the App Store manually and install the update, but we've noticed quite a few users don't do this very often. Some carefully-judged prompting is bound to help.

It turns out there's an API that Apple run that can return, in a handy JSON or JSONP format, the metadata for a particular app on the app store. This includes both the version number of the app, and even better, the 'what's new in this version' text.

You can use this information on your app's startup to check if a new version is available, and tell the user what's in it, and then finally, link them to the update page for the app.

Here's some bare-bones bits of example code to get you going. You'll need to know your app's Apple ID (e.g. 387022138). You can find this in the iTunes Connect interface). I'm also assuming that you're using jQuery or Zepto in your app.

The below also works in the browser.

// Alert the version number and release notes of an app.

    $.ajax({
        url:"http://itunes.apple.com/lookup?id=<APPLE ID HERE>&callback=?",
        success:function(data) {
            if (data && data.results && data.results.length) {
                alert(data.results[0].version);
                alert(data.results[0].releaseNotes);
            }
        }
    });

Here's the full list of data you might want to use:
Screengrab showing properties of the response from the API call. Click to view full size.


To open iTunes looking at your App's update page open the following URL:

itms-apps://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftwareUpdate?id=<APPLE ID HERE>&mt=8