IPhone

Fragmented Capital - It Just Got Harder to Be an iOS Indie Developer

With Apple’s announcements yesterday, it just got a lot more expensive to develop for Apple’s ecosystem.

I’ve written before about why it’s important to test your code on as many different devices as you can before you ship. That’s been getting harder and harder over time, but it just got a whole lot worse. Up until now, Apple pretty much only released one new iPhone a year. Yes, they released two last year, but the 5C wasn’t all that different from the 5 for programming purposes, so many of the devs I know skipped it. We couldn’t safely skip the 5S (at least in my opinion), since the processor changed from 32bit->64 bit. That meant that the code that ran on the 5S behaved differently than the ones on the 5/5C, and so (again, in my opinion), we really needed to test both.

 2 min read

Programming an iPad with an iPad: Putting the "Mobile" into Mobile App Development

 

This is a talk I gave on Thursday at the Austin CocoaCoder group (and here is the PDF if you don’t do Flash):

Developing iOS apps on your iPad with XCAB

View more presentations from Carl Brown

The code is here on GitHub, and you’ll need this version of iOS-BetaBuilder and accounts with Boxcar and Dropbox.

 

It’s not perfect, yet. There’s no provision for managing XCode projects or xib files (you’ll still have to do all that on the Mac), no auto-complete or refactoring or debugging or instruments and the lag and long cycle time gets old.

 1 min read

Mobile Apps - Boom or Bust? Sherman, please set the Wayback Machine for 1994, and then 1853

In the last few days, I’ve seen reports that Mobile Apps are repeating the 1996 expansion, and reports that Mobile Apps don’t provide a viable business model. I think that  there are elements of truth in both articles, but I don’t think either is an adequate depiction of what I’m seeing. Let me see if I can explain.

Like others, I feel like I’ve been here before, but for me the year wasn’t 1996, but 1994. That year, I was a consultant in Dallas Texas, mostly hooking up Internet connectivity and web servers for companies that nothing to do with technology. At one point I literally couldn’t introduce myself to people without having them say, “Did you say that you do websites? I’ve got to get a website for my business. Can you help me?”

 2 min read

Fixed Price iPhone App Proposals - One Contrary Consultant's View

I’ve seen a some traffic lately about billing and proposals for writing iPhone apps. Most of what I’ve seen revolves around hourly rates, but I think that’s not a helpful way to go, so I thought I’d chime in with my opinion.

I’ve been a consultant off and on for the better part of my career, starting with EDS in 1993. I’ve worked for different consulting shops and independently and I’ve read extensively on the topic. Lately, I’ve been applying a lot of that experience to consulting for companies who want iPhone apps created.

 4 min read

360iDev Impressions - Day 0

The first class I took was Kendall Gelner’s Advanced Debugging class. It was really, really good. I learned about using the Mac “User Interface” instrument to record and play back simulator events for debugging and how to create custom instruments with DTrace. It was a well organized, very useful talk.

Sunday afternoon I took Saul Mora’s Unit Testing that Doesn’t Suck class. It didn’t go as well. The class was predicated on the attendees having GHUnit and MacRuby, and the hotel WiFi completely failed under the load (and not for the last time during the conference). We learned about some of the cool utilities in Saul’s GitHub account, but the class didn’t manage to reach its full potential because it took us so long to get the software prerequisites installed.

 1 min read

360iDev Impressions - Day 1

Monday morning, David Whatley did a great keynote that was based on this video. He talked about what happened at his company when he instituted a Results Only Work Environment. It was very interesting, and ended with this. Which is the coolest way to end a keynote, ever.

I started with Tom Frauenhofer’s Cocos2D class, which is probably the class in which I learned the most the whole conference, but that’s largely because I had never touched cocos2d before, so I had a lot to learn. Tom was very organized, and taught us enough that I managed to actually write a game prototype 36 hours later.

 2 min read

360iDev Impressions - Day 2

Tuesday opened with a informative panel that covered a bunch of issues including the upcoming Mac App Store, and Android vs. iPhone development.

