Making a better alert prompt

One of my current projects in an event management system that generates mobile apps for the attendees of the event. Can’t wait to talk more about this project but that’s it in a nutshell.

In our iOS version we have a bookmark system. When a users goes to bookmark an event we present a dialogue asking if they’d like to enable a feature that would “mirror” their bookmarks onto the system’s calendar.

Question: Is this a good practice? Its seems like too aggressive of a feature to leave on by default but considering our users won’t have a long relationship with the app it’d be rare they discover this on their own. I’ve suggested we try to track usage of this feature so we can make a more informed default later and maybe drop the dialogue entirely. Thoughts?

The alert we currently show in beta is pretty bad.

alert we currently show

**Save to calendar?**
Would you like to automatically  
save bookmarks to your Calendar  
app? (You can change this  
preference later in your device  
settings)
[Save to Calendar] [No]

Things I don’t like about this:

  • It’s wordy.
  • The string “Save to Calendar” is so long it makes the alert view use a different font size to fit it.
  • The use of “No” is not a natural opposite to “Save…”. In general I don’t like YES/NO alerts as they require you to read the alert message. By using action words like SAVE, OPEN, CLOSE, LINK you have a better guess at what’s going to happen when you tap the button.
  • Capitalization of “Calendar” isn’t consistent.
  • The sentence inside of the parentheses doesn’t have a period.
  • Using terms like “your Calendar app” are excessive for such a personal device. Of course it’s your Calendar. This isn’t a multi-user system.

A new alternative:

**Sync Bookmarks to Calendar?**
Syncing will show all the events
you bookmark in the Calendar app.
[Sync] [Cancel]

I like the word sync better than save since we do in fact keep those calendar listings up to date with changes that come down the wire. I feel like dropping the whole “this can be changed later in preferences” message helps the alert feel less intimidating. The setting panel itself is actually a high level menu in our navigation controller. It’s not too hard to find if you go looking for it and this Calendar feature is the first setting listed.

Question: What do you think of my new alert dialogue? Have any further suggestions?

While it can sometimes feel excessive to analyze single alerts like this I do feel that small improvements do add up to make the overall app experience better. Hopefully you enjoyed a little insight into my own UI refactoring workflow.

Posted on: January 18, 2012 – 3:06 PM | Comments (7)

Apps For Water

Apps For Water Banner

As reported by TidBITs:

Mike Piatek-Jimenez of Gaucho Software has organized numerous other developers to donate their entire sales for a single day — 20 December 2011 — to charity: water, a non-profit organization bringing clean and safe drinking water to people in developing nations.

ProfitTrain is among the apps listed so we’ll be donating today’s. To learn more check out the websites:

http://appsforwater.com/

http://www.charitywater.org/

Thanks to Mike for organizing and to everyone for their support.

Posted on: December 19, 2011 – 8:37 PM | Comments (2)

Dex pulled from the App Store

Dex App Icon

It was with sadness I found out this morning that Dex, my beloved Pokemon browser for iOS, was pulled from the App Store. Nintendo legal had been sending copyright notices to Apple for some time and while I tried to have a conversation with Nintendo to work something out they weren’t very talkative.

To the best of my knowledge this isn’t part of a larger plan of Nintendo or The Pokémon Company to lock down their intellectual property. While they continue to turn a blind eye to fan sites like Bulbapedia, Serebii, Marriland and Smogon they seem to really dislike apps serving the same data sets such as my own Dex, Timothy Oliver’s iPokedex and Nolan Lawson’s Pokédroid.

I suspect part of this is because they view these devices as competition against their own struggling handheld platform. Additionally Apple’s distribution is centralized making it that much easier to shut things down.

I’ve read a lot on the topic of Selective Copyright Enforcement and the legality/benefits of fan sites over the past few months. I’m not really prepared to do a larger write up only to say I think a move like this was in the disinterest of Pokémon fans and the Pokémon brand.

If you’d like to let your disagreement with this action be heard I’d recommend sending respectful feedback to The Pokemon Company directly. My contact there was:

Kim Warren
k.warren@pokemon.com
Paralegal
The Pokémon Company International
333 108th Ave NE, Suite 1900
Bellevue, WA 98004
United States +1.425.274.4895
legalnotices@pokemon.com

