Thinking of You

thinkshot

Just launched a fun app for Mason Software Company called Thinking of You – you can follow it on facebook as well.

The app uses the iOS contact list extensively to send ‘Thinking of You’ push and sms messages. Apple requires that you request permission from the user before you can access the address book, below is a code snippet showing how that is done…

 

 


#pragma mark -
#pragma mark Address Book Access

// Check the authorization status of our application for Address Book
-(void)checkAddressBookAccess
{
    switch (ABAddressBookGetAuthorizationStatus())
    {
            // Update our UI if the user has granted access to their Contacts
        case  kABAuthorizationStatusAuthorized:
            [self accessGrantedForAddressBook];
            break;
            // Prompt the user for access to Contacts if there is no definitive answer
        case  kABAuthorizationStatusNotDetermined :
            [self requestAddressBookAccess];
            break;
            // Display a message if the user has denied or restricted access to Contacts
        case  kABAuthorizationStatusDenied:
        case  kABAuthorizationStatusRestricted:
        {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Privacy Warning"
                                                            message:@"Permission was not granted for Contacts."
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
        }
            break;
        default:
            break;
    }
}

// Prompt the user for access to their Address Book data
-(void)requestAddressBookAccess
{
    ViewController * __weak weakSelf = self;

    ABAddressBookRequestAccessWithCompletion(self.addressBook, ^(bool granted, CFErrorRef error)
                                             {
                                                 if (granted)
                                                 {

                                                     dispatch_async(dispatch_get_main_queue(), ^{
                                                         [weakSelf accessGrantedForAddressBook];

                                                     });
                                                 }
                                             });
}

// This method is called when the user has granted access to their address book data.
-(void)accessGrantedForAddressBook
{
    //do something interesting
}

Unity3d and Parse.com error messages

I’ve used Parse.com quite a bit for iOS development and been very happy with it. Performance and scaling is good, and working with the cloud based service is very straight forward.

I decided to use Parse.com as the back end database solution for my latest Unity3d project. Parse now has an official Unity SDK that you can download from the Unity3d asset store.

Despite all of the benefits of using Parse with Unity there is one glaring problem. Because of the way the Unity implements their WWW class we can’t access response headers containing error information from Parse operations.  So requests sent using the Parse SDK from Unity return responses which can be either successful, failed because of no connection, or failed because of some unknown cause.

Kalekindev has a great blog post addressing this issue. The solution is to create custom cloud code functions on Parse.com and call them instead. The cloud code handles the request and then returns either a success code or an appropriate error message.

Below is my initial cloud code running on Parse (cloud code is in javascript) to handle user signup.

Parse.Cloud.define("SignUp", function(request, response)
{
    var user = new Parse.User();
 
    user.set("username", request.params.username);
    user.set("password", request.params.password);
    user.set("email", request.params.email);
 
    user.signUp(null,
    {
        success: function(user)
        {
            response.success(
                {
                    "success": "Sign up successful."
                });
        },
        error: function(user, error)
        {
            // We must respond with a success in order to access the
            // result of the request inside Unity.
            response.success(
                {
                    "error": "Sign up failed.",
                    "code": error.code,
                    "message": error.message
                });
        }
    });
});

 

And here is the Unity3d C# code snipped that makes the call to the Parse.com cloud code and handles the return code appropriately if there is an error..

 