Then on to Tim Burks’ Get Your Head in the Clouds talk. I learned about a lot of really cool tools I hadn’t dealt with, especially ASIHTTPRequest, which I think I will find a lot of uses for. Tim was very prepared, but it was at times a difficult talk, as he got questions ranging from subtle differences between Heroku and AppEngine to “What is this Amazon S3 you keep mentioning?”. It’s really hard to speak to an audience of just widely ranging needs and skill sets, but he did so admirably well.

 2 min read

360iDev Impressions - Day 3

Day 3 started an hour later (to give us time to recover from the party or the Game Jam or (for some crazed souls) both). We went through a review of the people that wanted to present their apps. Lots of very impressive accomplishments for such a short time.

Next, I went to Brandon Alexander’s talk on Interface Builder. It was a rough talk (like Time Burk’s the previous day) because there were obviously some Interface Builder experts int he audience, as well as some people who don’t seem to have ever used it before. I learned about creating new classes in Interface Builder (which will save me some time), and he talked a little bit about Internationalization and did a helpful example on tableviews. A lot of the class ended up being review for the people that didn’t raise their hands that they’d used IB before, though.

 3 min read

360iDev Impressions - Overview

I got back last night from the latest 360iDev conference (my first time to attend). I had a great time and learned a lot, but most importantly, it provided a lot of motivation I really needed to keep working on my apps.

I went through my notes to reinforce my memory while it’s reasonably fresh, so I figured I might as well post my notes. Pre-conference class notes start here, and continue to Monday, Tuesday and Yesterday. My notes on the GameJam start here.

 2 min read

Color Mixing with Multitouch

OK, It’s more fun and more challenging now, although I’m not sure anyone would buy it, even if I polished it.

It was way too easy, so I took a cue from @ OwenGoss’s Dapple and put in a color mixing element.

So now there are 6 colors of spaceships and 6 colors of shields but still only 3 buttons:

So if you want to block the green aliens, you have to hit the Blue and Yellow buttons at the same time while the green spacecraft enters the atmosphere.

 2 min read

It's a Game! (Not sure if it's any fun, yet, though)

Movie code starts !

Movie code ends !

So it actually kind of looks like a game now. I need scoring, I guess, and some consequences, but the idea is there.

From The List:

  1. Get a cocos2d hello world screen showing the big blue ball royalty-free NASA supplied image

  2. Get a quick sprite to be the bad guy on the screen.

  3. Cover the world in an opaque block when screen is touched and restore it when touches end

     1 min read

My plan for world (and self) deprecation

While I’m waiting of my wife and 4 year old to meet me for dinner, thought I’d jot down a quick list (it doesn’t count as starting until I open XCode, right)?

  1. Get a cocos2d hello world screen showing the big blue ball royalty-free NASA supplied image

  2. Get a quick sprite to be the bad guy on the screen.

  3. Cover the world in an opaque block when screen is touched and restore it when touches end

     1 min read

Quick concept art

Threw this together in DrawIt (scaled down to save bandwidth):

 1 min read

Status Update: Primary-Colored World

Movie code starts !

Movie code ends !

Really remedial, but something is actually happening. Only took 4 and a half hours to get colors to show up.

But, as for my list:

  1. Get a cocos2d hello world screen showing the big blue ball royalty-free NASA supplied image

  2. Get a quick sprite to be the bad guy on the screen.

  3. Cover the world in an opaque block when screen is touched and restore it when touches end

     1 min read

Talking to Myself

I’m going to keep writing updates to RapidWeaver locally - Although I have no idea when I’ll have enough bandwidth to actually publish them.

Kinda takes the fun out of it.

In any case, I have the ship moving (until it hits the bottom of the screen). It’s at least looking more like a game now.

Next up: Conveyor Belt

 1 min read

The Sky is falling!

Movie code starts !

Movie code ends !

