We’re throwing a gigantic Windows Build welcome party!

Start Build off with a bang at our amazing Windows Build welcome party Tuesday, June 25th!

We know that many of the thousands of C# developers planning to attend Microsoft Build Developer Conference might be nervous visiting San Francisco – after all, it is the native home to both iOS and Android. So, Xamarin is hosting a gigantic Build Welcome Party, where we’ll help you and hundreds of your fellow developers prepare to blend in with the local population.

Make sure you get to San Francisco early on Tuesday, June 25th, so you can come hang out with us at Jillian’s Billiards, just steps away from the Moscone Conference center at 175 Fourth Street, starting at 7:00pm.  Relax with your C#-loving peers, enjoy an unlimited open bar and play some pool while you acclimate to the indigenous operating systems. The next day, you can walk into the Build keynote secure in the knowledge that your well-honed C# skills are valuable no matter where you choose to practice them. We’ve reserved the entire place, so the night is ours – bring your friends!

buildmonkey

Nat, Miguel, and the rest of the Xamarin San Francisco team are all looking forward to meeting you in person and talking about your favorite apps.

To keep you company at Build, we’ll also send you on your way with your own personal Xamarin monkey. You can reserve your place at the party, and your monkey, by using this form to tweet your RSVP, and we’ll hold your monkey at the door.

Your tweet will say: I’ll be kicking off Build with style and rocking C# on 2.5 billion devices at @xamarinhq’s #bldwin Welcome Party! http://xamar.in/r/build

jilliansmap-m
Directions to Jillian’s from the Moscone Center

Posted on April 2, 2013

The Xamarin Field Service App, a Cross-Platform Starter Kit

Screen Shot 2013-03-27 at 9.34.43 AM

Inspired by discussions with thousands of mobile developers building apps for field employees, we released a complete pre-built Field Service App for iPad, Android and Windows RT as part of Xamarin 2.0.

The source code is licensed under Apache 2.0, which allows developers to customize the app for deployment directly to field employees, or to cut and paste useful snippets of code into other mobile apps.  The app is also a great tool for learning cross-platform mobile development best practices.

The Field Service app shows how to set up a project to have shared, cross-platform code that runs on all three platforms and then shows how to create high fidelity, native user experiences that are true to the nature of each device operating system.   Check out this video to see the app in action.

Some of the techniques used in this app include:

  • use of the MVVM pattern to split the core of the app and the presentation layer, which demonstrates how to structure apps to look great on each platform

  • use of the Xamarin.Mobile library to access the camera in a cross-platform way and to improve code sharing on the backend

  • integration of the Signature Pad component from the Xamarin Component Store to collect signatures

  • use of SQLite for storage on Android, iOS and Windows

Increasing field employee productivity is one of the top app use cases in enterprise mobility today.  The most successful field apps are those that embrace BYOD by being available on all major platforms, and that also deliver a great, native user experience.

Download Xamarin today, and go from zero to native cross-platform mobile development in no time with this Xamarin pre-built Field Service App.

Posted on March 28, 2013

Producing Better Bindings #4: Signatures

This blog post is about producing better bindings of Objective-C libraries for Xamarin.iOS and Xamarin.Mac. Read the series introduction to get a better idea why this is important and how it can save you time and headaches.

What can go wrong ?

Binding a selector using a correct [Export("")] attribute is only half the job. The .NET method signature must match the one defined in Objective-C. Xamarin.iOS does some magic, like converting string and NSString, but you still need to be careful. The most common mistakes are:

  • signed/unsigned types: this is often minor and you might want to disable the check on some (or even all) of them. CLS compliance means .NET developers prefer signed over unsigned integers (except for byte). Apple APIs often use unsigned integers when a number cannot be negative. For example:
@property (nonatomic, readwrite) NSUInteger loops;
[Export ("loops")]
int Loops { get; set; }
// should be uint, easier (less casting) if an int
  • wrong types: a common case is a missing ref when the Objective-C API requires a pointer to a value, not the value itself. For example:
