MASA MAUI Plugin (六)集成个推,实现本地消息推送 [Android] 篇
背景
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 目录下载了这两个文件
:wink:
二、创建 Android 绑定库
新建一个项目:Masa.Blazor.Maui.Plugin.GeTuiPushBinding,项目模板选择 Android Java 库绑定
在根目录创建 Jars 文件夹,并将下载的两个 aar 文件添加进去。添加进去的文件属性中,生成操作默认选择的是 AndroidLibrary,如果不对请手动更正。
前方高能预警:sunglasses:
右键生成这个项目,我们会看到很多编译警告,其中还包含 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 事件中添加我们的初始化方法
因为我们完成了绑定,所以这里可以使用个推 SDK 中的 Com.Igexin.Sdk 命名空间下的 PushManager 来完成初始化, 初始化方法 Initialize 非常简单,初始化后我们可以通过 GetClientid 方法拿到客户端 ID,方便我们后续在个推平台下发推送测试任务,因为向特定 CID 发送推送是免费的。
2、配置推送服务
继续在 Android 目录下新建推送服务类 DemoPushService
我们只要实现一个继承自 Com.Igexin.Sdk.PushService 的类即可。
注意:服务必须指定 Process = ":pushservice",设置了这行代码,系统就会为该服务创建新的进程,DemoPushService 将运行在这个新的独立的进程,它所在的 apk 依旧运行在原来进程。这样就实现了 Android 使用多进程。 android:exported 是 Android 中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。 主要作用是:是否支持其它应用调用。 处于安全考虑我们这里设置为 Exported = false,代表不支持其他应用调用。
修改 AndroidManifest.xml 文件
我们在 application 中添加了 xmlns:tools="http://schemas.android.com/tools",作用是在下面的 meta-data 中使用 tools:replace,否则会出现 Android 组件化集成合并 AndroidManifest.xml 的问题,添加 android:label="@string/app_name"也是为了避免合并问题。 service 表示我们添加的自定义推送类,android:name 的值必须写全命名空间。 GETUI_APPID 部分为个推应用对应的 APPID
我们启动应用,并在个推平台下发一个测试推送
Android 推送功能涉及的内容非常多,不同的 Android 版本、不同手机厂商还有不同的功能和实现方式,例如 vivo 有特有的角标通知等。我们这里只演示了最基本的推送功能,其他高级操作,例如自定义接收推送服务事件,设置通知图标及样式,相应对应通知点击事件,离线推送功能等,如有需求后续介绍。
如果你对我们的开源项目感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们
WeChat:MasaStackTechOps
QQ:7424099
版权声明: 本文为 InfoQ 作者【MASA技术团队】的原创文章。
原文链接:【http://xie.infoq.cn/article/4f71f98a79d106d0cd62d14af】。文章转载请联系作者。
评论