To Xammer or not to Xammer

Xamarin vs XCode

Anyone that reads this blog regularly or knows me, will know that I’m a C#/Java programmer primarily (ok I think I’ve just come out, this is the first time I’ve ever called myself a Java programmer), but I love all other languages, especially javascript and objective-c, lets put it out there, my objective-c is poor to middling at best, mainly because I’ve only written 3 iOS applications. I was in London this week and I got an early preview of a new service, it looked pretty good (awesome even) so I was thinking of how I could write a few of my own clients for this. I’m a bit greedy in that I want to do everything myself which is pretty much impossible given all my other commitments.

Client options

  • Html5 Desktop Client
  • iOS native client
  • Droid native client (I’ve never strictly speaking done one, unless you include my hello world post two years back)
  • PhoneGap/KendoUi iPad/Droid apps (I’m doing the phone apps for my Expenses service with these technologies).

Decisions tree

My first instinct was to go the PhoneGap with KendoUI, I actually did the initial layout and had a look in the Android Emulator and it was pretty nice (as I was in London I didn’t have my MacBookAir with me and I didn’t have the Visual Studio Phone Tools installed either so eclipse/android it was with that painfully slow emulator). The problem I encountered with this approach was that CORS was not enabled by default and I use my visual studio to develop design debug (Phonegap can do CORS once the site is white listed).

My next option was to write the native clients, when I arrived back home I quickly ensured I could connect to the server (that uses basic authentication), I used objective-C firstly, I didn’t use any 3rd party libraries and the end result appears a little verbose (a better iOS developer will probably cry when they look at these screenshots and tell me use AFNetworking etc (which I used in my BrianKeating.net companion app).

XCode Version

image

Make the initial request and delegate to the view class.

 

image

Here i set the username and password for the request when/if challenged.

Screen Shot 2013-05-04 at 22.15.41

Here i allocate a place to store the response if it’s was a success and save to data into urlData.

image

Here I list all the key value pairs in the JSON returned (something I  don’t actually show in the c# version.

The advantage of XCode/Objective-C to me is that it’s a different toy to play with, that said c# is just a fantastic language it’s RAD and it Xamarin have done a fantastic job of bringing it to the iOS and Android Platforms.

MonoDevelop Version

This  screen shot shows the same request to the server as done in XCode, the difference is that this took me about 1 minute where the objective-c version took me about 25 (although i did reuse the storyboard).

image

 

 

 

 

You said Decision?

So how will I proceed? I’m going to ditch the objective-C approach for sure:

Reasons:

  • It’s so much faster! I love C++ but can’t get myself to use it for app dev these days simply because C# kicks it to touch for rapid application development.
  • Because I don’t expect to continue this POC myself and will have to hand it over to someone, and I don’t know anyone else on the team that knows objective-C.

I’m actually still leaning towards the PhoneGap/KendoUI option, I just need to get my grubby hands on the server so i can add the CORS headers (again because I don’t want to do the bulk of my debugging with Phone gap but rather IE/Chrome and I quite like my browser stack (jQuery/Knockout/Breeze etc) but the main advantage is that the the same source can then be used for the Android platform. Sure Facebook/LinkedIn etc have all been moving away from html5 because of the tooling, but I feels it’s the best solution for getting to both markets quickly.

So that is my reasoning, I expect everyone with be faced with much the same decisions and will have to weight the pros and cons themselves.

Retrieving stock quotes in C#

 

I’ve been playing with the idea of writing an currency converter for my new Windows Phone 7. Stumbled across a tweet by Scot Hanselman regarding http://channel9.msdn.com/coding4fun. Turns out someone else beat me to it with the BING “api” (more of a url naming convention really).

So I got a little diverted and write a little app to get stock quotes from google.

Here’s how enjoy…(Using a default ticker of vodafone (.net 4.0)

image

BlogEngine and Silverlight

I've had a few people asking me how did I host Silverlight 3 in blog engine.

Silverlight Usercontrol

It was pretty simple really (when you know how)

Basically Silverlight3 needs an <object> tag.

So I created a user control with the object tag and some script handling for client side errors (actually VS2010 did all the hard lifting).

<%@ Control Language="C#" ClassName="SilverlightControl" %>

<script runat="server">

</script>


<script type="text/javascript" src="~/Silverlight.js"></script>
    <script type="text/javascript">
        function onSilverlightError(sender, args) {
            var appSource = "";
            if (sender != null && sender != 0) {
                appSource = sender.getHost().Source;
            }

            var errorType = args.ErrorType;
            var iErrorCode = args.ErrorCode;

            if (errorType == "ImageError" || errorType == "MediaError") {
                return;
            }

            var errMsg = "Unhandled Error in Silverlight Application " + appSource + "\n";

            errMsg += "Code: " + iErrorCode + "    \n";
            errMsg += "Category: " + errorType + "       \n";
            errMsg += "Message: " + args.ErrorMessage + "     \n";

            if (errorType == "ParserError") {
                errMsg += "File: " + args.xamlFile + "     \n";
                errMsg += "Line: " + args.lineNumber + "     \n";
                errMsg += "Position: " + args.charPosition + "     \n";
            }
            else if (errorType == "RuntimeError") {
                if (args.lineNumber != 0) {
                    errMsg += "Line: " + args.lineNumber + "     \n";
                    errMsg += "Position: " + args.charPosition + "     \n";
                }
                errMsg += "MethodName: " + args.methodName + "     \n";
            }

            throw new Error(errMsg);
        }
    </script>

  
    <div id="silverlightControlHost">
    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
    <param name="source" value=""http://www.briankeating.net/clientbin/blogengine.ui.xap"/"><%Silverlight.xbap%>"/>   // where <%Silverlight.xbap%> is location of silverlight xbap
    <param name="onError" value="onSilverlightError" />
    <param name="background" value="white" />
    <param name="minRuntimeVersion" value="3.0.40818.0" />
    <param name="autoUpgrade" value="true" />
    <a href=""http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40818.0">http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40818.0" style="text-decoration:none">
      <img src=""http://go.microsoft.com/fwlink/?LinkId=161376">http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none"/>
    </a>
     </object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>



About the author

Brian Keating is a developer addicted to Microsoft Technologies.

Month List

Tag cloud

RecentComments

Comment RSS