我为什么选择Xamarin开发ios app安卓app

临岁之寒简书作者,转载

Xamarin是一项跨平台开发技术,之前是收费的,而且据说收费不菲,所以使用的人数比较少,在国内几乎无人问津。后来Xamarin被微软收购,现已免费开放,相信今后国内的使用人群会大幅地增长,一方面是因为免费的东西总是受人欢迎的,另一方面是Xamarin确实提供了一种比较强大的技术来支持跨平台开发(这里所指主要是Android和iOS上的开发,但其实不止于此)。

如今市面上号称可以提供跨平台开发的方案很多,比如React Native、PhoneGap、IONIC等,这些方面大多数都是基于HTML和JavaScript等技术实现的跨平台开发,在开发效率上自然是没话说,但是这些技术在性能上则逊色于原生的开发技术,而这恰恰是Xamarin得以生存的空间。

Xamarin声称可以获得不差于原生技术的性能,甚至在某些方面还有可能超越原生,我想这指的应该在是Android方面。我个人分析,原因可能是这样的。Xamarin使用C#进行开发(好像用F#也可以,不过我没有试过,据说F#也是一门非常不错,以后有时间会学习学习),C#默认方法是非虚的,即在子类中要重写方法,必须在父类中声明为virtual,而java默认所有方法都是虚方法,所以C#可以减少这方面的开销。其次的话,可能是微软毕竟也是老牌的IT公司,在系统软件方面的优化能力不容小觑,手里的黑科技也是不少,敢说这话应该是有底气的。当然这不是最重要的,只要能够在大多数情况获得近似于原生的性能,便已是非常不错了。

Xamarin主要有这么几项技术,Xamarin.Android、Xamarin.iOS和Xamarin.Forms,此外还有Xamarin.UWP、Xamarin.Windows、Xamarin.WinPhone等,但鉴于目前的市场占有率,后面几项可以暂时不去理会。

无论是Xamarin.Android还是Xamarin.iOS,本质都是对原生API做了一层C#的封装,因此在使用上与原生API会十分相似。这种封装会结合一些C#的语法特性,让开发者可以享受C#的语法糖。其中Xamarin.iOS是直接编译成ARM的二进制代码,因此执行效率肯定是非常高的。与此不同,Xamarin.Android被编译成中间语言,Xamarin在APK安装包中会包含一个mono的运行时,代码是在mono运行时和安卓本地的运行时上完成工作的,可想而知,这中间需要付出一些开销,而且会使安装包体积增大许多,但是考虑到设备的运行空间和存储空间都在高速增长,这也不能算是一个特别致命的缺点。

 

而Xamarin最为关键的技术还不是上面的两项,而是Xamarin.Forms。这项技术把IOS、android、UWP等平台的GUI进行了一统地抽象,开发者只需要写一套代码,编译器会在编译时将界面映射到原先控件上,从而获得原生平台的外观和性能。这种做法对于开发者应该是最喜闻乐见的,至少我是如此,相比于那种运行的虚拟层上的跨平台方式,这种做法性能损耗最少。当然,损耗小并不代表没有,官方也表示,Xamarin.Forms不适合用于开发图形界面操作特别复杂且频繁的应用。遇到这种情况,我们可以用Xamarin.IOS或Xamarin.Android来解决,也就是说Xamarin.Forms可以与Xamarin.IOS或Xamarin.Android在同一个项目结合使用。就以我准备使用Xamarin做输入法为例,根据Xamarin的特点,我用Xamarin.Forms来做输入法的设置界面,节省重复开发一套界面和业务逻辑的精力;而用Xamarin.IOS和Xamarin.Android来做输入法界面,以发挥最大的性能。目前从我实验的结果看,这个想法是可行的。虽然我最开始的想法是连输入法界面也用Forms来做,但发现在输入法界面无法使用Forms编写的界面(根据我的实验,Forms的界面应该只能用于制作Activity的界面,而不能做Service的界面,也可能是我不知道应该怎么实现),所以只好退而求其次,不过现在这个结果也是不错的,毕竟输入法界面本身对性能的要求就比较高,使用更接近原先代码的技术自然要好一些。

 

