RSSAmplifier

Blog

Development with Alex Nachbaur

Recent content on Development with Alex Nachbaur

nachbaur.comRSS feed ↗100 posts

Latest posts

👾 The Dungeon of Ymir: A Daughter, Disassembler, and Her Dad's RPG

My father, Fred Nachbaur, died of cancer in September of 2004. He was 53 years old. I had just moved to Canada not long before, and our relationship, which had always been complicated, never got the resolution that I think both of us probably wanted. He was brilliant, generous, stubborn, private, and deeply creative. He was a musician, an electronics/radio engineer, a programmer, and by all…

🎉 Celebrating my two-year anniversary at Okta

I’m happy to share that today is my 2-year anniversary at Okta! This would make more sense if I’d originally announced on this blog that I’d changed jobs and started working at Okta, so I’ll take a moment to recap what’s happened in the past two years, and some of the milestones and accomplishments I’m most proud of. 
 
 Before joining Okta, I worked at…

Building a stretchable UITableView header

Someone on Twitter recently asked how to implement a TableView header that will stretch and resize as the content is scrolled, so I thought I’d spend a few minutes to provide a good example. Since I thought it’s a neat trick
that’s often overlooked, I felt it was worthy of wrapping a post around it to explain how it works, maybe giving others the ability to replicate this…

UIMotionEffect: Easily adding depth to your UI

One of the “delightful” features of iOS is the almost imperceptible UI effects they add to give the illusion of depth. One of the most under-appreciated features is UIMotionEffect, which ties the device’s gyroscope to your views to make them adapt to how the user moves their phone. 
 This can be seen throughout iOS, from your lock screen to your app icons in Springboard (the iOS app launcher).…

Styling your app using custom UIAppearance properties

UIAppearance is analogous to CSS for UIKit, while being compatible with both Interface Builder and traditional styling in code, without sacrificing performance. It’s a way of declaratively assigning UI style values to your views, without needing to manually tweak settings throughout your codebase. This makes it easy to define your app’s visual style centrally, which makes maintenance simpler when…

Working with multiple architectures & compiled binaries

When working with iOS apps (or really anything within Apple’s ecosystem) I’ve sometimes found the need to deeply introspect the libraries and executables built in my project to answer questions like “Is bitcode enabled for all architectures?” or “Which architectures was this binary compiled for”, and so forth. 
 These aren’t easy questions to answer unless you know your way around the…

In defence of Apple’s bug process

Everyone has a love/hate relationship with bug reports. For the user, they’re a nuisance to file. For the engineer receiving a bug report, it means extra work and the sad realization that your product isn’t perfect. 
 I’ve been frustrated with Apple’s handling of bug reports just as much as everyone, but haven’t really thought much about it recently. But with some recent talk on the topic, I…

LLVM Module Maps to the rescue!

I recently wrote about Cocoa / Cocoa Touch frameworks , and in writing about it I was sorely tempted to dive into Modules, since they are pretty important to modern frameworks. But it was such a huge topic, I decided to break it out into a separate post. 
 In a nutshell, LLVM Module Maps were invented as a way to improve how source code imports other frameworks. 
 If you’ve ever worked on…

Cocoa Dynamic Frameworks

If you don’t know the nuts and bolts of how your code is compiled, linked, and executed on target devices, you aren’t alone. And lets be honest, this is perfectly fine! That’s the great thing about abstraction: not everyone need be an expert at everything in order to be effective. 
 There are times though where a little bit of knowledge can go a long way to help troubleshoot particularly…

Rebooting my blog, again

I feel that every few years I write a post like this. It’s filled with statements like “Life got busy”, or “I had a problem with my server and didn’t notice”, or some other reason that seems insignificant in the grand scheme of things. 
 This time around though I have a very good reason for a 5-year break in my blogging activities. It started out as being just generally busy with travel, and…

Forcing a method to run on the main thread

You know how many times, as an iOS developer, you want to ensure some method or delegate call occurs on the main thread? We do this dance countless times, and while it’s straight-forward enough, it can be a burden sometimes. 
 Here’s an easy way to keep your thread access safe, without having to write a lot of code in the process.

Don’t live to work…

Many people have heard the phrase “Don’t live to work; work to live”. This usually means that the goal of working should be to enable you to live your life, rather than allowing work to consume your life. Far too many people in the tech industry sacrifice their families, spouses, children, and even their sleep, in order to make it in this industry.

Docset Viewer update v1.5

