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事件中添加我们的初始化方法
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目录下新建推送服务类DemoPushService
using 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中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。 主要作用是:是否支持其它应用调用。 处于安全考虑我们这里设置为Exported = false,代表不支持其他应用调用。
修改AndroidManifest.xml文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true" android:label="@string/app_name" android:usesCleartextTraffic="true" xmlns:tools="http://schemas.android.com/tools"> <service android:name="Masa.Blazor.Maui.Plugin.GeTuiSample.DemoPushService" android:exported="false" android:label="PushService" android:process=":pushservice"/> <meta-data android:name="GETUI_APPID" tools:replace="android:value" android:value="这里填你在个推的APPID" /> </application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> </manifest>
我们在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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Lakehouse系列 | StarRocks支持Apache Hudi原理解析
作者:王日宇,StarRocks Active Contributor,阿里云高级研发工程师 近年来,随着大数据分析技术的进步,大量业务场景对数据仓库的实时性提出了更高的要求,Lakehouse 架构逐渐被各大公司熟悉和接受,Apache Hudi(以下简称 Hudi)、Apache Iceberg(以下简称 Iceberg)、Delta Lake 都被看成是下一代数据湖的解决方案,并被称为数据湖技术三剑客。 StarRocks 作为当前最流行的 OLAP 分析引擎之一,阿里云EMR OLAP 团队与 StarRocks 社区在 2021 年就开始合作,共同设计并实现了 StarRocks Connector 框架,用于统一外部数据源的接入分析,并且基于 Connector 框架完成了对 Hudi、Iceberg、Delta Lake 等主流数据湖表格式的接入。 本文围绕以 Hudi 为中心的数据湖生态,详细介绍 StarRocks 是如何实现快速分析 Hudi 数据湖格式,并给出完整的使用案例。 #01 StarRocks 支持 Hudi 的现状 — Hudi 提供了两种类型的表:...
- 下一篇
7 款殿堂级的开源 CMS(内容管理系统)
最近,有读者留言让我推荐开源 CMS。我本想直接回复 WordPress,但是转念一想我玩 WordPress 是 2010 年左右的事情了,都过去十年了,它会不会有些过时呢?有没有新的、更好玩的开源 CMS 呢? 开源项目这玩意儿,一想心就躁,看见手就痒。借着这股劲儿,今天我就给大家带来 7 款称得上殿堂级的开源 CMS,它们中有老当益壮的 WordPress(PHP)、国人开发的 Halo(Java)、玩法丰富的 Ghost(JavaScript)、企业级 CMS 的 Django CMS(Python)、星数最多的 strapi(JavaScript) 等等。 下面,我会根据功能将项目分为:传统 CMS 和 无头 CMS 两大类进行介绍,然后从 CMS 概念到具体项目的安装步骤,最后特点会用 粗体 醒目的标记出来,就算之前不知道 CMS、不会编程的读者,也可以放心地阅读。相信你看完这篇文章就会知道:什么是 CMS、什么是无头 CMS、它们能用来做什么,甚至可以头头是道地向别人介绍几款,让人眼前一亮的开源 CMS 呢! 闲话少叙,让我们直接开始今天的分享。 1. 传统 CMS CM...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19