Just posted the code that I am using for an iOS project of mine that handles all the Web Api calls.  

https://github.com/dsandor/WebApiClient/tree/master/src/Monotouch

Example of use:

WebApiClient.Post<ServiceResponse<User>>(string.Format ({0}Auth/Login?emailAddress={1}&password={2}
  , AppDelegate.Current.ApiBase, email.Value, password.Value), , )
.ContinueWith ( (t) =>

         {
            this.InvokeOnMainThread(() => { loadingView.Hide (); });
                            
            var result = t.Result;
                            
            if (result != null && result.IsSuccess && result.Payload != null)
            {
               this.InvokeOnMainThread(() => 
                {
                  AppDelegate.Current.UserInfo = result.Payload;
                  MoveToHomeView();
                                        
                 });
             }
             else
             {
                this.InvokeOnMainThread(() => {
                    new UIAlertView(Invalid login, Invalid username or password., null, OK).Show();
                    });
             }
     });

Business Problem

Mobile laser scanning applications for Microsoft Dynamics Ax 2009 are complicated, over-engineered, and down right ugly.  Many applications exist and are very configurable but provide a very poor user experience which in turn slows down the end user and makes the data gathering more error prone.

Solution

After evaluating several tools to provide Cycle Count, Purchase Order Receiving, Inventory Transfers, and Miscellaneous Receiving we decided it would be best to take a 37signals approach to Get Real with our application.  We provided our warehouse team a set of tools that allowed them to accomplish their job in a simple and user friendly manner.  In addition, we minimized our cost per mobile barcode scanner.  By using a $200 iTouch as the brains and a $499 Linea Laser Barcode cradle we dropped our $3,000 mobile scanning hardware to $699.

The user interface is built using Novell’s MonoTouch and is written in C#.  The XCode tools were also used for some screen layout.  No Objective-C was used on this project.  The iTouch applications make WCF calls to interact with Dynamics Ax 2009.  The WCF Services are written in C# 4.0 and employ the .NET Business Connector to interact with the ERP system’s data.  An Ax project that uses X++, Forms, Classes, and Schema Additions is used to provide a succinct API to the WCF Services.

http://buildsucceeded.com/oldpics/Screenshot 2011.02.01 17.02.54
PO Search Screen

http://buildsucceeded.com/oldpics/Screenshot 2011.02.01 17.02.46
PO Details Screen

This example is the result of many hours of trial and error.  With the resources provided in this post you will be able to create a small application that will let you scan a barcode into a textbox.  In future parts we will make a more useful application.

The barcode scanning functionality is provided with a hardware device.  If you are reading this you have likely already acquired the SDK and hardware from Infinate Periferals

The application will be developed in MonoDevelop and will utilize MonoTouch.net and MonoTouch.Dialog.  Please use this linkto get all these applications installed and working first.  Please be sure to compile the MonoTouch.Dialog assembly before getting started with this example.

Lets get started

First, Create a project in MonoDevelop of type iPhone Window-based project and give it a name.

http://buildsucceeded.com/oldpics/Screen shot 2011-01-04 at 1.28.08 PM

When MonoDevelop has completed creating the templated project and solution files you will have something like this:

http://buildsucceeded.com/oldpics/Screen shot 2011-01-04 at 1.34.28 PM

Here we will add a reference to the MonoTouch.Dialog assembly.  First I will copy it into my project folder by right clicking on the project name in MonoDevelop and choosing Open Containing Folder.  This opens the folder that contains your project files.  Copy the MonoTouch.Dialog.dll file into the project folder.  Right click on the References node in MonoDevelop and chose Edit References.

image

Locate the MonoTouch.Dialog.dll assembly

image

Double click on the MonoTouch.Dialog.dll assembly to add the reference and click OK.

We are now going to create a simple View that displays a message and an input field.  This View (aka form, dialog, screen, page) will be created using MonoTouch.Dialog to simplify things.  Please read up on MT.D on your own.  More examples will follow in the future for that.

Add a navigation controller to the application by double clicking on the MainWindow.xib file.  This will launch Interface Builder.  In the library window choose Objects and drag the Navigation Controller object to the MainWindow.xib window.  You will now have a navigation controller listed.  See image below.

image

Now we need to create an Outlet (aka property) for the navigation controller.  This is used to push views.  Think of the navigation controller as a Push / Pop frame and your Dialog is a view that will be pushed to the visible surface of the application.

imageTo create the Outlet you need to click on the Classes tab of the Library then click on the AppDelegate class at the top of the list.  Then at the bottom of the Library window you need to choose Outlets in the combo box. 

