Native apps for multiple platforms (iOS, Android and Windows) on a shared C# codebase.
- Xamarin.Forms: Apps that require little platform-specific functionality (Code sharing is more important than custom UI).
- Xamarin.iOS & Xamarin.Android: Apps with interactions that require native behavior (Custom UI is more important than code sharing).
-
Xamarin.Android: https://github.com/proyecto26/Xamarin/tree/master/src/android/App
A Xamarin.Android example using mocks.
-
Xamarin.Android & Xamarin.iOS https://github.com/proyecto26/Xamarin/tree/master/src/crossplatform/App
A template with a lot of examples of each platform.
Each type of project has its own structure:
Path | Explanation |
---|---|
./App.xaml |
Global resources in the app. |
./App.xaml.cs |
Extend the app. |
Path | Explanation |
---|---|
./MainActivity.cs |
Main Class. |
./Resources/layout/Main.axml |
Graphic Interface using XAML. |
./Components |
Add new features and third-party services. |
Path | Explanation |
---|---|
./ViewController.cs |
Main Class. We can configure alerts about Memory, Storage, etc. |
./Main.storyboard |
Create screens like default. |
./LaunchScreen.storyboard |
Boot screen. |
./Info.plist |
Permissions. |
./AppDelegate.cs |
Validate the status of the application to know when the application is active, running or finished. |
./Components |
Add new features and third-party services. |
There are some strategies for sharing code between platforms:
- Shared Asset Project (SAP): Files and source code that are combined at compile time.
- Portable Class Library (PCL): A DLL library that encapsulates common code and can be referenced from other projects.
A Xamaring Forms project summary.
The design of the views is usually developed in XAML:
<ContentPage xmlns="..." xmlns:x="..." x:Class="App.MainPage" Title="My App">
<Label Text="Hello World!" VerticalOptions="Center" HorizontalOptions="Center" FontSize="Large">
<OnPlatform x:TypeArguments="Text"
iOS="Hello iOS World!"
Android="Hello Android World!"
WinPhone="Hello Windows World!" />
</Label>
</ContentPage>
Also you can modify the views from classes:
if(Device.OS == TargetPlatform.iOS){
label.Text = "Hello iOS World!";
}
A Xamarin Android project summary.
Qualifier | Description |
---|---|
MCC and MNC | Mobile Country Code and Mobile Network Code. Example: mcc310-mnc026 (EEUU/T-Mobile). Check the list of codes here. |
Language | The language code and optionally the region code. Example: es-rCO (Spanish/Colombia with 'r' character as separator). |
Smaller width | The smallest width supported by the app. Example: sw320dp (Height and width of at least 320dp). |
Width available | The minimum screen width, this value may change as the device rotates. Example: w720dp (Width of at least 720dp). |
Height available | The minimum screen height, this value may change as the device rotates. Example: h720dp (Width of at least 720dp). |
Screen size | Size for which resources are allocated. Values: small/normal/large/xlarge. |
Screen aspect | It is based on the aspect ratio. Values: long/notlong. |
Screen orientation | Portrait (Vertical) and Landscape (Horizontal). Values: port/land. |
Dock mode | For devices in a Car Dock or Desk Dock. Values: car/desk. |
Night mode | Manage different versions for day and night. Values: night/notnight. |
Display pixel density | The number of pixels in a physical area of the screen. Values: ldpi/mdpi/hdpi/xhdpi/nodpi/tvdpi. |
Touch screen type | Specifies the type of touchscreen that a device can have. Values: notouch/stylus/finger (Non-touch screens, optical pencil or touch screens). |
Keyboard availability | The type of keyboard available. Values: keysexposed/keyshidden/keyssoft (Keyboard available, hardware keyboard or software keyboard). |
Main text input method | Types of hardware keys available. Values: nokeys/qwerty/12key (No hardware keys, qwerty keyboard available or 12-key keyboard hardware). |
Navigation key availability | When 5-way or d-pad navigation is available. Values: navexposed/navhidden (Available or unavailable). |
Main non-touch navigation method | Type of navigation available on the device. Values: nonav/dpad/trackball/wheel (Touch screen only, d-pad available, Trackball available or wheels available). |
Platform version (API Level) | The API level supported. Example: v11 (Level 11 - Android 3.0). |
//Find the layout
var viewGroup = Window.DecorView.FindViewById<ViewGroup>(Android.Resource.Id.Content);
var mainLayout = viewGroup.FindViewById<LinearLayout>(Resource.Id.main_content);
//Create an image
var headerImage = new ImageView(this);
headerImage.SetImageResource(Resource.Drawable.logo);
mainLayout.AddView(headerImage);
//Create a text area
var userNameTextView = new TextView(this);
userNameTextView.Text = GetString(Resource.String.UserName);
mainLayout.AddView(userNameTextView);
A Xamarin iOS project summary.
We can detect the current version of Android to validate the APIs that we can use and support old Android platforms (Android fragmentation):
if(Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop){
var builder = new Notification.Builder(this);
builder.SetCategory(Notification.CategoryMessage);
}
else{
new AlertDialog.Builder(this).SetMessage("Your Android version doesn't support...")
}
We can identify some compilation symbols for shared projects:
- MOBILE (Android and iOS platforms)
- IOS (Xamarin.iOS)
- ANDROID (Xamarin.Android)
- WINDOWS_UWP (Windows)
#if __ANDROID__
string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
#elif __IOS__
string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string libraryPath = Path.Combine(documentsPath, "..", "Library");
#else
string libraryPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
#endif
var path = Path.Combine(libraryPath, fileName);
Note: You can specify platform versions, for example:
__ANDROID_22__
. Also you can create your own conditional compilation symbols from Project Properties/Build section.
-
Enable Remote Login option on Mac:
System Preferences => Sharing => Remote Login (Configure access)
-
Connect to Mac:
Visual Studio => Tools => Options => Xamarin => iOS Settings => Find Xamarin Mac Agent
Note: A SSH key will be created and registered in the file authorized_keys on the Mac.
When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change.
Contributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated β€οΈ.
You can learn more about how you can contribute to this project in the contribution guide.
I believe in Unicorns π¦ Support me, if you do too.
Donate Ethereum, ADA, BNB, SHIBA, USDT/USDC, DOGE, etc:
Wallet address: jdnichollsc.eth
Please let us know your contributions! π
This repository is available under the MIT License.
Made with <3