至此,我使用Xamarin的意图已经很明显了,就是想要用于它实现一个跨平台的移动输入法,具体的说是岁寒输入法。现在首先准备做的是IOS版的,然后再反过来重写Android版本,如果日后WindowPhone能有起色,并且开放第三放输入法的权限,那么基于这些代码实现一个WindowPhone就不会是一件再起炉灶又大费周章的事情。而如果使用原生语言开发的话,那每个平台都得重写一套代码,代价实在太大了,尤其对于个人开发者而言,不堪重负,这也是为什么Xamarin对我来说特别有吸引力的原因。

 

跨平台有跨平台的方便,自然也有跨平台的难处,Xamarin也仅仅提供了一种跨平台开发的手段而已,想要将这个手段发挥好,最大限度地实现对代码的重用,则需要更高的技巧和更多的思考。因此我不推荐初入开发门道的人选择Xamarin,在此之前,最好对其中一个平台及其开发过程有较深的理解。

 

Xamarin现在免费开放,显然这是微软的移动战略的一部分,由于自身操作系统在生态环境上的欠缺,迫使微软去推动跨平台技术的发展,以希望从其它平台上借势,从而反哺自身。在我看来,微软的移动操作系统不太可能会有转机,但这不意味着Xamarin作为一项技术没有希望。“有心栽花花不开,无心插柳柳成荫”的事情从不鲜见,只要抓住开发者这帮猢狲,微软这棵大树便不会倒,相信微软明白这个道理,作为开发者也不必过于担心微软过河拆桥。

这篇文章的目的不纯粹在于宣传Xamarin技术,毕竟微软没有给我发盒饭,但免费用着人家提供的技术,顺便给人家宣传宣传的好事也是值得做的。其实我主要是想在此立个字据,作为一个开始,日后尽可能地把开发过程中得到的经验和心得分享出来,既是一种记录,也是一种鞭策,以此自勉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/681211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何学习VBA_3.2.14:VBA中字符串的处理和判断函数

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的劳动效率,而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册,现在已经全部完成,希望大家利用、学习。 如果…

RestFul的认识

前言 RESTful 是 Representational State Transfer 的缩写,是一种软件架构风格,用于在网络上构建和整合应用程序。它基于 HTTP 协议,并定义了一组约束和规范,用于规范客户端和服务器之间的通信。 RESTful API 是遵循 REST 架构规…

【复现】Supabase后端服务 SQL注入漏洞_48

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 Supabase是什么 Supabase将自己定位为Firebase的开源替代品,提供了一套工具来帮助开发者构建web或移动应用程序。 Sup…

441. Arranging Coins( 排列硬币)

问题描述 你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。 给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。 问题分析 等差数列求和问…

【c++基础】国王的魔镜

说明 国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。 比如一条项链,我们用AB来表示,不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话,魔镜会把…

STM32面试相关问题

STM32面试相关问题: STM32的内核型号,主频,传感器和单片机总线类型,IIC,SPI,RS485UART数据帧项目中一些参数的设置 STM32 系统移植 ARM编译 常用的驱动编写方式 自己写过哪些方面驱动 其实如果问32的问题&#xff0c…

LeetCode、1268. 搜索推荐系统【中等,前缀树+优先队列、排序+前缀匹配】

文章目录 前言LeetCode、1268. 搜索推荐系统【中等,前缀树优先队列、排序前缀匹配】题目类型及分类思路API调用(排序前缀匹配)前缀树优先队列 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创…

车载诊断协议DoIP系列 —— DoIP应用(Application)需求

车载诊断协议DoIP系列 —— DoIP应用(Application)需求 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一…

实验1-4 输出三角形

本题要求编写程序&#xff0c;输出指定的由“*”组成的三角图案。 输入格式&#xff1a; 本题无输入 输出格式&#xff1a; 按照下列格式输出由“*”组成的三角图案。 **** *** ** * 示例代码&#xff1a; #include<stdio.h> int main() {int i4,j0;for(i4;i>0;i…

