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 橋來實現。?下圖說明了此體系結構

b5e01408e2bfd0c411694c703b52aec8.png

通常情況下,綁定 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.aargtsdk-3.2.13.0.aar

我是怎么知道需要使用這兩個文件呢?因為我下載了官方的Demo然后使用maven集成后在
C:\Users\用戶名\.gradle\caches\modules-2\files-2.1\com.getui 目錄下載了這兩個文件😉
878a7f7cdeed13486ef59c5a195010f7.png

二、創建Android綁定庫

新建一個項目:Masa.Blazor.Maui.Plugin.GeTuiPushBinding,項目模板選擇Android Java 庫綁定

1df772a3a217b02d2996bc25a265a219.png

在根目錄創建Jars文件夾,并將下載的兩個aar文件添加進去。添加進去的文件屬性中,生成操作默認選擇的是AndroidLibrary,如果不對請手動更正。

前方高能預警!😎

右鍵生成這個項目,我們會看到很多編譯警告,其中還包含6處錯誤。

8c51b148fc36def0bbfec4ea78b8e1c1.png
我們依次點擊對應錯誤,進入生成的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"><serviceandroid: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

我們啟動應用,并在個推平臺下發一個測試推送

a6d5ebd36106643b069862b3fa45b8db.gif
Android推送功能涉及的內容非常多,不同的Android版本、不同手機廠商還有不同的功能和實現方式,例如vivo有特有的角標通知等。我們這里只演示了最基本的推送功能,其他高級操作,例如自定義接收推送服務事件,設置通知圖標及樣式,相應對應通知點擊事件,離線推送功能等,如有需求后續介紹。


如果你對我們的開源項目感興趣,無論是代碼貢獻、使用、提 Issue,歡迎聯系我們

237f25d53573a1c07c1bb22841bb7c8b.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281222.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281222.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281222.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第八天

配置文件 Vi /etc/fstab /dev/vg01/lv01 /dir01 ext4 defaults mount -a 掃描 使用交換空間 1.創建分區 2.mkswap /dev/sda創建交換分區 3.swapon /dev/sda啟用交換分區 Linux系統啟動過程 1、引導程序 BIOS自檢 &#xff08;硬件自檢&#xff09; 2、G…

iOS 通知中心(NSNotificationCenter)

NSNotificationCenter 在這里第一步和第二步的順序可以互換&#xff0c;一般樓主我喜歡先在需要發送消息的頁面發送消息&#xff0c;然后再在需要監聽的頁面注冊監聽。要注意的是不管是通知中心還是KVO都需要在頁面銷毀之前移除監聽。 注冊觀察者/*** 觀察者注冊消息通知*…

vue-router和react-router嵌套路由layout配置方案的區別

最近在學習react&#xff0c;在路由這一塊有點看不懂&#xff0c;第一感覺是靈活性很大&#xff0c;想怎么來就怎么來&#xff0c;但問題也來了&#xff0c;稍微復雜一點就GG了&#xff0c;不如vue的傻瓜式配置來的方便。 先說一下vue的路由配置方式&#xff0c;目錄結構如下&…

微軟加更.NET7中文手冊,都有哪些新亮點?

11月8號發布了.NET7&#xff0c;從底層性能改進&#xff0c;到上層API升級&#xff0c;讓.NET7綜合性能再度提升&#xff01;同時發布了最新的C#11&#xff0c;也帶來了很多小驚喜。如何快捷學習最新的.NET7和C#11&#xff1f;答案只有一個&#xff0c;微軟官方中文文檔&#x…

jquery對json的各種遍歷

http://caibaojian.com/jquery-each-json.html轉載于:https://www.cnblogs.com/pxffly/p/8442448.html

中級工程師之路

前言&#xff1a;之前在問答中問了一個問題 畢業半年感覺沒什么進步該怎么辦&#xff1f; 這個問題一直讓我感覺比計較焦慮。于是在一個關于面試經驗的博客中找到了一些靈感。就是通過問題進行學習&#xff0c;對自身的知識體系進行整理和補充。以問題作為切入點&#xff0c;不…

Vue在渲染函數createELement和JSX中使用插槽slot

Vue對于插槽有兩個專門的APIvm.$slots和vm.$scopedSlots&#xff0c;分別是普通插槽和作用域插槽&#xff0c;使用JSX語法或渲染函數的時候&#xff0c;定義插槽將使用上述兩個API。 渲染函數createElement 普通插槽和作用域插槽在定義上相差不大&#xff0c;但是在使用方法上…

.NET Conf China 2022 第一批講師陣容大揭秘!整個期待了!

目光看過來2022年12月3-4日一場社區性質的國內規模最大的線上線下.NET Conf 2022技術大會即將盛大開幕目前大會正緊鑼密鼓地進行中第一批大咖講師及主題已確定小編迫不及待想和大家分享分享嘉賓很大咖分享內容很硬核戳戳小手期待ing孔令磊維宏股份 首席架構師 十多年數控領域研…