private IEnumerator CloudSignUp(string sUsername,string sPassword,string sEmail)
{
	var userInfo = new Dictionary
	{
		{"username", sUsername},
		{"password", sPassword},
		{"email", sEmail}


	};
	
	var t = ParseCloud.CallFunctionAsync<Dictionary>("SignUp", userInfo);
	
	while (!t.IsCompleted)
	{
		yield return null;
	}
	
	if (t.IsFaulted)
	{
		var parseException = (ParseException)t.Exception.InnerExceptions[0];
		
		if (parseException.Message.StartsWith("Could not resolve"))
		{
			Debug.Log("Failure: Connection error.");
			objStatus.text="Failure: Connection error.";
			objStatusPanel.SetActive(true);
		}
		else
		{
			// Possible mystery case?
			Debug.Log("Failure: Unknown cause.");
			objStatus.text="Failure: Unknown cause..";
			objStatusPanel.SetActive(true);
		}
	}
	else // Our request is successful but may still have failed server side.
	{
		object code;
		
		if (t.Result.TryGetValue("code", out code))
		{
			// Handle our call specific errors here.
			Debug.Log(string.Format("Failure: Code {0}", code));

			string sCode = string.Format("{0}", code);
	
			if (sCode.Equals("125")) {

				objStatus.text="Email is invalid";
				objStatusPanel.SetActive(true);

				Debug.Log("bad email");
			}

			 else if (sCode.Equals("202")) {
				
				objStatus.text="Username is already in use.";
				objStatusPanel.SetActive(true);
				
				Debug.Log("bad username");
			}

			else if (sCode.Equals("203")) {
				
				objStatus.text="Email is already in use.";
				objStatusPanel.SetActive(true);
				
				Debug.Log("bad username");
			}

			else {

				objStatus.text=string.Format("Failure: Code {0}", code);
				objStatusPanel.SetActive(true);
	
			}


		}
		else
		{
			Debug.Log("Success!");
		}
	}
}

 

This approach can be used for all Parse.com functions called from Unity and gives us a robust way to handle exceptions and errors.

Augmented Reality on iOS

Durovis Dive

I’ve been working on an AR (augmented reality) application for iOS and thought I would share some of the available software libraries and devices for iOS.

Hardware

Although an iPhone is not as ‘hands free’ as a dedicated AR device (Moverio, Vuzix, or the Meta SpaceGlasses) there are interesting hardware solutions to use your iPhone or Android smart phone as a AR client…

Durovis Dive

Durovis Dive

The Durovis Dive works with any Android or iOS smartphone featuring a gyroscope and an accelerometer and a display not larger than 5 inches. You just insert your smartphone, start the application and adjust the lenses to your eyes.

FOV2GO

FOV2GO

You can construct your own FOV2GO Model D Viewer – for the iPhone 4/4S, the Samsung Galaxy Note, or most Android smart phones – out of foam board and a couple of plastic lenses. Just download the instructions and the appropriate template.

Software

Source for my initial research and a great resource at Augmented Reality SDK Comparison

 

Open Source and/or Free

Argon
iOs – augmented reality from Georgi Tech – appears to be open source but I can’t find the code available for download – based on KHARMA – a KML/HTML Augmented Reality Mobile Architecture

iPhone ARKit
iOS – iPhone ARKit is a small set of class that can give you augmented reality in any iPhone application.

iPhone Augmented Reality Toolkit
This version of the iPhone ARKit is a forked version of the ARKit started on GitHub by Zac White.

mixare – Open Source Augmented Reality Engine
iOS & Android – It works as a completely autonomous application and is available as well for the development of own implementations.

PRAugmentedReality
open source – Augmented Reality Framework for iOS

Vuforia
(from Qualcomm)
iOS, Android, and Unity 3D
Very powerful tracker based AR SDK – free for commercial development

 

Proprietary and/or Paid

ARPA
iOS & Android

ARToolKit
iOS & Android – a very powerful Lib with a lot of work being done with it – has an open source version (but not on mobile devices)

Catchoom
iOS & Android

Metaio
iOS & Android (includes Junaio) – lots of products, including content creation and a cloud offering

Robocortex

String
Comes in vanilla OpenGL and Unity flavours. Add AR to any iOS project, regardless of 3D engine.

Wikitude
iOS, Android and BlackBerry 10 – both tools for client and creation – also has an AR browser app – very popular with a lot of dev shops using it

Xloudia
cloud based AR recognition and tracking

 

Roll your Own

Augmented Reality iOS Tutorial: Location Based

Augmented Reality iOS Tutorial: Marker Tracking

Results of Hackathon

angle hack austin

preparing for demos

This weekend I won 2nd place at the AppHack Austin with ShareMesh – an iOS based encrypted peer to peer messaging app that does not require an internet connection to operate. The app used the new iOS 7 features iBeacon and Multipeer Connectivity to handle discovery and communication between devices.

I had a great time and there were a lot of interesting projects and very talented people working on them (see a list at hackathon.io).

The Capital Factory facilities are world class and the folks from AngelHack and our sponsors were great hosts. Looking forward for the chance to go to the Spring 2014 HACKcelerator program in San Francisco.

hackathon_nov_2014_codingonsaturday hackathon_nov_2013_presentation