Monday, September 30, 2013

Screenshots Album

I'm in Seattle, Pete's in London, and Shawn is in Los Angeles.

In the afternoons, Shawn and I are working while Pete is asleep.  I got the idea for Screenshots Album one afternoon...

Screenshots Album was a very quick app to make.  I did a "test" app to see if it was possible and how fast it would be, and that turned into it.  Using stuff from FTP to make the one button much prettier and added better messages at the end with the animated help (using one of the next upcoming apps giffish.com!)

Shawn and I were tempted to submit so Pete would wake up in the morning not just to a new app idea, but one that was done and submitted!  But he makes the best icons, so we waited so he could see and do up a cool one for it.


A nice video of it in action, finding all 477 screenshots on my iPhone from years of app development and photos following along between phones.


Get it in the App Store Now!

Friday, September 27, 2013

GeekWire Article!

Blair Hanley Frank at Geekwire.com asked some excellent questions for the article about our upgrade scheme, Pete, Shawn & I worked together on some answers...  I'm better at writing code, but they're better at writing words!


1. It seems like your method creates a number of apps with similar names and the same functionality. Are you concerned about fragmenting your user base?

There is no system in place to do anything other than to fragment.  If a developer wants to charge a different price for their app for iPhone and iPad the only way to do that is to release two versions which fragments the user base.  There's no way to set version 4.0 as a paid upgrade with the option to tell your users ahead of time or give them the option not to upgrade if they don't want to pay again.  Removing the older version from the App Store cuts off your existing user base and prevents any bug fixes.

So while we are worried about fragmenting our user base, there is no alternative way of doing the things we want to do.

It would be so much better if Apple did this so all the app variations (iPhone, iPad, iOS6, iOS7, free upgrade, paid upgrade)  aren't needed.  Once the iOS7 versions are going, we may do some changes to the keywords for the earlier versions so they aren't very easy to find, and we've already added descriptions to go get the iOS7 version.  

The need to maintain a sustainable business--and free upgrades forever is not sustainable--had to override our concerns with fragmenting the user base or releasing multiple variations of one core app.  Ongoing development of an app or any piece of software takes time and money.  If an app isn't going to be a 1-off 'disposable' piece of software then developers (ourselves and everyone else) need the resources to keep going.  Any app that ceases to be profitable will cease to be worked on.  Whether that means the developer abandons the app and moves on to the next thing or goes of business entirely. And if that happens then there won't be any more fixes or improvements ever.


2. I know that apps that are free with an in-app purchase to upgrade to the full version have occasionally garnered a significant number of one-star reviews because users thought they were getting the full app for free. How concerned about that are you?

I'm sure we'll get a few 1star reviews, but over the years, people have become more accustomed to free apps having things to upgrade, so hopefully not too many.  A note about the purchase required is the first part of the app's description in the App Store, so we are trying to be as up front as we can be.  

Our FTP apps are more specialized tools, so even people seeing it for free wouldn't pick it up the same way they would a game.


3. I know you noted in your post that you think this method has a greater chance of long-term success than the program that the Omni Group tried for their App Store upgrades, but are you at all concerned that Apple could still pull the plug on what you're doing?

Omni Group's system let you get upgrades from their website of an app you had purchased from the Mac App Store.  I believe getting something anywhere outside the App Store for something you'd purchased within the App Store was the problem.  Our way is all within the App Store, so as far as I can tell from reading all the information, that is OK.  We were as explicit about what it does in the review notes to Apple as we could be, even saying we hoped for a higher level review to make sure it is allowed.  

We are absolutely concerned that Apple could pull the plug.  And if they do, we will revert to what Omni Group did for their iOS7 updates--release new apps for iOS7 and charge full price.  We were and are willing to take the risk and be kind of a test-case because we believe that this is a necessary evolution of the AppStore if business tools, utilities and other long-term and non-disposable apps are to remain viable.

Let's say a developer writes a great app and sells 1 million copies then works for a year on version-2.  If version-2 is released as a free upgrade then the 1 million people most-likely-to-buy-it end up getting it for free.  The developer gets a lot of happy customers, but no financial compensation for all the hard work.  That needs to change.  If version 2 is released as a new app, even if only a fraction of those million people will buy it, the developer comes out ahead.  

Thursday, September 26, 2013

How to do discount pricing for App Upgrades in the App Store

Or as my brother Pete called it "Smurfberries for Business Apps".


We spent the better part of the summer working on iOS 7 updates.  We'd originally planned a different approach for updating our main apps for iOS 7. (An FTP Client and code editor.)  But in the end, a week before iOS 7 was scheduled to come out, we decided people would have to pay to get the upgrade.

One reason overruled everything:
If we go out of business, nobody would get any upgrades at all. *