-(void) sphericalRadius:(float*) r zenith:(float*) zenith azimuth:(float*) azimuth;
[Export ("sphericalRadius:zenith:azimuth:")]
void GetSphere (float radius, float zenith, float azimuth);
// wrong, references to float (ref float) should have been used
  • wrong size: this often happens on structures, but it can also occurs when a type name is misleading (e.g. long is 32 bits in Objective-C, at least for 32bits archs like i386 and ARM, while it is 64 bits on .NET) or when common usage differs, as in this case:
-(id) initWithDuration:(ccTime)duration red:(GLshort)deltaRed green:(GLshort)deltaGreen blue:(GLshort)deltaBlue;
[Export ("initWithDuration:red:green:blue:")]
IntPtr Constructor (float duration, byte red, byte green, byte blue);
// wrong, we're almost wired for bytes when seeing RGB but it does not have to be!

What can we check for ?

Quite a lot. It’s possible to get an encoded signature for selectors. The earlier loops selector, for example, would return the “I8@0:4” string value.

From it we can extract the return value (I an unsigned int) and all the parameters, e.g. self (@) and the selector (:) are always present and there are no other parameters since it’s a getter. We also get the size of the parameters, which can be compared to the size of the managed types used—and they should always match!

Using all of the above, we can test pretty closely if an Objective-C signature matches the defined .NET signature. Simple? Not quite.

Objective-C encoding for structures is quite detailed. However, their internal names won’t match the one being used in your bindings. You’ll need to help the fixture to map them by overriding its IsValidStruct method.

Why is this important ?

Signature mistakes are dangerous. Some APIs might (appear to) work, others will crash immediately (bad) or the crash will occur later (worse) because they will mess up the stack and cause memory corruption. Debugging such issues can be very time consuming, so your time is well invested in using this fixture.

How to fix issues ?

Fixing the .NET signature to match it’s Objectice-C peer is the most common case. The failure will tell you which parameter (or the return value) looks wrong. You have to confirm/fix this using the library’s documentation and/or it’s header files.