The past year has been quite a ride, to say the least! I have been so busy with work, creating awesome features and technologies on iOS apps that over a year has raced by without an update to my blog! 
 I’ve also been neglecting my own apps due to being so overwhelmed with the requirements of my work as the lead developer for Salesforce.com’s iOS Chatter app , so it wasn’t until recently that…

My App Store release checklist

For the longest time it seemed that releasing an update to an iOS app was a random whack-a-mole process that I’d invariably get wrong in some way. It was maddening, especially since iTunes Connect has only recently become a decent web application. By switching to Jenkins for continuous integration of my iOS app builds I’ve greatly improved my process, but things didn’t really improve until I…

Logging with CocoaLumberjack and TestFlight

Consider the following situation that happens far too often in mobile app development: You’ve just released an app that works perfectly for you, and you’ve tested it extensively. You’re proud of your accomplishments and submit the app to the world, only to have several emails sent to you from users who have nothing but difficulties in running the app. You send a bug fix release to the App Store,…

Docset Viewer v1.2 and how to customize iCloud backups

I’ve recently released version 1.2 of Docset Viewer, which fixes a number of bugs people experienced with the previous version. If you had problems with the previous release, please give this one a try. 
 One of the improvements I’ve added is the ability to customize whether or not you would like to back up your Docsets (which can get quite large) into iCloud. To keep with the instructional…

Docset Viewer: Resuming large downloads with NSURLConnection

As I’ve shown in my previous post announcing Docset Viewer , I want this series of posts to be more than me talking about my new app. In keeping with the instructional nature of my site, I’m going to show you a few things that I did in my new app Docset Viewer and how I put it together. This time around I’m going to show how I use NSURLConnection for downloading large files, and even resuming…

