I haven't forgotten iDjembe

The ICHC update is just about ready to go, as soon as I verify that it still works in OS 2.2.

After the ICHC update goes out, I’m planning an update to iDjembe. Even though it gets very few sales, I still feel it’s my duty to make it not suck. For the new version, I’m planning to remove the Virtual Drum Circle feature, which proved to be pretty much useless, and instead add a recording feature and the ability to share your recordings online.

I Can Has Version 1.5 Coming Soon

I Can Has Cheezburger 1.5 is now feature complete, with only a few cosmetic issues to fix before I submit it in the next few days.

New in this version:

  • Use Cheezburger API to submit LOLs to ICanHasCheezburger.com
  • Fixed non-working movies by embdding them in a web page, which can be clicked, rather than opening the URL directly
  • It now remembers current item for all sites rather than the only last site opened.
  • Rewrote XML code to use NSXMLParser rather than a document-based browser. I was already using NSXMLParser for the Cheezburger API result handling.
  • Massive code cleanup.
  • Images are cached for faster viewing. If we’re low on memory, cached images will be released.
  • Added the new site, Once Upon A Win
  • The app now shows ads from Collider. They’re hidden when the toolbar is hidden, though.

Delicious Library comes to the iPhone

One of my favorite desktop applications, Delicious Library, is now available on the iPhone. The iPhone app is free, although it requires the desktop app since you can’t enter data on the iPhone.

If you have the latest version of Delicious Library on your Mac, when you open the iPhone app it will automatically connect and give you a code to enter. Once you’re connected, it will show a very familiar screen that lets you sync with the iPhone.

Delicious Library sync with iPhone

After you sync your library to your iPhone, you can take your library with you anywhere to browse. The iPhone app is just as beautiful as the desktop app.

Delicious Library on iPhone

"Find my iPhone" is live

Mobile Me’s new “Find My iPhone” feature is already live for anyone running an iPhone with 3.0 software. You can locate your iPhone on a map (mine is slightly off) and send a message with a sound. I haven’t tried remote wipe, but I assume it also works.

Find My iPhone

I Can Has Video

As you’ve probably noticed, movies rarely work in I Can Has Cheezburger app (as a work-around, you can open the web page and click the video to play it).

The reason it doesn’t work is the movie URL returned in the feed, which is something like http://www.youtube.com/v/cxLG2wtE7TM won’t work when passed directly to a UIWebView or sent to youtube to handle. If you look at the ICHC web page containing the video, you’ll see an embed tag containing that movie URL, which a webview is able to handle correctly.

I came up with a very simple way to make videos work reliably: I create a HTML string with an EMBED tag containing the movie URL. Instead of opening the movie URL directly using UIWebView loadRequest:, I open the HTML document I built with loadHTMLString:. You’ll now have a clickable movie thumbnail, which will open in the standard YouTube player without exiting the application.

Rewriting code without fear

Over the last few days, I’ve been rewriting some major pieces of ICanHasCheezburger.app to simplify and clean up the way I handle movies. Currently I use a single image view, which is set to a ‘play’ image for movies, which then open in the browser when clicked. I’m changing it to swap between the image view for displaying images and a web view in which I open movies.

In addition, I’ve cleaned up and simplified the way I deal with the RSS feeds I obtain the images from. Previously, I had a single FeedController class, which stored the entries obtained from a CXMLDocument as an array of CXMLNodes. To display an image, open the web page, or play a movie, I had to query the FeedController for an element of the current item.

To clean it up, my FeedController now uses an array of FeedItem objects, with properties such as permalink, image URL, movie URL, and title. I now pass a FeedItem to my root view, which uses it to decide whether to display an image or movie without having to go back and query the FeedController.

I found it to be a lot easier & cleaner to use NSXMLParser, so I can create a FeedItem for each RSS item directly rather than have to manipulate the CXMLDocument, extract each CXMLNode, and create a FeedItem for it.

Until now I’ve never used XCode’s Snapshot feature. Since I use Subversion, I figured I could simply check out an earlier revision. Before I started rewriting all of that code, I saved a snapshot. It shows exactly what has changed since the snapshot and makes it very easy to revert if something goes wrong. It’s very similar to checking in to Subversion or reverting to an earlier revision, but it’s a lot faster and more convenient. I find it very liberating to be able to make a major change like this and not have to worry about messing up, since I can easily go back to the way it was.

Snapshots

More tales of rejection

Apple really needs to learn the difference between content in the application and content available on the internet when they review app store submissions.

In their latest fumble, Apple rejected Eucalyptus, an e-book reader which contains absolutely no embedded content. It lets you read freely available books from Project Gutenberg, which it fetches from the internet. Their reason for rejection: “offensive content”. The book in question (the Kama Sutra) can already be read on the iPhone with Stanza or any other e-book reader or even Mobile Safari.

If Apple is going to reject an application based on their ability to obtain offensive content through the internet, they should also ban Mobile Safari, or even Maps (thanks @chockenberry).

The fact is there’s offensive content on the internet. No matter what Apple does, almost any application that accesses the internet will be able to find it if you try hard enough.

153 years 26 days 20 hours

iPhone application usage stats show that many apps are used only a few times and are then forgotten. According to Pinch Media, only about 20% of users return to use a free app the day after they first download it, and after 30 days, less than 5% are still using it.

I Can Has Cheezburger doesn’t seem to be following those trends. These stats only include version 1.1 and later, since 1.0 didn’t include Pinch Analytics. We’ve had a total of over 5 million sessions totaling more than 153 years. That works out to an average of 13 minutes per session.

ICHC Lifetime stats

Our usage seems to show no sign of tapering off. This month so far we’ve seen over 22,000 first time users for a total of over 1 million sessions totaling over 26 years cumulative time for all users.

ICHC Month Stats

I Can Has Cheezburger is a very “sticky” app that people keep coming back to and spend a lot of time in, so it would be very successful as an ad-supported app. Ben & I have been talking to a mobile advertising company about putting ads in the application. Some people will probably complain about it, but this is too profitable for us to pass up.