One notable (and uncommon) exception is the use of a variable number of arguments (e.g. var_list in Objective-C, params in C#). They are not part of the encoded signature, so once confirmed you can skip them by overriding the Skip(Type,MethodInfo,string) method.

As discussed earlier, you might also want to override Check(char,Type) to skip the signed/unsigned differences for integer types.

What’s missing ?

The encoded signature is not perfect. All NSObject parameters are encoded as ‘@‘ so we cannot detect if an NSData should have been used instead of NSDate. Since all objects are pointers, they all will be the same size (IntPtr.Size) so this will also not be noticed by the size check. Typos/errors, even if less common, are still possible.

This blog post concludes the five-part series on building better bindings for Xamarin.iOS and Xamarin.Mac. Thanks for reading!

Read the rest of the series:

Discuss this post on the Xamarin forums

Posted on March 26, 2013

Producing Better Bindings #3: Selectors

This blog post is about producing better bindings of Objective-C libraries for Xamarin.iOS and Xamarin.Mac. Read the series introduction to get a better idea why this is important and how it can save you time and headaches.

What can go wrong ?

Binding selectors is largely done using the [Export("")] attribute. As such, it shares a lot of similarities with the [Field] attribute—including the main cause of issues: typos.

In fact, the all time favorite issue is likely the infamous missing colon at the selector’s end (when parameters are used). For example, the following Objective-C method declaration:

-(void) step: (ccTime) dt;

should be translated to:

[Export ("step:")] // without the ':' this method won't work
void Step (float deltaTime);

However, it is also a common error to forget the [Static] attribute when a selector starts with a plus sign (+) character. The Objective-C static method declaration:

+(id) actionWithDuration:(ccTime)duration angle:(float)angle;

should be translated to:

interface CCRotateBy {
	[Static] // easy to forget, unusable without it!
	[Export ("actionWithDuration:angle:")]
	CCRotateBy Create (float duration, float deltaAngle);
	// ...
}

A less common issue is wrong builds. Your bindings might include selectors that are not part of the native library binary (e.g. missing source files, wrong defines…) even if they are documented and present in the header files.

Finally, some library updates might introduce breaking changes, including removed API entry points. If you only bind new APIs, you might be shipping old, missing, APIs without realizing it.

What can we check for ?

Quite a few things, including:

  • Static selectors: One test case checks every type, inheriting from NSObject, inside your assembly and tries every [Export] on static methods. If respondsToSelector: returns false then an error is raised.
  • Instance selectors: A similar test case does the same for every instance method and tries all [Export] selectors. If instancesRespondToSelector: returns false then an error is raised.
  • Missing setters: In general, we can only test what’s present. If something is missing then we have no way to test it. In this case we can stretch the limits to try to find some missing property setters. If a property has a getter Foo then we check if a selector exists with the default selector name, i.e. “setFoo:“. If this selector exists and the property does not have a setter then an error is raised.

Why is this important ?

The binding consumer expects public APIs to exist (i.e. not throw a missing selector exception) in the bound library. However, without testing every method/property bound you cannot be sure if they really exist or not outside your .NET assembly. You can avoid many headaches for yourself and other binding consumers in exchange for a few extra ‘:‘.

How to fix issues ?

Most cases are fixed by verifying the selector name. If it exists as-is then check if you’re not missing a [Static] attribute (or if you have one where none is needed). Again, the library’s documentation and/or header files should have all the information you need to fix them.

One quite important exception is the Objective-C Protocol References. The protocols are similar to .NET interfaces,  but not quite. The major difference is that many members are not, in Objective-C, required to be implemented. However, to create your bindings you might have to bind them inside a base class, without being sure every subclasses will provide them—not ideal, but the alternative would be worse.

To let the test run with those special cases, you can override the fixture‘s Skip(Type,string) method. E.g. for cocos2d test fixture I needed to consider two special cases:

	[TestFixture]
	public class BindingSelectorTest : ApiSelectorTest {
		protected override bool Skip (Type type, string selectorName)
		{
			switch (selectorName) {
			// CCRGBAProtocol
			case "doesOpacityModifyRGB":
			case "opacityModifyRGB:":
				switch (type.Name) {
				case "CCAtlasNode":
				case "CCLabelBMFont":
				case "CCLayerColor":
				case "CCMenu":
				case "CCMenuItemLabel":
				case "CCMenuItemSprite":
				case "CCMenuItemToggle":
				case "CCSprite":
					return true;
				}
				break;
			// CCTargetedTouchDelegate
			case "ccTouchMoved:withEvent:":
			case "ccTouchEnded:withEvent:":
			case "ccTouchCancelled:withEvent:":
			case "ccTouchesBegan:withEvent:":
			case "ccTouchesMoved:withEvent:":
			case "ccTouchesEnded:withEvent:":
			case "ccTouchesCancelled:withEvent:":
				return type.Name == "CCLayer";
			}
			return base.Skip (type, selectorName);
		}
	}

Another less common issue is that some types might act as a proxy to another type. In such cases, respondToSelector for foo might return false but calling it will work. That behaviour is rarely documented and it’s often best to write some traditional unit tests for such cases. The same override can be used to exclude this case too.

What’s missing ?

With the notable exception of most missing setters, the test fixture cannot detect missing selectors: only the [Export("")] selectors are validated.

Read the rest of the series:

Discuss this post on the Xamarin forums

Posted on March 25, 2013

Producing Better Bindings #2: Fields

This blog post is about producing better bindings of Objective-C libraries for Xamarin.iOS and Xamarin.Mac. Read the series introduction to get a better idea why this is important and can save you time and headaches.

What can go wrong ?

Maybe nothing! Not every library use fields, e.g. there are no fields in the Cocos2D library. However, you should keep this fixture in your binding test suite. If any fields are added in the future, then they’ll be tested without further work.

For bindings that use fields, the most common issue will be typos. The compiler cannot validate the strings, so typos are sadly common, e.g. an extra space [Field ("MyField ")].

You’ll also find that some fields might not really exist anymore in a newer version of the bound library, so it’s a handy check to have when updating a native library in your existing bindings.

What can we check for ?

When an NSString is defined, it’s generally because it has a non-null value. OTOH if any error (e.g. a typo) is made in the attribute, then you’re likely to get a null result. This makes a great and easy condition to test.

Why is this important ?

You might be giving null values to some APIs that will either not work as you expect or will crash. Of course you won’t notice it before you actually use that specific field. This is not something that is easy to debug without looking at the binding source code —something most consumers would prefer to avoid.

How to fix issues ?

In most cases, it’s simply fixing the typo inside the [Field("")] attribute based on the library’s documentation and/or header files.

You might find some cases where a field is really meant to be null. If this happens, you may skip the test for an entire type or a single property by overriding either Skip(Type) or Skip(PropertyInfo) methods.

	[TestFixture]
	public class BindingFieldTest : ApiFieldTest {
		protected override bool Skip (Type type)
		{
			// uncommon - but you could skip an entire type from being checked
			if (type.FullName == "BrokenType")
				return true;
			return base.Skip (type);
		}
		protected override bool Skip (PropertyInfo p)
		{
			// if some fields are meant to be null you can exclude them here
			switch (p.Name) {
			case "FieldKnownToReturnNull":
				return true;
			default:
				return base.Skip (p);
			}
		}
	}

What’s missing ?

The current implementation only validates fields that return NSString. With other types, such as integers and floats, it’s not easy to distinguish between valid and invalid based on their value. The information required to query the symbol (e.g. dlsym) is not available, using reflection, in the assembly (i.e. the attribute is used to generate code).

Also, and just like constructors, we cannot detect missing fields. You might want to grep header files (.h) and your binding files to see if number matches.

Read the rest of the series:

Discuss this post on the Xamarin forums

Posted on March 22, 2013

Producing Better Bindings #1: Constructors

This blog post is about producing better .NET bindings for using Objective-C libraries on Xamarin.iOS and Xamarin.Mac. Read the series introduction to get a better idea of why this is important and how it can save you time and headaches.

What can go wrong ?

It’s not immediately obvious, but Objective-C object initialization (init... methods) differ quite a bit from .NET constructors. Those differences have an important impact on bindings.

In Objective-C:

  • init... can return nil, in fact they generally do so if initialization fails;
  • init... methods are inherited, the base types init... method will be used;
  • Documentation (at least Apple’s) is rarely clear on wether you can (or can’t) call the default init to create an instance. This might work, return nil, throw or crash.

In .NET:

  • Constructors cannot return null. If the instance cannot be created, it will throw an exception;
  • Constructors are not inherited, they must be re-defined in each type (and call the base type). This makes it clear if a constructor is available or not, except for one case…
  • A default (no parameters) public constructor is added to (non-static) types unless you define one with less visibility (e.g. private).

Mixing those two different feature sets can create some weird cases. E.g.

  • If init... returns null then a constructor will create a managed instance with an IntPtr.Zero handle. That instance won’t be usable, except as a null value;
  • You can end up with a default constructor for Objective-C types that should not be created, e.g. abstract, singletons… but they can partially and unpredictably work (hard to spot);
  • You might be missing some constructors because you overlooked the base class init.... That might make some types impossible to create from a .NET application;

What can we check for ?

A test can reflect each NSObject-derived type from a binding assembly, find its default constructor, create an instance and validate that it’s Handle property is valid (not IntPtr.Zero). That would spot:

  • Types that are abstract (and should not be created);
  • Types that are singleton (and should be used differently);
  • Types that do not support being created using the default “- (id)init” signature.

In addition, the same test can also check that the ToString method is implemented correctly. The default NSObject.ToString() implementation calls the description selector. That call might crash due to uninitialized native members—even if the instance is fine.

Finally, by calling the Dispose() method, the test also ensures that the type can be released correctly. If all of this can be done without failure then the type is likely consumable.

Why is this important ?

Default constructors will be shown in your IDE code completion and binding consumers will assume it’s a valid way to create an object instance. If it results in an invalid/unusable instance—or worse, a crash—then it makes the binding much more complex to use (e.g. remember what constructors are valid). In other words, any public API should be safe to call.

The ToString method is used by the debugger to show you a description of an object (e.g. in the watch pad). If calling ToString causes an application to crash, then debugging your application will cause it to crash. This can be hard to diagnose (and often irreproducible) because it will be the debugger that will cause this, depending on it’s state (e.g. watches), not the code that’s being executed.

The Dispose check does not often fail. When it does, it generally means that creating an instance has special rules (hopefully documented) or that something else is invalid (somehow a bad instance was created but has not failed the previous checks). One should be aware of such special requirements before using the type. You might be able to document it, or even hide it from the binding consumers.

How to fix issues ?

In most cases, the test will fail (or crash) because a handle is invalid. The library’s documentation (or source code, when available) will often tell you if there are other ways to create an instance of that particular type. In general, the fix will be to add the [DisableDefaultCtor] attribute to such types in your bindings. For example:

	[BaseType (typeof (CCActionInterval))]
	[DisableDefaultCtor] // Objective-C exception thrown.  Name: NSInternalInconsistencyException Reason: IntervalActionInit: Init not supported. Use InitWithDuration
	interface CCSequence {
		// ...
	}

There might be cases where creating an instance only works if some other action has been done previously (e.g. initialization). You can add such steps in your fixture constructor.

	[TestFixture]
	public class BindingCtorTest : ApiCtorInitTest	{
		public BindingCtorTest ()
		{
			// fictional example where binding won't work without
			// some specific initialization code
			MyLibrary.SharedConfiguration.Server = "127.0.0.1";
		}
	}

Creating some types might also require something external to the library (e.g. specific hardware or an API key). In such cases, you might need to skip the type by overriding the fixture’s Skip(Type) method and returning true for this type.

	[TestFixture]
	public class BindingCtorTest : ApiCtorInitTest	{
		public BindingCtorTest ()
		{
			// fictional example where binding won't work without
			// an API key
			MyLibrary.ApiKey = "foo";
		}
		protected override bool Skip (Type type)
		{
			// fictional example where a specific type won't work without
			// some some hardware device, you can skip those
			if (type.FullName == "MyLibrary.MyDevice")
				return true;
			return base.Skip (type);
		}
	}

If ToString fails, but the instance is valid, then you might want to add a manual override for it (e.g. inside Extra.cs), providing some useful data about the state or simply returning it’s fully qualified name.

	public partial class MyTypeCrashingOnDescription {
		// when `description` fails we prefer returning something useful (not null)
		// so the debugging session won't be interupted by a native crash
		public override string ToString ()
		{
			return GetType ().FullName;
		}
	}

If an instance cannot be disposed, then you should override the fixture’s Dispose(NSObject,Type) method and keep a reference to it. That will allow the test execution to continue.

	[TestFixture]
	public class BindingCtorTest : ApiCtorInitTest	{
		static List do_not_dispose = new List ();
		protected override void Dispose (NSObject obj, Type type)
		{
			switch (type.FullName) {
			// this crash the application after test completed their execution so we keep it alive
			case "MyLibrary.MyTypeThatCannotBeDisposed":
				do_not_dispose.Add (obj);
				break;
			default:
				base.Dispose (obj, type);
				break;
			}
		}
	}

Most of the above (except adding [DisableDefaultCtor]) are uncommon, but useful to know. For example, the fixture implementation to test Cocos2d did not require any overrides (besides specifying the Assembly to test).

What’s missing ?

There’s no easy way to test for missing constructors, e.g. the ones available in base classes that are not inherited. That would require static analysis (not introspection) in order to be useful. Keep an eye on types where you add [DisableDefaultCtor]. If they do not have any Constructor methods, then they might be expected to use the base type init... methods. Quite a few constructors were added to Cocos2d.

Finally, to make it easier to review untested types—those without a default constructor—you can set the LogUntestedTypes property to true and re-execute the tests.

	[TestFixture]
	public class BindingCtorTest : ApiCtorInitTest	{
		public BindingCtorTest ()
		{
			// Useful to know which types are being skipped for lack of a default ctor
			LogUntestedTypes = true;
		}
	}

Read the rest of the series:

Discuss this post on the Xamarin forums

Posted on March 20, 2013

Producing Better Bindings for Xamarin.iOS and Xamarin.Mac

For .NET developers with some knowledge of Objective-C, writing .NET bindings for Objective-C libraries is not very hard. It is well documented and several complete examples are available to guide you.

Still, the process can be quite error-prone. Many typos and mistakes will only be caught at runtime and only when you use the specific API affected. Due to those issues, many bugs won’t be found for days, months or even years after you released your bindings.

Full test coverage would considerably reduce the number of bugs—but it would require 2x-5x time to create the bindings. That might not be the best way to invest your time into a project. Fortunately, the Objective-C runtime has introspection APIs available, even if limited compared to .NET. That makes it possible to run generalized test cases without knowing the purpose for which the bindings were intended.

This blog series will go through different test fixtures to help test Xamarin.iOS or Xamarin.Mac Objective-C bindings. With a bit of customization (you need to inherit from them and override a few methods) you will be able to spot some of the most common binding mistakes. While this is not a pain-free approach, you should be able find a lot of bugs in a very short amount of time.

Basics

All the test fixtures inherit from a single base class: ApiBaseTest.cs. It defines an Assembly property that you’ll need to override to point to your binding assembly. E.g. to test the Cocos2D bindings you would need this piece of code:

protected override Assembly Assembly {
     get { return typeof (CCAccelAmplitude).Assembly; }
}

This base fixture also allow us to cheat a bit by introducing two properties that you should, when you start testing, set to true in your own inherited fixtures. Once every failure has been fixed it’s safe to turn them off—and let the test fixtures behave like any others.

ContinueOnFailure = true;

This property will avoid stopping the test execution when failing an assertion. Doing otherwise would require too many “build / run / debug” cycles to go through dozens (or thousands) of types, methods or parameters. You’ll often be able to fix several issues between builds, progressing a lot quicker toward your goal.

LogProgress = true;

It’s likely you’ll hit bugs that will crash your testing process—for example, a bad API signature can corrupt the stack. When that occurs, you want to know what was being executed. Turning on the LogProgress property will give you this information (and a lot of lines in your console).

Even with those properties to help you, there will be failures that require a bit more knowledges to solve—ways to ignore (special cases) or when the test fixture requires a bit of extra help to get the most of out them. To help you get down to zero failures, each test fixture will be documented in it’s own blog entry. Stay tuned for the rest of the series!

Read the rest of the series:

Discuss this post in the Xamarin Forums

Posted on March 19, 2013

Xamarin previews C# async on iOS and Android

One of the most requested features we’re hearing at Xamarin these days is support for async in C#.  Today, we are very happy to announce the first preview of async support in our products. The code is available now on the Alpha channel in the Xamarin Updater.

First-class support for asynchronicity is a powerful and brilliantly simple language tool.

  • It makes it easy to write responsive user interfaces, which in turn makes for delighted users
  • It makes complex workflows, with their error handling, natural to write.  This translates into proper error messages and proper program recovery; and finally
  • By letting the compiler do the work for you, it eliminates bugs from your code, and enables you to enjoy your work and to focus on what really matters for your application.

This is best seen by watching it in action.  See how this piece of old C# code turns into a piece of beauty.  Error handling and dealing with the UI thread go from painful to trivial. To learn more about how to use async start from this article.

While asynchronicity is the main theme of this release, we also pack two years of improvements to the Mono runtime spread over more than 7,000 individual commits that are now available to Android, Mac and iOS users.

Among the new features:

  • New .NET 4.5 APIs
  • iOS generic compiler improvements, fewer “Attempting to JIT compile method” errors.
  • Async-friendly System.Net.Http
  • Improved debugging stack
  • Variant and contravariant interfaces

New .NET 4.5 APIs: We’re bringing in a huge refresh to the class libraries. Our current products have historically been an extension of the Silverlight API. Now our class libraries are based on the .NET 4.5 profile.

iOS Batch Compiler Improvements: On iOS we now generate “shareable code” for value types, a truly revolutionary innovation in code generation technology. In practical terms this means that a whole range of code that previously crashed with a “Attempting to JIT compile method” now works. While we still provide the high-performance, and fine-tuned generic code that we can infer –for example direct calls to a method Foo<T>(T x)– we generate a value-type shared version of Foo<T>(T x) that can be used in dynamic cases that previously failed. What was once a dream, is now a reality.

New System.Net.Http: This is such a delightful async API that it deserves to be called out on its own. This is an async-friendly HTTP stack, and makes building clients apps trivial We now ship System.Net.Http, a new, async ready, HTTP stack that have been designed from the bottom up to work well with the new version of the language.

Debugging Upgrades: Our debugger has received a lots of small improvements and fixes, they add up and you will notice how all the small details now work more smoothly than before.

Variance and Contravariance: With the upgrade to our class libraries, we have introduced support for variance and contravariance in the core types. While this change enables a whole class of new code to be written, it also means that some old code that was not covariant/contravariance friendly will have to be adjusted.

Please use the forums to tell us all about your experiences with async and the other goodies in this release.

Posted on March 11, 2013

Announcing Evolve Training Schedule and Certified Developer Program

Screen Shot 2013-02-18 at 12.23.46 PM

We here in the Xamarin Edu team are super excited to announce the finalized training tracks and schedule for Evolve 2013. We have been working non-stop to prepare two parallel tracks that provide in-depth Xamarin and mobile training that you will not find anywhere else, taught by the folks that built the product.

We are also providing free certification tests for Xamarin’s new Certified Developer program for those that have signed up for training at Evolve. The program offers three different certification levels:

Xamarin Certified Developer Badges

  • Xamarin Certified Mobile Developer – Cross platform mobile certification for those using Xamarin to build iOS, Android, and Windows Phone applications.
  • Xamarin Certified iOS Developer – Mobile certification for those using Xamarin to build iOS applications.
  • Xamarin Certified Android Developer – Mobile certification for those using Xamarin to build Android applications.

Xamarin skills are increasingly in demand – make sure the market knows that that you represent top Xamarin talent. Evolve attendees will be the first to take advantage of these certification programs, which will be available to the entire developer community shortly after the conference.

The training itself is split into two tracks, Fundamentals, and Advanced:

Fundamentals Track

Designed to lay the foundation of core mobile development and then cover key concepts in more depth, this track is for those that are new to mobile development or still in the early stages of understanding it.

Focusing on getting you quickly up to speed on both Android and iOS development in day one, it begins with the basics of mobile development, introducing the toolchain, building first apps, and deployment and debugging. Then in day two we take a cross platform look at the core SDK frameworks, providing you with guidance and best-practices for accessing the cloud, caching data locally, working with components, building performant applications, memory management, and more.

Advanced Track

Intended for those that have a solid understanding of the core mobile development fundamentals already, and want to learn frameworks and concepts in more detail.

The advanced track takes a cross platform look at notifications, backgrounding/multitasking, touch, maps, graphics, and animation, as well as delving into advanced cross platform development and patterns. Additionally, it looks at platform-specific application concepts such as fragments in Android, and collection views in iOS. Finally, just like the fundamentals track, we will examine building performant applications and advanced memory management.

Choosing Your Track

You can choose between the Fundamentals and Advanced tracks when you register for Evolve. If you’ve already registered, please log in to Eventbrite to update your registration with your track selection or email your selection to evolve@xamarin.com.

No matter which track you choose, you can expect an intense two days of high quality training given by the experts at Xamarin.

We can’t wait to see you there!

Register Now

Posted on March 7, 2013

Xamarin 2.0 Seminar

Thanks to everyone who joined me and Miguel yesterday for our live Xamarin 2.0 webinar. For those of you that missed it or want to watch it again, the recordings and slides are now available.

You can view the video:

You can browse the slides here:

Here are some additional resources to learn more:

We’d love to hear (@xamarinhq, or hello@xamarin.com) about your cool Xamarin 2.0 apps!

Posted on March 6, 2013