GVoice: An Open Source Objective-C Google Voice Library

05/12/2011 Note: I failed to mention that the library, as it currently stands, builds for iOS only. I’m sure it could be rejiggered to work with OSX, because I don’t think I used any iOS specific features. All the project files would need to be changed, and I’m not sure what’s involved with that.

I am please to announce my free and open source Objective-C library for working with Google Voice. It’s called GVoice and you can find it here. It’s BSD licensed, which means you can use it for anything you want, both commercial and free/opensource.

It’s quite easy to use, and this example should help:

[objc]
// USERNAME, PASSWORD, SOURCE and ACCOUNT_TYPE should be replaced with proper
// values.
self.voice = [[GVoice alloc] initWithUser: USERNAME password: PASSWORD source: SOURCE
accountType: ACCOUNT_TYPE];

// This causes some logging to happen.
self.voice.logToConsole = YES;

BOOL res = [self.voice login];

if (!res) {
// error handling
}

// Assuming you have a phone whose id is 23, this would cause Google Voice
// to route calls to it.
res = [self.voice enablePhone: 23]

if (!res) {
// error handling
}

// Send an SMS. Replace TEXT_PHONE_NUMBER with a proper 10-digit phone number
// capable of receiving SMS messages
res = [self.voice sendSmsText: @"Testing 1, 2, 3" toNumber: TEXT_PHONE_NUMBER];

if (!res) {
// error handling
}
[/objc]

On line 3, we create an instance of GVoice, passing in the email address and password from the user. The third field, source, is a field required by Google to identify where the connection is coming from. It’s free-form, but they suggest a reverse_domain_name-app-version approach, , something like com.joeygibson-GVTest-1.0, for example. The fourth parameter is what sort of account you’re trying to connect to, and there are two choices: GOOGLE and HOSTED. (This is an enum that also has a value of HOSTED_OR_GOOGLE, but I would suggest letting your user decide which account they have. It will save you problems later.)

Line 9 is where the actual login happens. If you get back a YES, all is well. If not, you can look at the GVoice object’s errorDescription property.

Line 17 demonstrates using one of the features of the library: enabling a phone. You pass the phone’s Id, which is obtained through another part of the API, and GV will then ring that number when a call comes in. You can also disable phones in the same fashion.

Line 25 shows how to send an SMS message from the GV account to the specified mobile phone.

There are many features that are fully formed, though some are still not as polished as I’d like. Two things still remain to be done: handling redirects and CAPTCHAs. After a certain number of failed logins, a URL will be returned that leads to a CAPTCHA image. To login after than you need to send a response to the CAPTCHA, but none of that is implemented in the library yet. Similarly, sometimes requests can be redirected by Google, but the library doesn’t handle those either. I’ve never seen either of these cases occur, but they could.

There is a full test suite included, which provides many more examples of how to use it. Before trying to compile it, you need to copy a file in the GVTests directory called GVCredentials-Sample.h to GVCredentials.h, replacing the dummy values with proper values. After that, you should be able to compile it and run the tests.

Full API documentation is available in the doc/ directory.

I wrote this library to use with my own iPhone app, which is currently in final testing before submission to the app store. I thought it would be useful for other people, so that’s why it’s free. If you’d like to use it, please do. If you’d like to improve it, let me know, and I can give you access to the repo.

It’s hosted on Bitbucket: https://bitbucket.org/joeygibson/gvoice.

iPhone Interface For My Blog

09/28/2009 Update: Now added a link to the view from Android.

Last week I learned about WPTouch, which is a plugin for WordPress that reformats the theme for the iPhone, Android and other mobile devices. It was an easy install, and I am now happy to report that if you view my blog on a mobile device, you’ll see the new UI. Here’s what it looks like on an iPhone

IMG_0465

If anybody has an Android phone, or some other supported mobile device, send me a screenshot so I can see what it looks like.

Thanks to Steve Ziegler, here’s what it looks like from an Android device. Thanks, Steve!

The iPhone 3GS GPS Is Crazy Good

I have a Garmin eTrex Venture hand-held GPS that I bought about five years ago. I used it for years mounted to my bicycle handlebars for when I would go trail riding to inject a bit of geekery into my rides. I would then download the tracks off of it and pull them into Google Earth to see where I’d been. It worked pretty well, but it had some annoying tendencies. The first was that it took nearly 10 minutes after turning it on before it really knew where it was. It wanted to get strong signals from twelve satellites before it would give you a decent reckoning of where you were on the planet, and that took a while. It was also very sensitive to cloud cover or tree cover. There were many times I’d be riding through the woods and would be in a particularly dense area and it would completely lose any idea of where we were, which is really not what you want your GPS to do.

