First off, I should probably introduce myself. I am the Technical Architect of the Condé Nast Interactive Product Group [iPG] & the developer of Idea Flight. My past work includes leading the development teams for the Epicurious iOS app, as well as the Condé Nast mobile magazine platform. I enjoy long sits on porches, roasting coffee in a skillet, and singing karaoke in small rooms. Now onto more relevant matters.
Idea Flight began as an idea to make sharing presentations on iPads easier. What started out as a simple prototype soon turned into a full-fledged product that we’ve shipped & hope you enjoy. If you’re unfamiliar with the app, you may want to read this introduction by Chris Gonzalez, Director of Product. In this post, I’m going to discuss a few of the technical approaches we took in the app.
Game Kit
The app communicates amongst devices using the Game Kit framework available in the iOS SDK. You might tend to ignore Game Kit if you’re not actually building games, but one if its core features is peer-to-peer connectivity over Bonjour, via a local wireless network or an ad-hoc Bluetooth network. This allows developers to send any binary data between more recent iOS devices [first-gen iPhones & iPod Touches are not supported]. There are some limits, however, so when we send a PDF from the Pilot to Passengers, we have to split it up into 8KB chunks in order to transmit it without overloading the system.
In Game Kit, there are two available session modes: server-client and peer-to-peer. The server-client model was appropriate, as it lent itself simply to the Pilot-Passenger metaphor. Unfortunately, there is a built-in limit of 16 devices with the server-client model. One potential enhancement we’ve pondered is switching to a peer-to-peer model, where the Pilot would deliver files & messages to a set of super-nodes, who would then pass the data along to other nodes. This could have the benefits of increasing the number of viewers of the presentation, as well as enhancing the robustness of sending larger PDFs locally over Game Kit. We haven’t yet gone down this path, as it would be quite a large undertaking in development as well as testing & tweaking – plus, we see Idea Flight as best suited towards smaller meetings in offices or conference rooms that may not have a monitor or projector.
One of the more interesting challenges was how to distinguish different kinds of data so the Passenger could recognize it & act appropriately. Through consultation with a (now former) colleague, Nate Bowen, we came up with the idea to prepend each binary message with a 4B chunk that consists of an identifying integer. The Passenger knows to extract the first 4B & can then act appropriately. Some of these identifiers include a header, the start/middle/end of a PDF, navigation, LinkedIn information, & a kill session signal.
Dropbox
When we first started working on Idea Flight, we simply transferred files locally over Game Kit. The primary disadvantage is that as PDFs get larger & the number of Passengers increases, the time to transfer the PDF becomes ever longer. We’re big fans of Dropbox, using it to share PSDs, copy decks, & the like, so it made sense to integrate with their API to pull in PDFs from your account that you can then use to share with your Passengers. We only pull from your Public folder – since they’re publicly accessible, we can get a sharable URL that we allow the Passengers to download the PDF directly from the internet, rather than going through the potentially long process of a local transfer. As an added advantage, you gain the ability to tweak your presentation on your computer, export it to PDF, save it to your Dropbox, and have it instantly accessible in Idea Flight.
Core Graphics
Whenever it didn’t overly complicate matters, I used iOS frameworks to render graphics, rather than simply shipping an image with the app. Doing so allows us to make tweaks more easily, reuse components in the future, as well as decreasing the overall size of the app binary. A good example is the Help Screen, which is displayed on first launch (as well as whenever you select if from the ‘About’ overlay). With the exception of the WiFi & Bluetooth graphics, everything is rendered using simple UIView & UILabel objects. The other exception is the brand “idea flight“, as it’s in a custom font that we didn’t have permission to ship with the app. Some fun new things I learned while creating this screen involved the Quartz Core framework, such as modifying the border & corner radius of the layer of a view. Also, I learned how to draw dotted lines using Core Graphics to draw a line, along with CGContextSetLineDash to make it dashed at a certain phase & pattern.
LinkedIn
At a meeting back in March, a new employee sitting next to me asked who was speaking at the moment. I had a eureka moment – wouldn’t it be great to be able to automatically know who else was in the meeting? Immediately we thought of LinkedIn – given the inherent business use of Idea Flight, it made more sense to implement it rather than another social network. Folks would be able to login, share their information [name, title, company, & picture], and even connect with others in the meeting. Instantly, the Passenger list became exponentially more valuable.
We used the open-source LinkedIn library (created by Results Direct), which I forked on github to add some functionality & fix some bugs. After the user logs in to LinkedIn, we use Game Kit to share relevant profile information with any connected peers. Once you receive someone else’s profile, we hit LinkedIn again in order to grab the ‘distance’ from you to them [i.e., whether you're connected via 1st degree, 2nd degree, unconnected, etc.].
More?
I’m happy to talk about any other approaches we took in Idea Flight or publish code snippets! Comment below & let me know what you want to hear.