Or at least the aliens are.

  1. Get a cocos2d hello world screen showing the big blue ball royalty-free NASA supplied image

  2. Get a quick sprite to be the bad guy on the screen.

  3. Cover the world in an opaque block when screen is touched and restore it when touches end

  4. Make the alien move.

  5. Make the alien able to collide with the block.

  6. Make the game over popup if the alien collides with the world while the block isn’t up.

     1 min read

My iPhone is dead. Long live my iPhone! Today I wonder, how did I ever make it through college?

My iPhone died. Well, not died necessarily, but it’s dead to me. I was upgrading it to the newly released 4.2 Gold Master, when it threw a fatal error. Can’t upgrade. Tried going back to 4.1 - same error.

So that sucks. Made an appointment at the Genius bar at the apple store for this afternoon. I’m confident they’ll fix it.

But here’s the problem - what do I do between now and then? I have a wife that calls me; I want to know if she or my daughter needs me. I have people that need to get in touch with me for business. I need my phone to work.

 3 min read

New iPhone Secured. I love the Apple Store. no more iTunes error 1013.

So, after my iPhone 4 bricked with a BaseBand update error, I made an appointment at the domain apple store here in Austin.

I explained the situation, which was kind of hard for them because they don’t have access to the same set of tools that we developers do. Their setups don’t have the ability to deal with developer software images, so they were kind of at a loss as to what to do.

 3 min read

The Hard Stuff - iPhone App Design Edition

I was talking to my latest iPhone App customer today, and now that we’re both able to look at the prototype, we were talking about the features that we could add before the shipping version, or not.  We talked about trade-offs, and I heard myself saying the same thing I’ve said many times before, so I thought I’d write it down.

There are three really hard things about iPhone Apps (at least to me - I have a background Enterprise and Web Apps).

 2 min read

What a Difference 2 Years Makes - a Study in Contrasts With iPhone Ad-Hoc App Distribution

The first iPhone App that I worked on was submitted in October of 2008. The month before we submitted, there was a flurry of emails between me and my customer, a sample of which are reproduced below:

 

Begin forwarded message:

From: Customer

Date: September 16, 2008 12:58:19 PM CDT

To: Carl Brown 

Subject: Re: iPhone project status

 

My Identifier is XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Emails omitted for brevity.

Begin forwarded message:

**From: ** Customer

 3 min read

Alternating accessoryView and accessoryType in UITableViewCell

Quick post about a problem I had today.

I’m writing an app for a client that has a checklist component. So a UITableViewCell is in an unchecked state, and then when the user hits it, it becomes checked.

I like the look of the UITableViewCellAccessoryCheckmark, so I’m using it, but I needed something when the cell is unchecked, so I’m using a png that has a circle.

I was having a problem that when the cell was unchecked and I tapped on it, nothing appeared to happen, although if I went to another screen and came back to that one the check box would show up. But, if the cell was checked and I tapped on it, the circle would show up. Here’s the code that fixed it:

 2 min read

A Tale of Two Table Views - my UISearchBar Race Condition that I finally found

OK, so I finally found my race condition, I’d talked about here and here.

So, in my KidChart app, I have a UITableView that has a list of all behaviors that people can pick from:

 

 

and in the search box above, people can start typing to narrow down existing behaviors and then click on one so they don’t have to scroll as much. As soon as the UISearchBar gets focus, it does this:

 2 min read

UI Automation App Input

So, I’ve been doing more UI Automation test work, and I’ve discovered a couple of things. I’m kind of trying to write them up as I run into them, although I’m putting together a helper library that I’ll announce at some point, hopefully soon.

So, what I’m trying to work on is a race condition in my KidChart app. The issue (I think) has to do with notifications during input into an UISearchBar.

 2 min read

Apple iOS iPhone UI Automation Testing: What does Accessibility have to do with it?

Trying to do some UI Automation testing going on one of my Apps today. Have a race condition, so I want to have a script to run it over and over again to have a better chance of catching the problem (more on that in a later post).

So, I just wasted 2 hours trying to test this structure:

And the problem was that I had this set in Interface Builder:

 1 min read

