A Collection of interesting iOS Open Source projects

I just finished a large project so I decided to take a moment to sort through the multitude of open source iOS projects (new and old) and pick out a couple of the most interesting and useful. I have collated my results below; a sort of whose who of iOS open source projects. I have tried hard to keep the descriptions brief so I don’t bore you. There are many hidden gems in each project that will save you hours of time so have good look at each.

CocoaPods

First off, if you haven’t already checked out CocoaPods, do it now! It is an awesome dependency manager for your iOS and Mac projects, which has saved me countless hours of pain and headaches.

CocoaPods creates a workspace for your Xcode project and adds a Pods project to that workspace. The Pods project encapsulates all of your third party libraries and all related compilation settings. It will automagically setup each library within your Pods project, so you don’t have to worry about -fno-objc-arc compiler flags for non-ARC source or adding SystemConfiguration.framework for some project you didn’t realise needed it, basically the kind of obvious misstep that might result in a wasted afternoon googling. Each time you build, it will compile the Pods project into an easily digestible static library for your Xcode project to link against and make all the necessary header files available to you.

Also, check out the CocoaPods Podspec repo; it hosts a stellar collection of iOS/Mac open source projects. Coincidentally, all of the projects listed below are currently available through the CocoaPods repository.

Currently Using

AFNetworking
AFNetworking was created by two talented guys (Mattt Thompson and Scott Raymond) from the now defunct, Gowalla (don’t worry AFNetworking will live on without Gowalla). It is an incredibly useful networking library, which is built on top of NSURLConnection and NSOperation. It uses Block based callbacks which gets a big tick from me and provides you with AFHTTPClient which “captures the common patterns of communicating with an web application over HTTP”. This handy class encapsulates all the information needed for communicating with one web service.

Magical Record
Magical Record was inspired by the ease of Ruby on Rails’ Active Record fetching and aims to reduce your CoreData code by reducing the amount of boilerplate code and condensinf CoreData’s very verbose and long winded fetch syntax.

Will Use

A2DynamicDelegate
I am a huge fan of Blocks and A2DynamicDelegate aims to allow you to convert any delegate, datasource or arbitrary protocol into a block based delegation. It uses some serious Objective-C runtime hoodoo to allow you to dynamically implement methods in a protocol using blocks.

    // Create an alert view
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle: @"Hello World!"
                                                        message: @"This method is implemented using blocks!"
                                                       delegate: nil cancelButtonTitle: @"Meh."
                                              otherButtonTitles: @"Woo!", nil];

    // Get the dynamic delegate
    A2DynamicDelegate *dd = alertView.dynamicDelegate;

    // Implement -alertViewShouldEnableFirstOtherButton:
    [dd implementMethod: @selector(alertViewShouldEnableFirstOtherButton:)
              withBlock: ^(UIAlertView *alertView) {
        NSLog(@"Message: %@", alertView.message);
        return YES;
    }];

    // Implement -alertView:willDismissWithButtonIndex:
    [dd implementMethod: @selector(alertView:willDismissWithButtonIndex:)
              withBlock: ^(UIAlertView *alertView, NSInteger buttonIndex) {
        NSLog(@"You pushed button #%d (%@)", buttonIndex, [alertView buttonTitleAtIndex: buttonIndex]);
    }];

    // Set the delegate
    alertView.delegate = dd;

FormatterKit
FormatterKit is a collection of NSFormatter subclasses which allows you to format an impressive range of data types. It can format arrays (e.g. “Russell, Spinoza & Rawls”), hours of operation (e.g. “Mon-Wed: 8:00AM – 7:00PM”), ordinal numbers (eg. “1st, 2nd, 3rd” / “1ère, 2ème, 3ème”) and time intervals (e.g. “3 minutes ago” / “yesterday”) to name a couple.

DCIntrospect
Introspect is a handy set of tools for any iOS developer who doesn’t use Interface Builder and creates his/her view layouts at runtime. It has a couple of really cool tricks up its sleeve like automatically rendering view frames, displaying view insets and a set of really useful key bindings, which allows you to access helpful view debugging information while your app is running.

ConciseKit
A set of Objective-C additions and macros that will make your code more concise. The ConciseKit GitHub page gives you a nice rundown of handy Macros and shorthands it implements. Some of it will be made redundant by the new Objective-C literals you can with the upcoming Apple LLVM 4.4, but there is a tonne of other handy stuff in there like simple method swizzling, shorthand paths and a large number of concise NSArray additions.

JRSwizzle
JRSwizzle makes method swizzling a breeze and uses the most robust method depending on the version of Objective-C runtime.

BlocksKit
BlocksKit adds a tonne of Block based methods to your favourite Foundation and UIKit classes.

Honourable Mentions

NYXImagesKit
LRTableModel

If you know of any other interesting projects, drop me a tweet, @jinthagerman.

Comments