The Fisher - One Year in the App Store

About a year ago, it was a rainy day and I was waiting for the train back to Frankfurt from Darmstadt. The Fisher was just accepted by Apple, and I wrote the post about it launching in the App Store. Since I’ve promised to share my experiences and numbers in this blog, I figure it’s about time to share an update on how the app has been doing.

Read More

PhoneGap Files, Filepaths, Backups, and a Nasty Bug

I recently updated my main phone to iOS7. To my surprise, images within my The Fisher app no longer appeared. All the stored data was there but instead of the images I only got a white screen.

My first hope was that this was due to my app not being the version downloaded from the App Store and the restoring from backup not working for non-App Store. But I had to test it with my backup phone which I can easily erase and restore from backups. After testing, I was in a bit of a panic mode since the images really were not restored from the backups. To put it mildly, in an app with user-generated content, losing that content is not good.

Inspecting the contents of the app bundle with iExplorer (which I highly recommend), I found out that the files were there but they were not shown in the UI. Comparing the catches from the backup with newly added catches, I noticed that the file paths were different.

PhoneGap Files and Filepaths

On iOS (and when working with PhoneGap), files have a path like this:

file://localhost/var/mobile/Applications/C5875140-A4D2-4310-A6A7-55CC2F504F2A/Documents/1377869303030.jpg

In my app, I was saving these absolute paths to the database. And apparently you should never do that! As the Apple File System Programming Guide says, file paths consist of application home directory and the location of the file within the apps sandbox. The thing is, the application home directory can change at least when restoring from backups.

Fixing is Easy

Fixing the problem is easy. Instead of storing the absolute path of the file, you should only store the part of the file that you specify. In my app, the file names are based on the time they were created, so they are all of the form 1377869303030.jpg (or, [0-9]+\.jpg). Thus, whenever wanting to access the file, I can simply replace the beginning of the stored file path with the correct path to the application persistent file directory. To get this directory path, I have the following code executed on deviceready event.

function setFsRoot(callback) {
  window.requestFileSystem(LocalFileSystem.PERSISTENT,
                           0,
                           gotFS,
                           fail);
  function fail() {
    // handle the error
  }

  function gotFS(fileSystem) {
    // save the file system for later access
    window.FS_ROOT = fileSystem.root.fullPath;
    callback();
  }
}

A file path is then window.FS_ROOT + fileName. Changing all file access to work like this I was able to fix the issue with relatively little changes. If you are storing absolute paths, you should make this fix now, before everyone upgrades to iOS7.

Conclusion

Accessing files is critical in my app, so I really should have done a better job in testing backup restores. However, I do think that the Apple documentation as well as PhoneGap API docs should mention this potential pitfall.

Now my problem is fixed and an updated version 1.1.1 is already available in the App Store. Hopefully, no major harm was done to my users. I was also lucky that file removals used the same file path, so the user was not able to remove the catches before I updated the app.

The Fisher is in the App Store!

Last night, The Fisher was accepted to the Apple App Store! Again (more on that in a later post). For the features of the app, see the app page. Or just go and buy it :) Below are a few screenshots of the app.

Photoshoot for App Icon and Splash Screen

Back in November, I started really thinking about the icon and splash screen of The Fisher. My early idea was to find a freelance illustrator to design illustrations for both. As the whole idea of the app crystallized -- focus on pictures of the catches instead of the details -- it became obvious that both the icon and splash screen needed to be photographs. As I'm somewhat of a hobbyist photographer, I thought I could take the photos myself.

The Fisher app icon.

The Fisher app icon.

So one fine Saturday, I took the bus to the Hakaniemi market hall to buy a fish. The plan was to buy a big perch since that is my favorite fish; they are fierce fighters and taste delicious. I guess it was a good day for perch since they didn't have any for sale. Instead, I bought one pike-perch (aka zander). At 23 euros, it wasn't cheap. Besides the fish, I bought some smoked slices of ham and baloney. Both delicious :D

Anyway, back to the fish. Once I came home, I immediately started a photoshoot with my "catch". After all, the light hours in Finland in the winter are pretty scarce. The equipment and my setup was quite simple with only my camera on a tripod and the fish on the table. I took around a hundred photos of the fish from different angles and distances. While doing so, I realized why the zander isn't the most photogenic a catch: by nature, it keeps its mouth shut. To overcome this and to make it look more fierce, I had to put a toothpick inside its mouth to keep it open :)