Last Sunday I decided to get the bike out after a nearly two-year hiatus and go out to my favorite riding spot, Tribble Mill Park. Before I left, I bought an app for my iPhone 3GS from the app store called Trails. When I got to the park and got my bike out and ready, I ran Trails, created a new track entry and started it up. It almost instantly showed me where we were (just like the Google Maps app that is built-in) on the map. I then put the iPhone back into its leather holster, put that inside a canvas saddlebag that hangs under my bicycle seat, and then climbed into the saddle and started riding. I stopped several times along my route to check on it, and not once did it lose the signal. Let me say that again, in a different way: even though the iPhone was encased in leather, ensconced in a canvas bag and under a bicycle seat and my butt, it never lost the GPS signal. It mapped my route perfectly, as can be seen from this screenshot

IMG_0444

That’s pretty darn cool, for a phone! The GPS is not the primary purpose of the device, yet it performs far better than a dedicated GPS device. Now, GPS devices in general may be a lot better now than they were five years ago when I bought mine, so this may be an unfair comparison, but it really blew me away. I had thought about getting a handlebar mount for the iPhone, but if it can do what it needs to do from the relative safety of the saddlebag, I’d much rather keep it in there.

By the way, the Trails app is quite nice and completely worth the $3.99 it cost. I like the fact that you can stop and restart it to pick up where you left off. One really nice feature is that it has a button to launch the iPhone’s camera, so you can take pictures along the way without exiting the program. That’s a nice touch. It also requires you to name each track, which are kept in separate “files” so one track doesn’t show up overlaying another on the map. If you’re into trail riding and you have an iPhone 3GS or 3G, consider buying this great app.

Apple Doesn’t Seem To Want My Money

Yesterday, like six billion other people, I tried to pre-order a new iPhone 3GS from the Apple Store online. After trying multiple times getting multiple timeouts, I was finally given a message stating that they could not complete my request online, and that I needed to go to a brick-and-mortar Apple Store to complete it. This didn’t completely shock me since when I bought my first generation iPhone, I could not activate it through iTunes, and instead had to visit an AT&T store.

Shortly afterward, I received an email from concierge@apple.com, with this text

Thanks for starting your iPhone purchase online. To finish the process, come to the store you selected and look for a Concierge in an orange shirt. We’ll help you complete your purchase, activate your new iPhone, and set it up for you.

Apart from the fact that I didn’t select a store, this was in sync with what the online store told me. A pain to have to visit an actual store, to be sure, but it didn’t sound like it would be too painful.

So today, I drove to the mall and visited the Apple Store. As soon as I entered, I spied an orange-shirted “concierge” and approached her. “Hello,” I said, “I tried to preorder an iPhone 3GS yesterday online, but it said it couldn’t do it, and I needed to seek out an orange-shirted person at an Apple Store. Can you help me with this?” She looked pained as she responded, “I’m sorry… we don’t actually have a system in place to pre-0rder the 3GS.” She went on to say that they did have a pre-order system for when the 3G was launched, and she assumed they would move that system over for the 3GS, but they had nothing now, and I should come back on the 19th. She also said that “lots” of people had been coming in today, who had also been told to visit a store to complete their purchase.

That just sucks out loud.

I’m trying really, really hard to throw money at Apple and they just won’t take it. They clearly underestimated how many people would try to pre-order online yesterday, otherwise they would have had more server bandwidth to handle it. The fact that they sent me (and others) an email telling me to go to a store to finish the process, when they have no such process in place, is just sloppy. I’m not happy about this one little bit, and I want people to know about it.

Does this mean I’m not going to buy a 3GS and, instead, go with a Pre or something else? Of course not, and Apple knows this….

Skype For iPhone Is Full Of WIN!