Along with most other developers, we have wanted a way to charge an upgrade price to get a new major version of an app.  And we wanted to be nice to our existing customers and give them a discount. We're not just competing with other apps, the iOS7 update is competing with our previous version which is pretty damn good.  If asked to pay full price again, many people (including myself) might stick to the older version which already works great.

Apple hasn't added that option, so we had to figure out how to do it ourselves, while sticking within the published iOS SDK and App Store system.  (OmniGroup tried going outside the App Store so updates were from their website which I believe is why their way wasn't allowed.  Our method should work fine for Mac Apps too.)

It isn't as perfect as Apple could do it, all within a single app and not losing our thousands of 5 star ratings, but it works now.

Our particular apps are bit more complicated since we have both Regular and Pro versions of the app to deal with.  But the simple approach:

  1. You have MyTool in the App Store now, for $9.99.
  2. Create a new version of the app in the App Store, MyTool2, also for $9.99, and submit it.  Optional**
  3. Create a separate "MyTool2Upgrade" for free but with 2 or more In-App Purchases.  Everything in MyTool2 , but have some new features behind an In-App purchase.  (Exactly how to do new features depends on your app.  In our FTP Upgrade app, you can browse and view files, but can't edit.)
  4. In the 2Upgrade app, when they tap the locked feature, check if they have MyTool installed, if they do show an In-App purchase to unlock with the price $4.99; if they don't then show a 2nd In-App purchase item to unlock with the price $9.99.  All the In-App purchases unlock exactly the same things in the app, but with differing prices. 
  5. Once the 2Upgrade app is approved, you can decide what to do with the original MyTool.   Remove it for sale, drop the price, or even simply leave it full price (especially if the MyTool2  is iOS7 only and MyTool works on iOS6).***

Get our apps and see it in action (and support our continued staying-in-business-ness)!  

1st get the FTP On The Go Pro Upgrader for iOS7 mouthful app.  A quick way to get the Activate prompt is to switch to the Saved Files tab, tap the "About" file, then tap the up-arrow-in-a-circle in the bottom toolbar.  Tap to Activate and you'll get the full-price In-App purchase for $9.99.




Then on the same device, get FTP On The Go or FTP On The Go PRO, they've been discounted so are $3.99 and $6.99.  Once one of them is installed, go back to the Upgrader and do the Activate again.  You'll get the discounted prices; $6.99 if you have the standard, or $4.99 if you got the PRO (you'll save $1 if you get the Standard and upgrade that one.)  Buy the upgrade to help keep us in business!





* Not an idle threat about going out of business, if this doesn't do it we've got maybe 6 months before having to either have something work, start doing contacting, or downsize to just me full time.  Having to do that after nearly 17 years in business, and working with my brother Pete and friend Shawn for the past 15 years would be horrible and would greatly impact what sort of updates our apps would get in the future.

** You wouldn't even have to have the paid MyTool2, all the magic happens in the MyTool2Upgrade.

*** We are leaving the existing apps in the store with lower prices, so we can do bug fixes or security updates.  At the least you'd be smart to do an update that detected if they were using MyTool on iOS7 and showed a message about upgrading!

**** For the developers...
There are a variety of ways how 2Upgrade can detect if you have MyTool installed. 
  • Custom URL Schemes and detecting if an app handles a particular scheme are easy, but not very secure.  A developer making a simple demo app could get around this one--but only could get to the discounted price so not too bad.  (It could be made pretty safe if you pass data back and forth between the 2 apps, doing some sort of signing between them.)
  • iCloud key-values.  An excellent way since it can detect they had MyTool even if it isn't currently installed on the device.
  • Keychain.  Also a good way, nice and secure.
We started with the Custom URL scheme one; simple and works even with quite old existing versions of our apps.  We'll add better checks now that we know Apple is going to allow this whole system.

***** More for the developers...
App discoverability is really tough in the App Store anyway.  If you don't want people searching to stumble on the 2Upgrade app and want them to find the new MyTool2 Paid app, it should be pretty easy by giving few or no keywords to the 2Upgrade.  That won't help people searching using Google, but Apple seems to just use the name and keywords for their search results.

Monday, September 23, 2013

9 Million

That's a lot of iPhones.  Going by the unlocked prices, if they were all the cheapest 16GB iPhone 5C for $549, that's a hair under $5 Billion in sales.  The most expensive 64GB iPhone 5S is $849, and if every iPhone sold was one of those, that's over $7.5 Billion.

It's of course a mix, so somewhere between those two numbers.  Not a bad 3 days.

Saturday, September 21, 2013

iPhone blue screen of death?

I got a new iPhone 5S, and got it all setup.  It had to run overnight to download the mass of photos.

In the morning I tried to have it upgrade to the 7.0.1 update.  In the middle, the screen flashed blue (in I'm assuming a nod to Microsoft) and went into Restore mode.

I had to plug into the computer with iTunes and setup everything again.  Weird.  Hopefully it doesn't happen again, I'll have to remember to only apply updates at home.

Wednesday, September 18, 2013

Macbook vs iPhone

Stats are coming in now that reviews for the iPhone 5S are appearing.  I ran the same browser benchmarks on my "Late 2010 Macbook Air".

Sunspider: Macbook=324, iPhone5S=408 (Smaller is better, Macbook wins.)
465 average on my iPhone5S

Octane: Macbook=4514, iPhone5S=5576 (Bigger is better, iPhone wins by a lot.)
5008 average on my iPhone5S, closer but still iPhone win

Kraken: Macbook=5207, iPhone5S=5948 (Smaller is better, Macbook wins.)
6213 average on my iPhone5S

I didn't reboot the iPhone or anything, just started the tests so they may be better if I'd restarted first.


My big 2009 iMac still beats the iPhone, its numbers are better but not twice as good.

All the iPhone numbers are using little cell phone batteries.  Apple in the past has run the iPhone CPU at a slower speed to keep battery life up.  Running the same chip in a Laptop type device, the CPU speed could be higher with a laptop's bigger battery, as well as the CPU cooling that's built into laptops too--fans.  Fans aren't something you'd put in a phone or tablet (oh, unless...).  My Macbook gets pretty warm, and the iMac gets pretty hot on top.

The Retina iPads are already higher resolution than my laptop and desktop, so they've figured out that part too.

If I was Intel or other computer companies, I'd be worried.  Bump up the speed a little, and it could easily get comparable to the current Macbook Airs, and likely with similar or far better battery life.  Intel doesn't make billions by giving its chips away.  I'm sure Apple gets as good a deal as anyone, but making their own chips, they'd not be paying anything more than what it costs them to manufacture--and they're already building these chips by the millions.

Saturday, September 14, 2013

UIAlertView with Blocks

For the Programmers...

I'm not sure why Apple didn't do this one when adding blocks to everything.  A bit of code to do an UIAlertView with passing in a block to handle the button tapped. (It also uses a NSArray rather than a null-terminated list.)

I've not done it yet, but would be simple to do a similar thing with UIActionSheet too.


////////////////////////////////////////////////////////////////
//.H file...
//Helper to store the block

@interface UIAlertViewBlock : UIAlertView
@property (nonatomic, copy)  void (^clickBlock)(NSInteger buttonIndex);
@end


@interface UIAlertView (MichaelBurfordBlocks)
+ (void)alertWithTitle:(NSString *)title
               message:(NSString *)message
     cancelButtonTitle:(NSString *)cancelButtonTitle
     otherButtonTitles:(NSArray *)otherButtonTitles
         clickedButton:(void (^)(NSInteger buttonIndex))block;
@end

////////////////////////////////////////////////////////////////
//.M file...
@implementation UIAlertViewBlock
- (void)alertView:(UIAlertView *)alertView 
             clickedButtonAtIndex:(NSInteger)buttonIndex {
 self.clickBlock(buttonIndex);
}

- (void)dealloc {
 self.clickBlock = nil;
 [super dealloc];
}
@end


@implementation UIAlertView (MichaelBurfordBlocks)

+ (void)alertWithTitle:(NSString *)title
               message:(NSString *)message
     cancelButtonTitle:(NSString *)cancelButtonTitle
     otherButtonTitles:(NSArray *)otherButtonTitles
         clickedButton:(void (^)(NSInteger buttonIndex))block {
 UIAlertViewBlock *alert = [[UIAlertViewBlock alloc] 
                                       initWithTitle:title
                                             message:message
                                            delegate:nil
                                   cancelButtonTitle:cancelButtonTitle
                                   otherButtonTitles:nil];
        alert.clickBlock = block;
 alert.delegate = alert;
 for (NSString* otherTitle in otherButtonTitles) {
  [alert addButtonWithTitle:otherTitle];
 }
 [alert show];
        [alert autorelease];
}


///////////////////////////////////////////////////////////////
//Then you get to use it like this!
[UIAlertView alertWithTitle:NSLocalizedString(@"Buy My App", nil) 
                    message:NSLocalizedString(@"Please Buy My App", nil)
          cancelButtonTitle:NSLocalizedString(@"Cancel", nil)
          otherButtonTitles:@[NSLocalizedString(@"Buy Now", nil)]
              clickedButton:^(NSInteger buttonIndex) {
                  if (buttonIndex==1) {
                      if ([SKPaymentQueue canMakePayments] && buyItem) {
                          SKPayment *payment = [SKPayment paymentWithProduct:buyItem];
                          [[SKPaymentQueue defaultQueue] addPayment:payment];
                      }
                  }
              }];


Friday, September 6, 2013

App Upgrades

iPhone apps are cheap.  Our GetRight Pro for Windows is $39.95.  FTP On The Go Pro is $9.99.

We did make a break when the iPad first came out, dropping FTP On The Go to a lower price (without optimized iPad support) and adding the PRO version with the iPad designed UI.  That worked well.

There have been many updates since then, and everybody has gotten them for free.  It makes us work our asses off trying to get new buyers, without any real way to get more money from many people who had bought 3+ years ago and are getting updated versions.

It's putting a strain on the business, competition is fierce.  Serious developers with decent success in the App Store struggling is NOT good for Apple.  Apple's deal so far has been "Free upgrades for life" however the "life" isn't your life, it's the life of the developer or business making the app.  If we fail, you don't get any updates anymore.

We put in a lot of work for iOS7 style UI, as well as cool new features that iOS7 allows like the line numbering in the text editor.


(Other apps of ours aren't so lucky--there are a number that just don't sell well enough to justify updating them for thew few new buyers they'll get, no matter how many people might still be using it.)


UPDATED ALL THIS.  We're doing it for iOS 7.  
If we go out of business nobody's getting upgrades anyway.


What We're Doing for iOS 7

We're going to roll our own upgrade pricing....
  • We are going to leave "FTP On The Go" and "FTP On The Go PRO" in the store, they'll get some updates, but won't be optimized for iOS 7, and won't get some of the new features (line numbers and color schemes in the text editor are some main ones, but it'll also look like iOS 6 on your new iOS 7 device too.)
  • We will release 3 new apps(!) "FTP On The Go for iOS 7" @ $5.99, "FTP On The Go PRO for iOS 7" @ $9.99, and the key one "FTPOnTheGoPRO Upgrade for iOS 7" that is free.  
  • The new paid ones are regular apps, optimized for iOS7 and with all the latest features.
  • The "Upgrade"version is the secret sauce.  You can browse and view files to see the cool new look and all the great stuff in the editor; but can't make changes or do the file management features.  (No upload/download/rename/delete/etc.)
  • When you tap one of the PRO features, it prompts that you need to Activate.  It checks which (if any) of the older iOS 6 versions of the apps are installed, and presents one of 3 In-App Purchases to Activate--each with a different price.  Voila!  Variable priced app upgrades.
  • !!!There's a big question mark about whether Apple will allow the Upgrader app.  I don't see any reason why not, it's doing everything within the App Store and SDK, but who knows.  If they don't allow the Upgrader, then it will just be the 2 new versions for iOS 7 at full price.  We had a big note in the Reviewer comments about what we're doing.  Apple approved it!  
  • After all the 3 new apps are approved we'll drop the prices on the iOS 6 ones a bit and do new versions of those.  We'll add to detect if they have iOS 7 and recommend the Upgrader app. With big notices in the description to look for the newer version if have iOS7.  But this keeps around apps that will work on older devices too.  
  • It can already do nice transitioning of bookmarks using the new Cloud Bookmarks feature; we'll add so it can export and send over all the Saved Files too.  All in some nice directions on a webpage we'll show them.  
If Apple allows it, the Upgrader will be great.  Existing customers get the upgrade for a discounted price.

If Apple doesn't allow it, we at least tried. Everybody who wants it for iOS7 would then have to buy at full price.


It would be so much easier if Apple would add some system of paid upgrades.  This is all going to be a pain, tracking and updating 5 versions of the app.  Not to mention when we get the language translations in; likely 30 from SmoothLocalize.com which did ContactClean.  Times 5 apps, times 3 localized screenshots per app (one for each screen size).  A boring couple days for Pete and Shawn, but Shawn said each click for new languages also clicked money which made it all good :)


Tim Ekl from the OmniGroup was at the NSCoder Night in Seattle and said that Omni was just making it OmniPlanner 2 and charging full price.  That's what got us talking today and totally switching up what we were going to do for iOS 7.

Thursday, September 5, 2013

Smartwatch, do this

Samsung's new smartwatch thing looks too big and bulky.  I haven't worn a watch in years, so I'm not going to jump back by wearing a giant thing that barely lasts a day.

So first, be small and unobtrusive.


Our home phone (wow, we still have one of those!) is thru Xfinity/Comcast.  One great feature is if someone leaves a voice mail, it uses voice recognition to trans-scribes it and sends and email with the message as text.  Very nice.

First, the iPhone should simply do that for any voicemail.  Then a notification on a watch (in addition to the notification on the phone itself) can show the text of the voicemail without listening.