To all the Dex fans out there, thank you so much for your support and well wishes over the last year. I’m happy I was able to improve your experience of the great Pokémon franchise.

Do you need cheap vps hosting?

Posted on: December 6, 2011 – 3:57 PM | Comments (0)

Philly CocoaHeads Holiday Party

Charlie Brown Christmas

(Reposting from PhillyCocoa)

For the upcoming December’s meeting we’ll skip the traditional tech talks and have a more social atmosphere, including a quiz show featuring cocoa code, culture and history questions; hopefully awarding some prizes along the way to the winning players.

If you’d like to suggest a question to ask please use this form.

If you’d like to donate a prize (software serial, ebook, etc.) use this form.

We are also have open sponsorship for the pizza if any local company/vendor out there is interested. Let me know.

Thanks for you help.

Posted on: November 18, 2011 – 12:06 PM | Comments (0)

AddressBook record identifiers on Mac and iOS

ProfitTrain has a cool feature which lets users link business and client contact info to cards in the system AddressBook. When linked the normal contact fields become disabled and ProfitTrain pulls in changes from the AddressBook as they happen; simplifying the user’s need to edit data in multiple places and arguably living up the original goal of the AddressBook API. Over time however, with the addition of MobileMe, iCloud and the iPhone, things are breaking.

To implement it’s AddressBook “link” functionality ProfitTrain for Mac OS X uses the ABRecord’s uniqueId which itself is a wrapper for the C level kABUIDProperty. kABUIDProperty is documented with the following:

The unique ID for this record. It’s guaranteed never to change, no matter how much the record changes. If you need to store a reference to a record, use this value.

Maybe in the past this was true but I’m not so sure these days. For example, with the release of iCloud I received emails from some ProfitTrain users who were getting warnings that the link between clients and the AddressBook cards were breaking. Turns out when enabling iCloud your AddressBook records get all new uniqueId values. This isn’t even limited to the initial setup. Turn iCloud contact syncing off and on and it’ll do it again.

Things are fragile on the iOS side as well. iOS only has a C level API and doesn’t implement uniqueId but instead provide a function called ABRecordGetRecordID. ABRecordID at the end of the day ends up being a int32_t and obviously doesn’t match uniqueId which has always been a string in a format like this:

725D14DB-2F63-40FD-B1EB-ED696C13E03B:ABPerson

The attribute documentation for ABRecordID suggests it is a “unique ID” but to get the full story you need to read the Address Book Programming Guide for iOS. I’ll quote the relevant notes (with some additions in parentheses) below:

Every record in the (iOS) Address Book database has a unique record identifier. This identifier always refers to the same record, unless that record is deleted or the MobileMe (or iCloud) sync data is reset. Record identifiers can be safely passed between threads. They are not guaranteed to remain the same across devices.

The recommended way to keep a long-term reference to a particular record is to store the first and last name, or a hash of the first and last name, in addition to the identifier. When you look up a record by ID, compare the record’s name to your stored name. If they don’t match, use the stored name to find the record, and store the new ID for the record.

My dream of storing a permanent and unique identifier for ABRecord objects across a set of Mac/iOS apps, syncing their data in the iCloud, is broken. Hell, even if you are contempt to a single platform these things will change under your feet.

If I want to continue to “link” ProfitTrain companies to cards in the AddressBook it’s come down to name matching which is really disappointing.

Talking with some friends who happen to work on AddressBook they’ve said this behavior wasn’t something they did intentionally or haphazardly. I responded back that I understand they are solving complex problems over there but me and the AddressBook API, we had a deal and you broke our deal.

Before reading the Address Book Programming Guide for iOS I complained this topic wasn’t properly documented. I’d still argue the Mac OS X variant could use some improvements, including the removal of that “never to change” stuff but hopefully this blog post helps some lucky Google searcher out there. For now I’ll be writing up some new code to match on names. **shudder**

Posted on: November 7, 2011 – 7:32 PM | Comments (11)

Xcode 4.2 LLVM-built armv6 floating point crashes fixed!

Dex App Icon

It’s been a week since Dex 1.3.7 got approved and best I can tell it fixed the problems that were introduced with version 1.3.6, which was the first release to be built using the new LLVM complier, Xcode 4.2 and the iOS 5 SDK.

