26 November 2008

I'm Stoked

Just checked my first days sales - I've sold four copies! Made my day :)
With the current exchange rate, that's a profit of about AU$8.40 (US$1.40 [AU$2.154] * 3 +  €0.97 [AU$1.95]).

Thanks to those customers and hope you like the app. 

Localisation (Localization)

Hooray! My app is up on iTunes for sale. Looks good, but I see three problems.

The first seems to stem from my decision to select Australian English as the main language. When I view the app in the US store, it contains no description at all. Fixed by cutting/pasting the description to all English speaking locales, and then removing a lot of 'u's from colour.

Problem two: below the description are two links; David Phillips Website and Resistance is Futile Support. I didn't know I had a website. Oh, I don't. The link leads to localhost. oops. Fixed (I think) be removing the default http:// from this field.

Problem three: The requirements section lists iPhone 2.1 Software Update as required, but this will run on 2.0. I assume 2.1 is listed as this is the target I used to build the binary I submitted. Not going to worry about this one.

25 November 2008

Approved

Just got an email from Apple. The app has been approved and is now ready for sale.

From what I've read elsewhere, it takes about 24 hours for an app to make its way from here into the actual iTunes Store.

22 November 2008

Waiting

Managed to get everything off to Apple this morning; the app is now in their hands with a status of 'In Review'. Now I wait...

Being an Australian resident, I also need to supply proof of being registered for GST (Goods and Services Tax). 

There are five similar apps on the AppStore currently, 2 free, 2 for AU$1.19 and 1 for AU$3.99. I am pricing mine at the tier 2 price of AU$2.49 (US$1.99). 

21 November 2008

Preparing For the App Store


The app is complete.

Now it's time to get it off to Apple for review. All I need to do is write a few paragraphs about it and then upload it to them, right?

No.

First I have to do a Distribution build, which involves signing the app with a different certificate, setting up a third build profile and then getting it all to work.  This took me all evening and more; some bits took a lot of fiddling to get working, and then the build would succeed, but inspection of the log showed it wasn't being signed with the new certificate. In the end, however, it got it all working.

Now all I need to do is upload it.

Um... no.

Now I need to supply a 512 x 512 icon (what! that's not an icon, that's a poster), and a url for a support website for the app.  I don't have Photoshop, but I do have a trial version of Acorn. I try a few ideas, but they all look embarrassingly bad. I give up and head to bed.

As for the website... I'm not game to spend much money as I don't think there's a huge market for this type of app. I think I'll be please to sell a dozen copies, not because it's bad (it's not), but because it doesn't have the same sexiness as a game or some of the other types of apps.
I think I'll see if I can get away with setting up another blog and using that for support.

Again, my friend Matt has stepped in and offered to try his hand at designing a poster. His idea was something like a Borg ship shaped like a resistor. That's his initial idea at the top of this post. I like it.

So, all I need now before I can submit this app is a poster sized icon, and a support site. And a price.

20 November 2008

Resistance is Useless

 I've been working may way through the UIKit components learning how they work and how to use them. Got a bit carried away with the UIPickerView and ended up building an entire app.

There's two tricks I've developed. The first is a simple means of getting the picker dials to wrap (by default the work like a list - once you reace the end you then have to scroll all the way back up to the beginning again). A number of the native apps, such as the alarm (but interestingly, not the timer) feature wrapping dials, and I thought it seemed like a good idea. The second trick was highlighting the selected row of each dial to make it more prominent and the overall look less like a kids toy.

Second one first. I have a class ResistorBand which all four band types inherit. The band objects are called upon by the controller (which acts as a delegate for the UIPickerView) to supply the views for their corresponding dial. I've subclassed UIView and overwritten  - (void)drawRect:(CGRect)rect which actually paints each square. If the view is not the selected view for that row, it has a white rectangle with a 0.6 alpha drawn over it. This has the effect of slightly muting the non-selected colours.

Getting the dials to wrap up being simple in the end, thanks to a suggestion from a friend of mine [thanks Matt]. 
To start, we need to tell the picker there's three times the number of rows than there really are:

- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component {
    return [[self bandForIndex:component] viewCount]* 3;
}

Next, when the picker asks for a particular view, we need to map the row it's asking for, with the actual views, ie just row mod viewCount:

return [views objectAtIndex:position % [self viewCount]];

Finally, when the user selects a row, as well as our normal logic, we need to make sure the picker row selected is always in the range [band viewCount] and [band viewCount]*2-1 (inclusive). This means that whenever the picker draws the selectd view, there will always be others above and below it (we'll never reach the end of the list):

- (void)pickerView:(UIPickerView *)pickerView
      didSelectRow:(NSInteger)row
       inComponent:(NSInteger)component {

    ResistorBand *band= [self bandForIndex:component];
    [band selectPosition:row % [band viewCount]];

    NSInteger updatedRow= row;

    if (row< [band viewCount]) {
        updatedRow= row+ [band viewCount];
    } else if (row>= 2* [band viewCount]) {
        updatedRow= row- [band viewCount];
    }

    [pickerView selectRow:updatedRow
               inComponnt:component
                 animated:NO];

    [self updateDisplay];
}

Hope this makes sense.

I'm Back

Time to resurrect this blog again, me thinks.

Since I last posted, we've moved 4,000km to the other side of Australia, the NDA has been lifted and I'm now looking for work.

I've put my game on hold to try and get a better grasp of Objective-C, UIKit and the way iPhone development works. I've written another app that's complete and ready to go to apple, it's just waiting for me to create a support webpage and an icon.