Click the little plus sign + to add a new outlet.  Name it navigation. 

Now we need to link the outlet to the Navigation Controller object in the MainWindow.xib.

image

Click on the App Delegate object in the MainWindow.xib interface builder window.  In the App Delegate Connections window you will see your new navigation outlet.  Hook this outlet up by clicking on the empty circle next to it and dragging it to the Navigation Controller object in the MainWindow.xib window.

image

When you have done this, your App Delegate Connections window will look like this:

image

Save your changes in the interface builder (Command + S).

Go back to MonoDevelop, you are ready to code.

Create an empty class file and call it:  MyBarcodeDialog.cs

Paste the following code, it creates a view with a textbox that we are going to scan into.

Save your new class and double click on the Main.cs file.  We are now going to have the application load the NavigationController and then have the navigation controller push your MyBarcodeDialog view to the foreground.

To accomplish this we are going to modify the FinishedLaunching method.

Basically what we did here was to add the navigation controller to the window’s SubView.  Then we use the navigation outlet (property) to push our new MyBarcodeDialog view controller into view.

Running the application now will result in the following form:

image

We now have a simple iPhone / iTouch application.  Now we will hook up the code for barcode scanning.

First we need to copy the libLineaSDK.a library file into our project folder.  This file is not distributed with the example code here because you need to sign up to be a developer with Integrated Peripherals and sign an NDA in order to acquire the SDK.

Next, we need to tell MonoTouch how to find the LineaSDK library and how to link it in to the project.  This next section allows no room for error.  Everything must be as described here or it will not work.  This has to do with the way that the LineaSDK is compiled and a nasty bug in the XCode linker.

Right click on the project and choose Options.

image

Click on iPhone Build and choose iPhone from the platform combo box.

Choose Don’t link in the linker behavior and paste the Extra arguments below.

-v -gcc_flags "-L${ProjectDir} -lLineaSDK -framework AudioToolbox -framework CoreGraphics -framework ExternalAccessory -ObjC"

Click OK to close the options window.

In order to use the barcode hardware, we need to edit the .plist file.  This file contains properties and values that tell the iOS information about your application.  In this case we need to tell the iOS that we want to allow the Linea hardware to talk to our app.  Double click on the Info.plist file to open up the plist editor.

image

Here we have to add two properties.

First, click on the Information Property List node and then click Add Child.

For the name enter UISupportedExternalAccessoryProtocols.  Click enter then right click on the property, choose value type and select Array.  Now we need to add two items to the array.

image

Click the button to the right of the property value.  This will add a child to the property.  It will auto name the property Item 0.  Enter com.datecs.linea.pro.msr

Click the button again to create Item 1.  Enter com.datecs.linea.pro.bar

Save and close the plist editor.

Now we need to create a class file that will provide an interface to the LineaSDK library.  This class file will be compiled with the btouch compiler provided with MonoTouch.  I will not go through that process here but I included the compiled DLL and the .CS class file used to generate the DLL.  This class is basically an interop class that provides an interface for the C# managed mono code to talk to the native LineaSDK.

The class I used looks like this:

I attached this code here:

Here is the compiled DLL

You can learn how to compile this on your own here.

We now need to reference this class.  Right click on references and add the LineaSDK.dll to your project.

Your solution should now look like this:

image

We are getting close now.  We need to create two more classes to use with the LineaSDK.  An event message class and a LineaDelegate implementation. 

First we create the BarcodeMessageEventArgs.cs class in the project.  The code should look like this:

Next, we need to implement the Linea Delegate interface.  Add a new class to your project named MyLineaDelegate.cs.

Use the following code:

Now we can start using the LineaSDK and interact with the barcode scanner.

In the MyBarcodeDialog.cs class file we are going to add a method and an event handler.  This code will setup the SDK interface, connect to the hardware and update our textbox in the event of a barcode scan.

The last thing to do here it to update the constructor to make sure the initHardware method is called.

Compile the code, deploy to the device, then run the application.  When the view loads you should see your form.  Clicking the scan button on the laser barcode hardware should scan barcodes into the Barcode field on the view.

image

 

There were a great many steps in this example but once you get this far you have a base scanning application.  Your next step should be to explore MonoTouch.Dialog and make a more complex application.

Download the full MonoDevelop solution below.  Please note that the LineaSDK library and any bits that belong to Infinate Periferals has been removed from this project.  You will need to add the libLineaSDK.a file in to the project folder yourself.

Download Source: MTBarcodeExample.zip

Download Source: MTBarcodeExample.zip