基于python深度学习的中文情感分析的系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【Chrono Engine学习总结】4-vehicle-4.2-车辆轨迹跟踪

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 0、Vehicle的driver driver在上一篇总结中有过介绍&#xff0c;【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念&#xff0c;这里进一步介绍。 对于一个…

部分意图分类【LLM+RAG】

在生成人工智能领域工作最有价值的事情之一就是发现新兴技术如何融入新的解决方案。 举个例子&#xff1a;在为北美顶级金融服务公司之一设计对话式人工智能助手时&#xff0c;WillowTree 的数据和人工智能研究团队 (DART) 发现&#xff0c;将意图分类与大型语言模型 (LLM) 结合…

推荐高端资源素材图库下载平台整站源码

推荐高端图库素材下载站的响应式模板和完整的整站源码&#xff0c;适用于娱乐网资源网。该模板支持移动端&#xff0c;并集成了支付宝接口。 演示地 址 &#xff1a; runruncode.com/tupiao/19692.html 页面设计精美&#xff0c;不亚于大型网站的美工水准&#xff0c;并且用户…

【STL】vector模拟实现

vector模拟实现 一、vector函数接口总览二、vector当中的成员介绍三、list模拟实现1、默认成员函数&#xff08;1&#xff09;构造函数1&#xff08;2&#xff09;构造函数2&#xff08;3&#xff09;构造函数3 2、拷贝构造函数&#xff08;1&#xff09;写法一&#xff1a;老式…

Educational Codeforces Round 2(远古edu计划)

A. 恶心模拟。。 模拟一下分类即可 数字类&#xff0c;数字0&#xff0c;或者都是数字 字母类&#xff0c;字母空的也是字母&#xff0c;有字母就是字母 #include<bits/stdc.h> #define INF 1e9 using namespace std; typedef long long ll; const int N2e59; strin…

键盘重映射禁用 CtrlAltDel 键的利弊

目录 前言 一、Scancode Map 的规范 二、禁用 CtrlAltDel 的方法及其缺陷 三、编程实现和测试 3.1 C 实现的简易修改工具 3.2 C# 实现的窗口工具 四、总结 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_59075481/article/details…

龙芯开启ssh服务——使用Putty连接

本文采用龙芯3A6000处理器&#xff0c;Loongnix操作系统。 为了能使用其他电脑远程操控龙芯电脑&#xff0c;需要打开loongnix的ssh服务&#xff0c;并在其他电脑里使用putty连接loongnix。 1 修改ssh配置文件 命令行输入&#xff1a; sudo vim /etc/ssh/sshd_config按下i插…

Dev-c++跑酷小游戏 1.0.0

本人六年级小学生第一次发博客&#xff0c;不太好请原谅&#xff0c;程序中会有一些变量没用到&#xff0c;可以删除&#xff0c;会有一些报错不影响运行&#xff0c;部分功能还在学习&#xff0c;暂时没写&#xff0c;以后肯定是会写的 #include<bits/stdc.h> #include…

洛谷: P1359 租用游艇(floyd)

题目描述 长江游艇俱乐部在长江上设置了 nn 个游艇出租站 1,2,\cdots,n1,2,⋯,n。游客可在这些游艇出租站租用游艇&#xff0c;并在下游的任何一个游艇出租站归还游艇。游艇出租站 ii 到游艇出租站 jj 之间的租金为 r(i,j)r(i,j)&#xff08;1\le i\lt j\le n1≤i<j≤n&…

Linux-进程信号

Linux进程信号 初步认识信号信号的存储结构信号的处理方式信号的产生硬件异常产生的信号核心转储sigset_t信号集信号集的操作函数对block表的操作对pending表的操作对handler表的操作信号的捕捉用户态和内核态 信号的处理过程可重入函数volatile关键字 初步认识信号 生活中有哪…