Friday, July 31, 2009
iTunesConnect crash reports
symbolicatecrash attempts to be very clever at finding the symbol files based on the applicaton GUID found in the crash report. Unfortunately even if you use a revision control system, get the exact revision of the code you released to the iTunes store and re-build, symbolicatecrash wont find the debug symbols because the applications GUIDs don't match.
In a pinch you can break open the symbolicatecrash script file, brush up on your Perl skills and force it to use the symbol file created by the re-build.
But for all future releases you can just have Hudson archive the debug symbol files for you and life will be much easier.
zip -r -T -y "myApp_ProdSymbols.zip" "myApp.app.dSYM"
Friday, July 17, 2009
iPhone app distribution made easy - Part 4
One of the most important items for any kind of software development is a version/revision control system. There are many flavors of version control systems and many arguments for and against each one. Ultimately they all provide the ability to track changes in code over time and provide the ability to manage development paths. For the purpose of this post I'll be referencing SubVersion (http://subversion.tigris.org/).
Introducing Hudson
Hudson is a continuous integration build system that enables easy tracking and running of builds. Hudson can be downloaded from https://hudson.dev.java.net/ and is very easy to get started and can be run on the Mac with the following command "java -jar hudson.war".
Hudson is integrated with subversion so builds can be triggered by subversion code commits. Builds can also be launched manually. One of the great strengths of Hudson is that it manages all the build numbers and build artifacts for you so you don't have to think about it.
Basic steps
The steps to get Hudson building your iPhone applications are quite simple and follows the format:
- Create a new hudson job
- Point Hudson to your subversion repository
- Create a build step to run the build scripts developed earlier in Part 2 and Part 3.
- Instruct Hudson to save the build output.
Example Build step
The following build step starts by creating some variables for build folders etc using some of Hudson's built in environment variables. It then builds the AppStore and AdHoc distributions.
PROJDIR=${WORKSPACE}/myApp
ADHOC_BUILDDIR="${PROJDIR}/build/myAppAdHoc/DistributionAdHoc-iphoneos"
APPSTORE_BUILDDIR="${PROJDIR}/build/myAppAppStore/DistributionAppStore-iphoneos"
BASEFILENAME="${JOB_NAME}_${BUILD_NUMBER}(rev-${SVN_REVISION})"
echo Building AppStore release
cd "${PROJDIR}"
xcodebuild -target "myAppAppStore" -configuration "DistributionAppStore" -sdk iphoneos2.1
cd "${APPSTORE_BUILDDIR}"
zip -r -T -y "${BASEFILENAME}_AppStoreApp.zip" "myApp.app"
echo Building AdHoc release
cd "${PROJDIR}"
xcodebuild -target "myAppAdHoc" -configuration "DistributionAdHoc" -sdk iphoneos2.1
cd "${ADHOC_BUILDDIR}"
zip -r -T -y "${BASEFILENAME}_AdHocApp.zip" "myApp.app"
The output zip file name will include the build number & subversion revision number for easy reference.
Example: myApp_13(rev-99619)_ProdApp.zip
Example artifacts archive
Hudson has the ability to perform wild card searches when looking for build artifacts. The following will search both the AdHoc and AppStore build folders for their output files.
myApp/build/**/*.zip
Conclusion
So hopefully you are now inspired or atleast aware of how you can make your own iPhone development easier.
iPhone app distribution made easy - Part 3
So lets use the "zip" command line utility to compress the app bundle:
zip -r -T -y "myApp_AppStoreDistribution.zip" "myApp.app"
The important option to note here is the "-y" option that stores symbolic links as the link. This is important because the app bundle contains symbolic links to the code signature folder.
If the symbolic links don't exist the application will not be accepted and iTunesConnect will complain with an error like:
The binary you uploaded was invalid. The signature was invalid, or it was not signed with an Apple submission certificate...
Now all that is left for us to do is formalize the build process and we're good to go. Next time I'll introduce the continuous integration engine called Hudson.
iPhone app distribution made easy - Part 2
Here's an example of how to build the AppStore distribution:
xcodebuild -target "myAppAppStore" -configuration "DistributionAppStore" -sdk iphoneos2.1
As you'll notice the target, configuration and the sdk to use are being specified. Note: The sdk option is new for the 3.0 sdk and can take either the name or path of the sdk to use.
You can view all of the installed sdks by running the following command:
xcodebuild -showsdks
So now we have the ability to build the distributions without thinking about it. We could put this in a script and call it a day but lets not stop there. Next time we'll zip up the app bundle for submission to the AppStore or AdHoc users.
iPhone app distribution made easy - Part 1
- Registered for the iPhone developer program.
- Created you unique AppID.
- Requested your code signing certificate.
- Created your distribution profiles for iTunes store and AdHoc.
- Installed these items on your development machine.
Armed with these items we'll begin by setting up the project.
Creating distribution configurations
Using the "project info" window's "configurations" tab duplicate the Release configuration twice. I named the two configurations "DistributionAdHoc" and "DistributionAppStore" but you're free to come up with your own convention.
The next step is to assign the "code signing identity" to the corresponding distribution profile. Do this in the "build" tab.
Creating the AdHoc target
The only difference with the AdHoc target is that it has the iTunesArtwork file so that iTunes will display the application icon. The application icon for the iTunes for the AppStore distribution will actually come from the iTunes store.
Create a new target by selecting the projects current target and duplicate it. Rename the target to something that indicates that its the AdHoc target. Add the iTunesArtwork file to the "Copy Bundle Resources" step of the target.
Note: The iTunesArtWork file is a 512x512 png file with no extension in the root of the app bundle.
One step closer
So now you should be able to select the Target, Configuration and SDK and build your specific distribution.
Next time we'll use the command line build utility xcodebuild to take the thought out of building.
Thursday, July 16, 2009
Giving back
I hope to rectify this by sharing tips and tricks that I've learned along the way.