2017 Material design 第二章第六節《富有創造性的定制方案》

六、富有創造性的定制方案&#xff08;Creative customization&#xff09; 動效可以應用于不同的對象尺寸和不同的環境&#xff0c;這有助于設計美感和功能的統一。 icon的類型系統icons可以有雙重功能。 產品icons應該設計得精致、美觀。 Icons 系統icons一個系統icon也許存在…

(十四)Java springcloud B2B2C o2o多用戶商城 springcloud架構- Spring Cloud構建分布式電子商務平臺...

通過Spring Cloud構建PC微信APP云服務的云商平臺系統&#xff0c;其中包括B2B、B2C、C2C、O2O、新零售、直播電商等子平臺&#xff0c;之前我們講了很多關于Spring Cloud的概念文章&#xff0c;從本節開始&#xff0c;我們會以分布式微服務電子商務平臺為案例&#xff0c;逐步給…

C# 隊列(Queue)

概述隊列&#xff08;Queue&#xff09;代表了一個先進先出的對象集合。當您需要對各項進行先進先出的訪問時&#xff0c;則使用隊列。當您在列表中添加一項&#xff0c;稱為入隊&#xff0c;當您從列表中移除一項時&#xff0c;稱為出隊。Queue 類的方法和屬性Count 獲取 Queu…

vue完全編程方式與react在書寫和運用上的異同

在構建html元素時&#xff0c;vue傾向于模板方式&#xff0c;而react則完全使用javascript的編程能力&#xff0c;但vue也具備完全編程的能力&#xff08;與react一樣使用JSX和createElement渲染函數&#xff09;。所以&#xff0c;當vue使用完全編程方式時&#xff0c;與react…

Solr 配置文件之schema.xml

schema.xml這個配置文件的根本目的是為了通過配置告訴Solr怎樣建立索引。solr的數據結構例如以下&#xff1a;document&#xff1a;一個文檔、一條記錄 field&#xff1a;域、屬性solr通過搜索某個或某些field&#xff0c;返回若干個符合條件的document。或者按搜索的score排序…

wget整站抓取、網站抓取功能;下載整個網站;下載網站到本地

wget -r -p -np -k -E http://www.xxx.com 抓取整站 wget -l 1 -p -np -k http://www.xxx.com 抓取第一級 -r 遞歸抓取-k 抓取之后修正鏈接&#xff0c;適合本地瀏覽 http://blog.sina.com.cn/s/blog_669fb0c3010137bq.html wget -m -e robotsoff -k -E "http://…

Git標簽tag及tag遠程同步

Git給某個歷史版本打上標簽&#xff0c;這樣我們可以快速的眾多歷史版本中找到自己需要的版本&#xff0c;一般打標簽的版本都是發布版本&#xff0c;例如v1.0.0 標簽操作 創建標簽 # 輕量標簽 git tag tagname eg: git tag v1.4# 附注標簽 git tag -a tagname -m tag descr…

妙用SQL Server聚合函數和子查詢迭代求和

先看看下面的表和其中的數據&#xff1a;t_product該表有兩個字段&#xff1a;xh和price&#xff0c; 其中xh是主索引字段&#xff0c;現在要得到如下的查詢結果&#xff1a;從上面的查詢結果可以看出&#xff0c;totalprice字段值的規則是從第1條記錄到當前記錄的price之和。如…

記一次.NET某工控圖片上傳CPU爆高分析

一&#xff1a;背景 1.講故事今天給大家帶來一個入門級的 CPU 爆高案例&#xff0c;前段時間有位朋友找到我&#xff0c;說他的程序間歇性的 CPU 爆高&#xff0c;不知道是啥情況&#xff0c;讓我幫忙看下&#xff0c;既然找到我&#xff0c;那就用 WinDbg 看一下。二&#xff…

微信小程序項目實踐準備工作

微信小程序項目實踐準備工作一、了解微信小程序產品定位及功能介紹微信小程序是一種全新的連接用戶與服務的方式&#xff0c;它可以在微信內被便捷地獲取和傳播&#xff0c;同時具有出色的使用體驗。簡單的說&#xff0c;小程序是微信附屬產品&#xff0c;需要依賴微信&#xf…

VSCode 用戶自定義片段 snippet 基本語法說明

先上一個官方模板&#xff1a; "Print to console": {"prefix": "log","body": ["console.log($1);","$2"],"description": "Log output to console" }prefix 前綴&#xff0c;emmet 觸發條…

Python集合和函數

深淺拷貝&#xff1a;.copy()方法&#xff0c;淺拷貝值拷貝一層。列表中的列表和字典會深拷貝&#xff0c;其他類型會淺拷貝。列表中的列表和字典會隨著副本的修改而改變&#xff0c;其他類型不會隨著副本的改變為改變。ab不是復制&#xff0c;是兩個變量共享同一內存空間&…