With 100 photos, getting to the editing took some time and I only got to it yesterday, over three months after taking the photos. Now the app is close enough to v1.0 to concentrate on the icon and splash screen. I tried many of the pictures both for the icon and the splash screen. In this process, the Photoshop script by Josh Jones saved me a ton of time by allowing easy creation of the icon in different sizes. As for the splash screen, those I made by hand. The final splash screen image is on the right, the icon on the top of the post.

The Fisher splash screen.

The Fisher splash screen.

I'm not completely satisfied with either photo, but I do think they are different from the typical illustrations on App Store icons. The resolution of the icon is good nowadays. That makes me wonder what potential problems I'm missing, since most apps do use illustrations. By using a photo as the icon, The Fisher will be different from most of the apps it competes with. These are the icon and splash screen I'm going to ship version 1.0 with, but you can be sure I'll go and catch (or -- while there's still ice in Finland -- buy) other fish to update both photos for future version.

To summarize: For a few euros, I got the photos I needed, plus a delicious dinner (I cooked the fish in cream with pepper and horseradish). I'm close enough to submitting the app to focus on the icon, so it shouldn't be too long until I submit The Fisher to the App Store. 

MVPs and after-hours app development (or, missing deadlines)

January 4th was the deadline I had set for submitting my app, The Fisher. As it happens, that deadline came and went, and, while getting closer, I'm not ready to submit the app yet. I originally set the deadline for myself and made it public in November. At that time, after a really busy November at my full-time job, I thought I'd have a lot of time to work on the app in December. And, as I do most of the development after normal working-hours at my day job, the looming two-week vacation around Christmas sounded like the perfect time to finish the missing features and polish everything for submission.

As you can imagine, that's not at all how things went. I realized I had postponed a lot of less important tasks at work, so December ended up almost as busy as November. During Christmas break, I had to take some time off from work and development. I felt it was more important to charge my batteries than to work on the app. Even though I missed my deadline, I haven't regretted that decision. I've had a lot more energy to work on things after the vacation.

That is my longish way to say balancing work, life, and after-hours app development is hard. And, as long as the money comes mainly from the day job, that and life come before app development. Still, I want the application to the store to get feedback from real users as fast as possible. To achieve that, I have decided to postpone some features of The Fisher for future updates. I still think it will make for a viable MVP that is useful. And it will give me reasons to update the application regularly with new features.

Now I again have more time and, with the reduced set of features, the app only needs final polishing touches on design and animations, and some fun and informational in-app messages. So I should be able to submit it soon. I even have a new deadline for submitting the application, but this time I'll keep it to myself. It would be too embarrassing to miss my deadline twice in a row :)

Want to get early access to the app and be a beta tester? Contact me, please!

Introducing My First App, Codename "The Fisher"

The first app that MobileIceCube will publish is a project with codename "The Fisher". It is an iPhone app for logging the great big fish you catch. Here's a little history about my relationship with fishing as well as motivation for building this application.

When I was young, I was a really enthusiastic fisher. My cool catch log from those times is below. As I grew up, there didn't seem to be time or opportunity for fishing. For the past few years, that has changed, though. Spending time at a summer cottage has revived my passion for fishing. There's nothing better than a self-caught perch (even a small one) fried in butter on a summer evening.

My fancy suit-themed notebook for keeping a list of my catches.

My fancy suit-themed notebook for keeping a list of my catches.

From my old fishing kit, I found a notebook I used to log all the fish I caught. Being the app geek (in a good way) that I am, I immediately searched the App Store for suitable applications for my iPhone. Turns out there are plenty. However, none of them fit my view of storing the information on my typically quite modest catches.

As a result, I started working on The Fisher about seven months ago. Like most software projects, the schedule has extended past many deadlines I've set. It has also seen many design (how about a skeuomorphic suit-themed design?) and code iterations. Now I'm finally happy with what the app looks like and how it behaves, so it is time to make the application public. It is not quite ready for submitting to App Store yet, but I've decided on a submission deadline for myself: January 4th (which also happens to be my birthday).

If you'd be willing to beta test the application, please get in touch.