It’s sad closing a project in which you have been working for several years, but that’s what I just did some minutes ago with The Pillow Book. I removed the App from the App Store, both for iOS and for OS X. The Pillow Book was one of the first Apps that I designed and built for myself, and one of the first to be published in the App Store under my own name. I loved the App. I was dissatisfied with the diary Apps I found at the App Store at the time, and decided to build my own diary. It would be easy to use, clutter-free and with minimalist design (something that was lacking in every single diary App from the App Store) and would sync the entries among all iOS devices/Mac computers of the user.
This last point probed to be the main problem and eventually the killer of the App. In order to be able to sync among all devices, the only viable alternative I found was a combination of Core Data and iCloud. I had worked with Core Data before, and also with a document-based iCloud App, so I thought that combining both technologies would be easy. Man was I mistaken.
The problem is: iCloud and Core Data just don’t work together. At all. It has been documented, and developers’ discontent against it has been expressed in such notable media as Ars Technica and The Verge. The web is full of stories of nightmarish developers’ experiences trying to reliably use both technologies in their projects.
The Pillow Book was no exception. From the very beginning of the development process, I realized how unreliable and hard to debug was iCloud when working against a CoreData database. The changes on one device would take years to propagate to other devices, and sometimes they won’t even propagate at all, or would break previously committed changes. Error codes were inexistent or totally cryptic, and I had the feeling that I was left alone on my own due to the lack of a serious documentation. I did read lots of books about Core Data and iCloud (almost making me an expert in the process), but most of them would not delve into the hidden details, and would not include anything about issues or problems of real-life usage.
However, because I’m a pig-headed person, I decided to release the App and continue improving it, hoping that I would eventually come with the trick that would make it work flawlessly. And The Pillow Book went live. It had several thousands of downloads, and I even earned some money from it, just to pay some coffees. It had some very positive reviews in the App Store, and everything seemed to go well. But although the App was praised for its design and UI/UX, there were also some negative reviews about nasty things happening to some users. An entry would suddenly disappear for no reason, or it would loose some data, like the entry’s image. These bugs were almost always iCloud+CoreData related, and most of the time I had no idea of what was happening. Then suddenly, after an update, most users started to experience the removal of some or all of their entries, sometimes randomly. This resulted in lots of negative reviews to the App, and deservedly so. If I were a user of a diary App and one day some (or all) of my entries disappeared, I would be very angry.
Some of these bugs were obviously my fault, and the complexity and unfriendliness of iCloud+CoreData is no excuse for that. However, many bugs were untraceable, and even today, I am not sure why they were happening or how to fix them. The frameworks were really unreliable, and Apple has no excuse for it, specially when even now they are promoting it as a technology that “just works”. Sorry Apple, this time you didn’t get it right.
But my biggest weakness is perfectionism: I am a perfectionist, and I want to be proud of my work. I love working and releasing quality work, so I couldn’t really stand having such a unreliable App. Thus, I have decided to remove it from the iTunes Store and the Mac App Store altogether. I think it’s better this way, as I would not like someone having a less-than-awesome experience after buying one of my Apps.
This also raises an important question for me. If I need to do something similar in the future, I am PRETTY SURE I will not use iCloud + Core Data, but I don’t know of a reliable, seamless alternative. Most folks out there seem to be using a combination of CoreData and DropBox (through 3rd party libraries like TICoreDataSync), but I don’t want to force my users to create a DropBox account (Imagine having to register a DropBox account for just having a diary?). Another alternative seems to be using a Web Service, but I think it’s an overkill having to communicate with a server backend for just having a private, device-shared diary. Furthermore, using iCloud solutions automatically restricts your App to the iOS ecosystem, and that’s not really useful in these Android dominated marketshare days.