Hidden VPN/DNS Gem in Apple's iOS4.1 announcement today

I’ve been on-again, off-again fighting with getting my iPhone 4 to talk to a Cisco VPN concentrator to connect to a company internal network.  The iPhone would connect, but it couldn’t resolve any names, but my iPad worked with no issues.Turns out, the problem was with iOS 4.0.x’s implementation of  Multicast DNS.  According to this IETF draft, ‘…Any DNS query for a name ending with “.local.” MUST be sent to the mDNS multicast address…’, which Apple took literally for iOS 4.  Turns out the company whose VPN I’ve been having trouble with uses .local as their internal DNS domain.Although there’s no documentation I’ve been able to find, it seems that iOS 4.1 changes this behavior, because after updating my iPhone 4 to the iOS 4.1 GM seed today, it started being able to resolve the .local addresses just fine.As an added bonus, under 4.0, the iPhone would ask for a password every time I tried to connect to the VPN.  Under 4.1 (or 3.2), the password is saved like you would expect.

 1 min read

Look, Ma, no laptop!

I implied earlier that when I use BlogPress to write a blog post with my iPhone or iPad, that I had to wait until I got to my laptop to publish it. That isn’t true. If I want to tweak it in RapidWeaver, then I have to wait for my laptop, but if I’m okay posting it without going through a proper preview step, I can just hit “Publish Now!” in BlogPress, and let RapidBlog handle the rest.

 1 min read

NSInMemoryStoreType is not a good substitute in unit tests

So I was writing some tests for my KidChart app, which uses core data, and I wasted a ton of time, so I thought I’d post to warn people.  I wanted to avoid having to reset the state for each test, and I wanted the tests to run quickly, so I used NSInMemoryStoreType for my persistent store in my unit tests. This is a technique I’ve used before in other programming languages, and I was new to Core Data, so I was applying what I had done before to something I had insufficiently researched.

 3 min read

People Seem to Prefer Videos and other things I learned from trying to advertise my iPhone app.

I have a couple of apps of my own in the AppStore. Most of the sales of the apps I have worked on have been the apps I did for other people, because, well, they are better than I am at marketing.So, I’ve been trying to figure out how to do marketing with one of my apps, KidChart. It’s been out several months and sales have trailed way off. I like it (my wife and I use it every day), but I haven’t figured out how to market it. It has been getting about 3-4 sales a week the last couple of months. I talked to a marketing firm who does iPhone marketing, but they want $1000 per month for a 6 month campaign. And I just don’t know if I can ever make that back. (I don’t know how much of the problem is due to people not seeing it and how much is due to them not liking what they see).So to try to figure out I signed up with a trial account from Performable, and I ran some facebook ads to see how the A/B testing worked. The experiment is going to continue through the weekend, but, in case anyone cares, here are my preliminary results:

 4 min read

Blogging workflow with Reeder

I’m a huge fan of Reeder for both the iPhone and iPad. It’s so much faster and more convenient than any other Google Reader client I’ve dealt with, I haven’t launched Socialite or NetNewsWire in weeks.So, when I decided I was going to start blogging regularly, I wanted to make it easy for me to do so. This is the workflow I worked out:

I set up a blog on blogspot, and then linked it to my site (which I edit with RapidWeaver) with RapidBlog from Loghound.com. Then I used the “Email & Mobile” menu of the Settings tab of the blogspot dashboard to set up an email address, and set it to “Save emails as draft posts”. Then I added that email address to my Contacts app with the name “Blog Fodder”.Now, when I see something in Reeder I might want to blog about, I hit the action button, “email link”, and send it to my blog address. Then, I can edit it (as I’m doing now) as a draft with BlogPress on my iPad or iPhone, and when I have some time with my Mac, then I can sync and publish it to my blog with RapidBlog.Granted, it’s a little Rube Goldberg, but it makes it easy for me to capture ideas whenever they occur to me, blog during my unproductive time, and publish quickly at my leisure.Time will tell if it’s easy enough that I manage to stick with it.

 2 min read