Dex’s iOS project template like many others used $(ARCHS_STANDARD_32_BIT) to define the architectures to build. Previous to Xcode 4.2 this expanded to armv6 and armv7. With Xcode 4.2 however this resolves to armv7 only. Not interested in dropping support for the original iPhone or iPhone 3G in a bug fix release I re-added armv6 as a architecture manually.

For the most part it worked fine but after getting approved by Apple I had multiple users report of crashes a few seconds after launch. Unable to get crash logs due to problems with Hoptoad/Airbreak I was left a little stumped. In time I found a few threads on the Apple Developer Forums which helped.

It seems there is a problem where the LLVM complier’s optimizations for floating point math is broken for armv6 and stuff the interacts with things like CGPoint and CGSize structs break. To turn off these optimizations add a compiler flag of -mno-thumb. Doing this (and adding HockeyApp’s crash logging) I’m pretty satisfied that the problem has now been fixed.

Posted on: November 7, 2011 – 12:10 PM | Comments (1)

CBEditableImageView

One of my recent goals is to release more code. Here is a new view I made for the development branch of ProfitTrain. I call it CBEditableImageView.

Sample App using CBEditableImageView

GitHub: https://github.com/zorn/CBEditableImageView

CBEditableImageView is a subclass of NSImageView that resembles the editable image well as seen in System Preferences > Users (where people assign a profile image to their account).

CBEditableImageView adds the following functionality to NSImageView:

  • On mouse hover, adds a tinted black look to the inner well to suggest to the user that this is editable.
  • On click, can present a context menu allowing the user to assign an image or clear it.
  • Can send key events to its delegate to allow for mouse-free interaction.
  • Fixes a bug in the native NSImageView where even when disabled it still accepts new images via drag and drop.

You can see the view in action in this short demo movie.

Please try it out and let me know if you end up using it.

Posted on: October 13, 2011 – 12:56 PM | Comments (0)

Dex 1.3.6 Crashes

Dex App Icon

Yesterday Apple approved a small update to Dex, version 1.3.6. New improvements include:

  • New Smogon links for Black/White analysis.
  • Update Google AdMob engine.
  • Built with iOS 5 SDK (though we still support as far back as iOS 3.1)

Sadly a few people are reporting crash on launch but I’ve been unable to recreate the problem. Sadder still is my crash report in-app submission seems to be broken.

If you have experienced a crash and want to help. Sync your phone with iTunes and then try to locate the crash reports on your computer’s hard drive. Depending on your operating system they’ll be in a different location:

Mac OS X

/Users/<you>/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>

By default Lion will hide your Library folder. For a few different ways on how to show it check out this Macworld article.

http://www.macworld.com/article/161156/2011/07/view_library_folder_in_lion.html

Windows Vista / Windows 7

C:\Users\<USERNAME>\AppData\Roaming\Apple computer\Logs\CrashReporter/MobileDevice/<DEVICE_NAME>

Windows XP

C:\Documents and Settings\<USERNAME>\Application Data\Apple computer\Logs\CrashReporter/<DEVICE_NAME>

Each log file will begin with the name of the application. Please send these to us with a short note explaining what kind of device you use and any specific actions that seem to cause the crash.

Sorry for all the trouble. Thanks for your help and patience.

Posted on: October 12, 2011 – 10:09 AM | Comments (0)

SMFM: Spooky Playtime

Stuff My Friends Made: Spooky Playtime

I met Gene and Tim of Bombing Brain through a local programming meetup and one of their first apps I saw was Spooky Playtime.

Spooky Playtime

Spooky Playtime is an extremely entertaining and educational game for young children aged 2-6 years. Perfect for parents who want to share the excitement of Halloween with their children, while also reinforcing age-appropriate learning activities.

It’s a great little game for kids and I love the main theme. So much so I hired Gene to help me do the theme for TwizShow which I love as well.

Bombing Brain has some other cool apps too, including a very deep and beloved telepromter app.

Great apps from some great people. Check them out, and Happy Halloween!

Posted on: October 8, 2011 – 3:39 PM | Comments (0)

Steve

Steve Jobs 1955-2011

While I had some disagreements to parts of his vision there is no doubt he was a huge positive influence in my life. In short, he makes me want to build better products.

Thanks again Steve. Your inspiration and focus will live on forever.

Posted on: October 8, 2011 – 2:09 PM | Comments (0)

« Older posts /