MASA MAUI Plugin (六)集成个推,实现本地消息推送[Android] 篇

算法聆月人
• 阅读 1014

背景

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 桥来实现。 下图说明了此体系结构

MASA MAUI Plugin (六)集成个推,实现本地消息推送[Android] 篇

通常情况下,绑定 Android 库(.aar 或 .jar)文件绝非易事;通常它需要花费额外的精力来解决 Java 和 .NET 之间的差异导致的问题。 这些问题会使 MAUI无法绑定 Android 库,并在生成日志中显示为错误消息。

推送功能涉及到的内容非常多,接下来我们只开发最基础的功能,并对此做最精简配置。

开发步骤

一、下载个推Android SDK

个推账号的申请及应用的创建请参考官方文档(个推面向个人开发者,而且我们通过CID发送测试是免费的,无需充值和实名认证)。这里我们着重介绍集成的方法,个推官网的文档示例是使用Maven 方式集成,但是这种方式在MAUI当然无法实现,所以我们需要手动下载SDK对应的aar文件进行手动集成。

maven仓库地址为http://mvn.getui.com/nexus/co...

我们需要 gtsdk和gtc,分别下载最新的gtc-3.1.12.0.aargtsdk-3.2.13.0.aar

我是怎么知道需要使用这两个文件呢,因为我下载了官方的Demo然后使用maven集成后在 C:\Users\用户名\.gradle\caches\modules-2\files-2.1\com.getui 目录下载了这两个文件

MASA MAUI Plugin (六)集成个推,实现本地消息推送[Android] 篇

二、创建Android绑定库

新建一个项目:Masa.Blazor.Maui.Plugin.GeTuiPushBinding,项目模板选择 Android Java 库绑定

MASA MAUI Plugin (六)集成个推,实现本地消息推送[Android] 篇

在根目录创建Jars文件夹,并将下载的两个aar文件添加进去。添加进去的文件属性中,生成操作默认选择的是AndroidLibrary,如果不对请手动更正。

前方高能预警

右键生成这个项目,我们会看到很多编译警告,其中还包含6处错误。 MASA MAUI Plugin (六)集成个推,实现本地消息推送[Android] 篇

我们依次点击对应错误,进入生成的cs文件,这些文件位于obj\Debug\net7.0-android\generated\src

错误1和2对应Com.Getui.Gtc.Base.Crypt.CryptTools文件的DecryptEncrypt方法,这里Java.IO.OutputStream和InputStream类型都被转换为System.IO.Stream,导致本来两个签名不一致的方法被弄成了一样(更正的方法本文不做讨论,本Demo没有使用到这两个方法)索性将280行和134行的本来应该映射到OutputStream类型的DecryptEncrypt方法注释。

其他错误都是类型转换错误导致的没有实现接口,我们分别修改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

我们启动应用,并在个推平台下发一个测试推送

MASA MAUI Plugin (六)集成个推,实现本地消息推送[Android] 篇

Android推送功能涉及的内容非常多,不同的Android版本、不同手机厂商还有不同的功能和实现方式,例如vivo有特有的角标通知等。我们这里只演示了最基本的推送功能,其他高级操作,例如自定义接收推送服务事件,设置通知图标及样式,相应对应通知点击事件,离线推送功能等,如有需求后续介绍。


如果你对我们的开源项目感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们

  • WeChat:MasaStackTechOps
  • QQ:7424099