Announcing Docset Viewer v1.1 for iPad and iPhone



 Over the years my blog has transformed from the usual “Wordy geek ranting about first-world problems” content toward more educational and informative posts on what I do for a living: developing awesome iOS applications. I don’t usually talk about the actual applications I’m writing though, since most of my work is on other people’s apps (and I’m not allowed to spill the beans on…

Core Graphics isn’t scary, honest!

For anyone who’s developed exclusively with UIViews on iOS may take the title of this post a bit oddly. “WHAT?!” they might say, “Are you insane? Core Graphics is not only a C-only API, but has confusing function names, and needs way more code to do the same thing I can do in less code in UIView”. Yes, they might be right, but there’s a reason why Core Graphics exists. It’s FAST! 
 But using…

Back To Basics: Simple debugging tips in Xcode

As developers we spend most of our lives dealing with broken and barely-functional software: our own software. We do our best to make the applications we develop somewhat less broken and try to add features to make it functional. And once we finally get our software working bug-free and functioning stably, what do we do? Do we bask in the joy of a stable app and spend countless hours enjoying that…

Building a static library with Jenkins

One of my pet peeves is Open Source iOS libraries distributed as just a collection of Objective-C classes, rather than being bundled as a static library. I know a lot of people prefer it that way, but from a maintainability standpoint it really doesn’t make much sense to me. So when I’m faced with another library I want to use that doesn’t have a static library readily available for it, I…

Using GCD and Blocks Effectively

With iOS 4.0 Apple introduced two new technologies to the iOS platform: Grand Central Dispatch, and blocks. Simply put, it is to multi-threaded programming what fire is to a barbecue. Sure you can do without it, but the end result is much better. 
 Despite all this, developers still seem to avoid using it. Some of the reasons for this, off the top of my head, could be backwards-compatibility…

Back to Basics: Using KVO

One of the things I like most about Apple’s iOS SDK is the consistent and easy-to-use API they provide. Across all their different frameworks there’s a pattern at work that makes using their classes easy to understand. This is due in part to the simplicity for configuring those objects. In most cases you don’t need to call cryptic methods to setup or teardown classes. If you want to change a…

Back to Basics: Simple UITableViews

Following up on my previous post in this series, I’m going to continue talking about beginner topics that I and many other developers take for granted. So for this entry in my “Back To Basics” series I’d like to talk about UITableViews, and how to simply and easily construct one without convoluted or confusing code. 
 This topic in particular is something I’ve struggled over in the past and…

Back To Basics: Positioning UIViews

These days I’ve been working on some fairly advanced iOS development techniques on my various projects: I’ve taught myself (badly) about Core Audio, I’m learning OpenGL, I’m developing a series of applications using Core Data, asynchronous parsing of JSON from a streaming HTTP connection, etc. It’s extremely fun and easy once you understand the basics. 
 What I tend to forget however is that…

Smarter and More Reusable Core Data

Like most developers, I look to Apple’s default application templates to get up-to-speed on what would appear as being the Right Way™ of developing apps on iOS. In practice however what you need to realize is Apple’s templates are meant to be the easiest introduction to a set of tools that can be fairly complicated for beginners to understand. Core Data is one of those areas. The problem is when…

Building iOS apps for Over-The-Air AdHoc distribution

I’ve written about building iOS applications with Hudson Jenkins, but until recently there hasn’t been a convenient way of getting those applications to your testers. Of course the most important part of your build output will be the app bundle you send to Apple’s iTunes Connect web interface, but throughout your development cycle you’ll want to test your app. Sure you could build and deploy a…

Animating Interfaces with Core Animation: Part 4



 This is the fourth in a series of posts I’m writing on animating iOS interfaces using Core Animation. In the first post I created a planetary orbit demo using nested CALayer objects. The second post showed how to dress up a UI by animating an image. The third post shows how you can trigger animations in response to button actions. 
 This post will show how you can create the…

Animating Interfaces with Core Animation: Part 3



 This is the third in a series of posts I’m writing on animating iOS interfaces using Core Animation. In the first post I created a planetary orbit demo using nested CALayer objects. The second post showed how to dress up a UI by animating an image. 
 This time I’ll show how you can trigger animations in response to button actions to illustrate to the user that an action is taking…

Animating Interfaces with Core Animation: Part 2



 This is the second in a series of posts I’m writing on animating iOS interfaces using Core Animation. In the previous post I created a planetary orbit demo using nested CALayer objects. 
 This time I’m going to show how you can dress up a UI by creating a simple effect using an image and Core Animation.

Animating Interfaces with Core Animation: Part 1



 One of the greatest things about the iOS platform and applications people see on it is its beauty. Smooth gradients, consistent transitions, and animations that illustrate the transition of UI elements from one state to another. Animations are more than flashy eye-candy; they tell the user what’s happening. If an element is being deleted, instead of it simply disappearing it fades or…

iOS Development Link Roundup: Part 1

I’ve often been asked by people about where to start with iOS programming, whether they be co-workers, colleagues in the same line of work at other companies, or even total strangers who happen to see me happily working away on my personal projects in Xcode. Some rather naïve people assume that I learned from a book, still others even think I took a class to learn all of this! I can say…

Fun shadow effects using custom CALayer shadowPaths


 
 Shadowed view using a rectangular shadowPath 
 
 

 I recently had to improve the performance of a few views that utilized CALayer-based shadows on rounded-rect UIView objects. On this particular iPad application, when the device was rotated, the views rotated quite a lot slower than we would have hoped. It wasn’t a show-stopper, but the jerky rotation animation made it…

Allergies, and why Kimpton Hotels Rock

As some of you may be aware, I have enough allergies to various common foods to have earned the name “bubble-boy” from my friends. In fact, my wife’s friends used to semi-joke about me while we were first engaged that she should take a good life-insurance policy out on my, “just i n case”. She used to laugh at that, until she had to race me to the hospital a couple times, or stay up all night to…

Rendering views using CALayer, Part 1



 

For myDrumPad the main pad buttons are images. I create a UIButton object, and use setBackgroundImage:forState: to customize which image will be used for each state (UIControlStateNormal and UIControlStateHighlighted mainly). I customize the title label font, shadow and color, and voilà I have a pad button that simulates the look and feel of a Korg padKONTROL . There’s just a…

Even geeks forget their passwords



 Passwords are definitely fickle beasts. I’m used to juggling a multitude of different semi-incomprehensible passwords containing a mixture of numbers, symbols, upper and lower-case letters, and in some cases unicode characters (letters such as ü, • and §). And for some mysterious reason I’m able to remember these gibberish-filled passwords with ease. But despite all this, when asked to…

Boomle, the underdog of my iOS apps



 Boomle is by far the lowest-selling app I have published on the iTunes App Store, and sadly as a result I just haven’t had the motivation to dedicate more time to it. However it’s times that I see people using it in person that I see just how much people enjoy playing it. I really hope I’ll have time to revisit it, because it’s one of those games that people just “get”, and is enjoyably…

Blogging every day ≤ Coding every day

My life is pretty darned busy right now. Transitioning to a new job , travel for work, helping @dccp with her travel arrangements for her academic conferences, my own iOS projects, and my blog. Since the time I have available to work on my own coding experiments is limited to evenings and weekends. I’ve been recently attempting to focus on just one or two projects at a time, since for a while…

Revenue Canada wants me to buy an iMac 27″



 For as long as I’ve been a developer, there was only ever once when I had a machine that I felt was an adequate development workstation. That was around 2001 when I had a dual-proc 667MHz P3 768MB RAM and three 17″ CRT monitors. This baby put out enough heat that my home-office didn’t need a heater on during the rainy Seattle winters; in fact, it was so warm in there that I’d wear…

Recovering from bit rot



 One of the things that’s hard as a developer is keeping your legacy code up to date. It’s all too easy to fire-and-forget; write your code, debug it just enough so that it compiles, and then forget it until it breaks again. I’m guilty of that as well. In fact, just today I discovered that my continuous deployment configuration for Boomle was broken…for the past 3 months. 
 After…

Localizing iOS apps using ICanLocalize.com



 As with most things, the amount of work we as developers see when starting an iOS application is just the tip of the iceberg. There’s artwork, “About” screens, tutorial pages, icons, the app’s website, and all the marketing the app needs to get it out there. Even writing the app’s description or taking screenshots for the App Store is a time-consuming process. So anything I can do to…

Most blog templates suck

I’m a fairly decent web designer. I’m not great by any stretch of the imagination, but I’m not really visually creative. I tend to express my creativity in the apps I build, as well as in my writing. So given the fact that I’m really proficient in CSS and HTML, I can make simple web applications look good if I don’t have the help of a designer. That being said nothing replaces a great UI designer,…

This is not the toast you are looking for…

Last night while watching TV I had a conversation with my wife Deanna that made me realize that she is, as far as I’m concerned, a Jedi Knight. 
 I never really have that much of an appetite, and it’s not uncommon for me to skip meals altogether. Since yesterday we had a late lunch, I ended up skipping dinner. Normally it wouldn’t be a big deal, except that I thought I’d forage for a little…

Using Amazon S3 as your iOS app’s server-side

While developing myDrumPad, I came across an interesting problem for my in-app purchase support. The app allows users to download additional packs of sounds (referred to as “sound packs” in the app) that they can use to tap out songs and rhythms. The sound packs themselves were a collection of CAF-encoded uncompressed PCM audio files, with a single configuration file describing the labels and…

I’m now a Canadian Citizen

Today, I’m proud to announce that I’m officially a Canadian Citizen! I’ve lived in Canada for 7 years now and almost all of my family lives here, but since I was born in California, I’ve technically been an American for all that time…until today. 
 No longer will I have to sheepishly explain myself when US teams play against the Canucks. No longer will I have to carry a stupid Permanent…

Showing Apple my app via Facebook

I’ve been working recently on getting more exposure to my existing apps, especially myDrumPad. It’s a fun app, and I have a few more updates that are in the works when I get a couple of free weekends, but frankly I’d like to see its sales figures climb a bit higher than they are now. Of course, if you’re an iOS developer, you’ll know the biggest thing that can improve your sales rankings is to be…

New application: Should I use Three20 or raw UIKit?

I’ve been considering starting a new project recently, and have been torn: Should I create my project using Three20, or should I use UIKit directly? I know Three20 is supposed to help by making applications easier to develop, but what does it really buy me as a developer? In my experience, most of my time with Three20 has been spent working around its various quirks. And from what I can tell from…

I’m trying to blog every day this month

Because of my friend Chris Simmons , I’m going to try my hand at NaBloPoMo , the National Blog Posting Month. As if people didn’t write enough drivel on the Internet when they have something substantial to say, people are encouraged to blog even more with nothing at all to motivate them. 
 Okay…I’ll bite. I’ve been meaning to be more consistent in my blogging lately anyway. So starting today,…

New job, and new career path

Some of you who follow me on Twitter may have noticed recently that I’ve been talking about working for a new company. This week is my first week working for Salesforce.com . I’m really excited about the move for a number of reasons, some of which I’ll go into here. 
 As of this past Monday, I’m now a full-time iOS developer, instead of being limited to evenings and weekends. I’m a new…

Filtering great ideas to fit my available time (and budget)

I’m an avid “Idea Man”. I love coming up with new ideas; for iPhone apps, for web apps, and even for real-world inventions. Most of my ideas only sound great in my head, but when I open my mouth the idea seems to turn sour. A smaller number of ideas manage to survive the thought-to-word boundary. An even smaller minority of those ideas manage to make it down onto my “Idea Book” that I use to keep…