We’re on vacation in Colonial Williamsburg, and the AT&T signal in and around our hotel sucks! This seems to be a common theme for me. At home, I have next to no AT&T signal. I swear, if it weren’t for the iPhone being such a loverly machine, I would never have gone with AT&T. Anyway, so we’re here in Williamsburg, and in the hotel, there is no cellular signal at all. But there is free, and fast, WiFi. So I fired up the Skype program on my iPhone and would you believe it worked a treat? It did. I have now made two calls with it. One to a restaurant in town, and the other to my brother-in-law back in GA to check on our dog. Both calls were crystal clear, with no lag or dropouts. I only have a 1G iPhone, so I can’t test it over the cellular network, but over WiFi, it was darn near perfect. I have a Skype unlimited subscription, so these calls were essnetially free. In any event, it was better than paying the $0.75 the hotel would have charged me for each call, plus whatever rate the local phone company charged. But beyond the cost, it was just plain cool!

I’ve been a fan of Skype for several years and we use it extensively where I work. I call into meetings and conference calls using it all the time, and I only very rarely have problems. I am now equally impressed with Skype for iPhone. Great job, guys! Keep up the great work.

Smiley

Help Me With iPhone Dev Graphics Question, Please

Usually when I learn a new programming language or framework, I am plagued by the fact that I can’t think of anything to build with it, or I can only think of things that are too difficult. With iPhone development, I have two ideas for apps, both of which should be fairly easy to write. I’ve gotten a good start on the first app, but now I’ve hit a roadblock, and I’ve been stuck here for a while. I thought I’d ask for help.

Obviously I can’t disclose too much of what the app does, since I do eventually want to sell it in the App Store. Essentially, it allows for a very specific type of photo manipulation. I’ve got the basic UI built, and I’ve hooked into the camera framework, so you can either take a new photo, or use one you already took. I am displaying the photo in the main window, currently scaled to fit, but I will eventually add zoom and pan. I have the code written that allows the user to define a region of the photo to work on, by drawing a rectangle or ellipse. I draw the shape using Quartz 2D, which results in a red rectangle or ellipe drawn on top of the photo. So far, so good.

This is where I’m stuck. I need to do “something” to the bits in the photo in the region defined by the rectangle or ellipse and, at some point, a freehand shape. (Obviously I can’t reveal what the “something” is.) So, I have looked through the Quartz 2D docs and am trying to figure out how I can

  1. get the bits in the region defined by the user’s drawing
  2. swizzle the bits with my secret sauce to produce the desired effect
  3. get the swizzled bits back into the photo for display to the user

And here I sit. I have never done anything with graphics before, so this is all completely foreign to me. I can’t see how to do any of those three steps.

The next question, then, is should I be using OpenGL ES instead of Quartz 2D? The iPhone dev book I have taught a little bit of both, and the OpenGL stuff looked far more complicated than Quartz, which seemed like overkill for my situation. I don’t know.

I think I can accomplish what I want by creating an image mask, applying that to my original image, and then displaying the new image, but the mask creation function, CGImageMaskCreate, has me confused. I get most of the parameters, but I don’t understand the CGDataProviderRef parameter. Can anyone offer any sort of pointers to get me moving again? Are there any really in-depth Quartz 2D tutorials? The Apple docs on Quartz that I’ve read are very basic, and don’t really give examples.

Thanks for any help or pointers. I know I haven’t given you much to work with.

iPhone OS 2.2 – Meh, So Far

I happened to be up and working for the man at 2:00 this morning when I saw a note on Twitter saying that Apple had released version 2.2 of the iPhone OS. Being the fanboy that I am, I immediately started the update process. The whole thing, from first click to iPhone ready-to-use, took about 15 minutes. Not bad, and certainly better than some previous upgrades.

Engadget has a rundown of the new features. One of the biggest additions is Google Street View, which lets you see street-level views while working through driving directions. You can also get walking directions from the Maps app, but since I never walk anywhere, that doesn’t really help me. The rearranging of the URL bar and Google box in Safari is another. You can also download podcasts over the air, but I use my 60 GB iPod for podcast listening, so this feature doesn’t do anything for me, either.

Basically, I’m just hoping that they’ve squashed bugs and made the OS more stable. I love my iPhone, but it does have its problems. I don’t know about everyone else, but I have to reboot my phone about once a week to keep it responsive. I know it’s time to reboot when I’m typing on the keyboard and I’m about 6 letters ahead of what’s shown up.

Oh yeah, Steve has still not decided that we’re worthy of copy & paste. Even though about 99% of iPhone customers are begging for C&P, it’s almost like Steve is keeping C&P away from us out of spite. Maybe in 3.0…