崇信县门户网站领导之窗,高端建设网站,郑州响应式网站建设,沙漠风网站建设公司背景MAUI的出现#xff0c;赋予了广大.Net开发者开发多平台应用的能力#xff0c;MAUI 是Xamarin.Forms演变而来#xff0c;但是相比Xamarin性能更好#xff0c;可扩展性更强#xff0c;结构更简单。但是MAUI对于平台相关的实现并不完整。所以MASA团队开展了一个实验性项目…背景MAUI的出现赋予了广大.Net开发者开发多平台应用的能力MAUI 是Xamarin.Forms演变而来但是相比Xamarin性能更好可扩展性更强结构更简单。但是MAUI对于平台相关的实现并不完整。所以MASA团队开展了一个实验性项目意在对微软MAUI的补充和扩展项目地址https://github.com/BlazorComponent/MASA.Blazor/tree/main/src/Masa.Blazor.Maui.Plugin每个功能都有单独的demo演示项目考虑到App安装文件体积虽然MAUI已经集成裁剪功能但是该功能对于代码本身有影响届时每一个功能都会以单独的nuget包的形式提供方便测试现在项目才刚刚开始但是相信很快就会有可以交付的内容啦。前言本系列文章面向移动开发小白从零开始进行平台相关功能开发演示如何参考平台的官方文档使用MAUI技术来开发相应功能。介绍鉴于现在运营需求的增强消息推送在Android开发中应用的场景是十分常见如电商的活动宣传、资讯类产品进行新闻推送等等所以关于这个功能我就不过多介绍了。面向海外推送业务MAUI有一些集成Google firebase或其他运营商的可用的示例和绑定库可用但是国内用户无法使用这些对于国内比较常见的例如极光、个推等也没用对应的MAUI或者Xamarin的SDK可用本人联系过官方也无法提供任何技术支持。但是这样的困难是无法难倒MASA的开发人员的所以在各方压力的鞭策下有了本文本文以“国内服务提供商个推(https://www.getui.com)的Android 原生SDK”为例提供Android原生代码到MAUI代码的绑定及实现方式。思路Android 的第三方库生态系统非常庞大。正因为此使用现有的Android库通常比创建一个新的库更合理。其实早在Xamarin的时代微软已经提供了Android绑定库(Xamarin)这个项目实现原理为创建一个绑定库该库使用C# 包装器自动包装库以便通过C# 调用来调用Java 代码通过使用托管可调用包装器 (MCW) 实现绑定。MCW 是一个JNI 桥在托管代码需要调用Java代码时会使用它。托管可调用包装器还支持对Java类型进行子类化以及覆盖Java类型的虚拟方法。同样每当 Android 运行时 (ART) 代码需要调用托管代码时它都会通过另一个称为 Android 可调用包装器 (ACW) 的 JNI 桥来实现。 下图说明了此体系结构通常情况下绑定 Android 库.aar 或 .jar文件绝非易事通常它需要花费额外的精力来解决 Java 和 .NET 之间的差异导致的问题。这些问题会使 MAUI无法绑定 Android 库并在生成日志中显示为错误消息。推送功能涉及到的内容非常多接下来我们只开发最基础的功能并对此做最精简配置。开发步骤一、下载个推Android SDK个推账号的申请及应用的创建请参考官方文档个推面向个人开发者而且我们通过CID发送测试是免费的无需充值和实名认证。这里我们着重介绍集成的方法个推官网的文档示例是使用Maven 方式集成但是这种方式在MAUI当然无法实现所以我们需要手动下载SDK对应的aar文件进行手动集成。maven仓库地址为http://mvn.getui.com/nexus/content/repositories/releases/com/getui我们需要gtsdk和gtc分别下载最新的gtc-3.1.12.0.aar和gtsdk-3.2.13.0.aar我是怎么知道需要使用这两个文件呢因为我下载了官方的Demo然后使用maven集成后在C:\Users\用户名\.gradle\caches\modules-2\files-2.1\com.getui 目录下载了这两个文件二、创建Android绑定库新建一个项目:Masa.Blazor.Maui.Plugin.GeTuiPushBinding项目模板选择Android Java 库绑定在根目录创建Jars文件夹并将下载的两个aar文件添加进去。添加进去的文件属性中生成操作默认选择的是AndroidLibrary如果不对请手动更正。前方高能预警右键生成这个项目我们会看到很多编译警告其中还包含6处错误。我们依次点击对应错误进入生成的cs文件这些文件位于obj\Debug\net7.0-android\generated\src错误1和2对应Com.Getui.Gtc.Base.Crypt.CryptTools文件的Decrypt和Encrypt方法。这里Java.IO.OutputStream和InputStream类型都被转换为System.IO.Stream导致本来两个签名不一致的方法被弄成了一样(更正的方法本文不做讨论本Demo没有使用到这两个方法索性将280行和134行的本来应该映射到OutputStream类型的Decrypt和Encrypt方法注释。其他错误都是类型转换错误导致的没有实现接口我们分别修改4个OnArrived方法将方法的参数global::Org.Json.JSONObject修改为Java.Lang.Object并将方法的virtual标记更改为override只有一个参数的OnArrived方法需要将返回值也修改为Java.Lang.Object。4处全部更正之后再次生成就不会有报错了。注意不要选重新生成重新生成会将之前的修改覆盖掉。三、创建Demo项目新建一个MAUI Blazor项目Masa.Blazor.Maui.Plugin.GeTuiSample,添加对Masa.Blazor.Maui.Plugin.GeTuiPushBinding项目的引用1、初始化个推SDK个推SDK的初始化在MainActivity.OnCreate() 或MainApplication.OnCreate()方法中都是可以的我们这里在MainActivity中初始化。修改Platforms-Android-MainActivity.cs文件在MainActivity的OnCreate事件中添加我们的初始化方法public class MainActivity : MauiAppCompatActivity{protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);Com.Igexin.Sdk.PushManager.Instance.Initialize(this);var cid Com.Igexin.Sdk.PushManager.Instance.GetClientid(this);System.Diagnostics.Debug.WriteLine($cid:{cid});}}因为我们完成了绑定所以这里可以使用个推SDK中的Com.Igexin.Sdk命名空间下的PushManager来完成初始化初始化方法Initialize非常简单初始化后我们可以通过GetClientid方法拿到客户端ID方便我们后续在个推平台下发推送测试任务因为向特定CID发送推送是免费的。2、配置推送服务继续在Android目录下新建推送服务类DemoPushServiceusing Android.App;namespace Masa.Blazor.Maui.Plugin.GeTuiSample
{[Service(Process :pushservice, Exported false)]public class DemoPushService : Com.Igexin.Sdk.PushService{}
}我们只要实现一个继承自Com.Igexin.Sdk.PushService的类即可。注意服务必须指定Process “:pushservice”设置了这行代码系统就会为该服务创建新的进程DemoPushService 将运行在这个新的独立的进程它所在的apk依旧运行在原来进程。这样就实现了Android使用多进程。android:exported 是Android中的四大组件 ActivityServiceProviderReceiver 四大组件中都会有的一个属性。主要作用是是否支持其它应用调用。处于安全考虑我们这里设置为Exported false代表不支持其他应用调用。修改AndroidManifest.xml文件?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidapplication android:allowBackuptrue android:iconmipmap/appicon android:roundIconmipmap/appicon_round android:supportsRtltrue android:labelstring/app_name android:usesCleartextTraffictruexmlns:toolshttp://schemas.android.com/toolsserviceandroid:nameMasa.Blazor.Maui.Plugin.GeTuiSample.DemoPushServiceandroid:exportedfalseandroid:labelPushServiceandroid:process:pushservice/meta-data android:nameGETUI_APPID tools:replaceandroid:value android:value这里填你在个推的APPID //applicationuses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE /uses-permission android:nameandroid.permission.INTERNET /
/manifest我们在application 中添加了xmlns:tools“http://schemas.android.com/tools”作用是在下面的meta-data中使用tools:replace否则会出现Android 组件化集成合并AndroidManifest.xml 的问题添加android:labelstring/app_name也是为了避免合并问题。service表示我们添加的自定义推送类android:name的值必须写全命名空间。GETUI_APPID部分为个推应用对应的APPID我们启动应用并在个推平台下发一个测试推送Android推送功能涉及的内容非常多不同的Android版本、不同手机厂商还有不同的功能和实现方式例如vivo有特有的角标通知等。我们这里只演示了最基本的推送功能其他高级操作例如自定义接收推送服务事件设置通知图标及样式相应对应通知点击事件离线推送功能等如有需求后续介绍。如果你对我们的开源项目感兴趣无论是代码贡献、使用、提 Issue欢迎联系我们