点赞
收藏
评论区
推荐文章
雷厉风行 雷厉风行
2年前
Mac程序员软件-Rider for mac(跨平台.NET IDE集成开发)永久版完美兼容版
JetbrainsRider是一个强大的跨平台.Net开发IDE,支持.NET,ASP.NET,.NETCore,Xamarin或Unity应用程序的开发,且与JavaScript,TypeScript,XAML,XML,HTML,CSS,SCSS,JSON和SQL等主流的语法兼容。
Stella981 Stella981
4年前
ReactNative集成个推消息推送
前言最近项目中需要集成消息推送功能,在以往的项目中都是使用的极光推送方案(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fjpush%2Fjpushreactnative),现在的公司安卓端使用的是个推消息推送,所以计划在本次使用RN重构项目的过
Stella981 Stella981
4年前
Laravel、Yii、ThinkPHP性能测试
主流PHP框架性能非权威测试作为一个PHP开发者,而且是初创企业团队的技术开发者,选择开发框架是个很艰难的事情。用ThinkPHP的话,招聘一个刚从培训机构出来的开发者就可以上手了,但是性能和后期代码解耦是个让人头疼的事情。不过很多第三方功能不需要自己写,众多大牛已经给铺好路了。用Laravel的话,传说写起来很爽扩展性也够,但是学习成
Stella981 Stella981
4年前
ReactNative自定义车牌号输入框及键盘实现
项目背景目前使用ReactNative技术重构公司的原生Android应用,很多场景是和公司的需求密切相关的,开发中也遇到不少问题。比如项目中使用的即时聊天解决方案是采用融云,推送采用的是个推方案。原生方面有融云提供的一整套解决方案,包括功能和UI,相对来说,只要进行集成就能轻松添加功能,但对于跨平台方案就需要自定义uI了,我的另一篇推文中也
Stella981 Stella981
4年前
Android 服务器推送技术
在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。在Android手机平台上,Google提供了C2DM(CloudtoDevi
Stella981 Stella981
4年前
4000余字为你讲透Codis内部工作原理
一、引言Codis是一个分布式Redis解决方案,可以管理数量巨大的Redis节点。个推作为专业的第三方推送服务商,多年来专注于为开发者提供高效稳定的消息推送服务。每天通过个推平台下发的消息数量可达百亿级别。基于个推推送业务对数据量、并发量以及速度的要求非常高,实践发现,单个Redis节点性能容易出现瓶颈,综合考虑各方面因素后,我们选择了Cod
Stella981 Stella981
4年前
Seata是什么?一文了解其实现原理
一、背景随着业务发展,单体系统逐渐无法满足业务的需求,分布式架构逐渐成为大型互联网平台首选。伴随而来的问题是,本地事务方案已经无法满足,分布式事务相关规范和框架应运而生。在这种情况下,大型厂商根据分布式事务实现规范,实现了不同的分布式框架,以简化业务开发者处理分布式事务相关工作,让开发者专注于核心业务开发。Seata就是这么一个分布式事
个推分享两个调优技巧,让TiDB性能提速千倍!
个推“大数据降本提效”专题,正是通过总结分享自身在大数据实战过程中的踩坑经验、调优技巧等,为从业人员开展大数据实践提供参考。本文是“大数据降本提效”专题的第三篇,将为大家分享个推通过调优,实现TiDB千倍性能提升的实战经验。个推与TiDB的结缘作为一家数据智能企业,个推为数十万APP提供了消息推送等开发者服务,同时为众多行业客户提供专业的数字化解决方案。
线上SQL超时场景分析-MySQL超时之间隙锁 | 京东物流技术团队
前言之前遇到过一个由MySQL间隙锁引发线上sql执行超时的场景,记录一下。背景说明分布式事务消息表:业务上使用消息表的方式,依赖本地事务,实现了一套分布式事务方案消息表名:mqmessages数据量:3000多万索引:createtime和statuss
详细解释云平台的可扩展性和灵活性
详细解释云平台的可扩展性和灵活性云平台的可扩展性指的是平台能够根据用户需求的变化,动态地扩展或缩减计算、存储和网络等资源的能力。这种能力可以帮助用户应对业务高峰和低谷,避免因资源不足或浪费而导致的性能瓶颈或成本过高。
布局王 布局王
7个月前
uniapp开发HarmonyOS NEXT应用之项目结构详细解读
昨天的文章介绍了使用uniapp跨平台鸿蒙应用时如何配置开发环境和运行调试项目,今天介绍一下uniapp项目目录的结构。可能对于从事移动开发的友友来说,uniapp的项目结构看起来有一些陌生,它更接近于前端项目,新建的uniapp项目结构是这样的:上面的两