• MASA MAUI iOS如何绑定微信


    背景

    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技术来开发相应功能。

    介绍

    App开发中难免不了要对接第三方平台,这些平台官网也提供了SDK供开发者使用。

    对于Android和iOS平台而言,只需要下载官方的SDK,按照官方说明文档进行集成就可以轻松实现了。

    但是对于MAUI来说,并没有官方的SDK,这个时候就需要我们绑定适用于.NET MAUI 的本机库。

    本文主要介绍在MAUI中如何完成iOS绑定库,相比较Android绑定,iOS绑定会麻烦些,接下里让我们一步步在MAUI中实现iOS微信SDK的绑定。

    *以下过程,均在macOS上操作

    前置环境准备

    1. Xcode 13.4.1
    2. Visual Studio for mac 2022
    3. 安装Sharpie, Shapie 是一个非常好用的转换工具,它支持在 macOS 下对 Objective-C 的库的转换。通过 Sharpie 可以对库文件给出的头文件进行转换完成 C# 的绑定。

    通过 Sharpie 工具生成 C# 调用的接口

    下载微信iOS SDK,打开后里面有libWeChatSDK.a的静态库和三个头文件(.h)
    在这里插入图片描述

    我们需要将这几个.h文件转换为C#文件,这时候就需要用到Objective Sharpie工具

    sharpie bind -output=WeChatSDK.IOS -namespace=WeChatSDK.IOS -sdk=iphoneos15.5 -scope [绝对路径]/OpenSDK1.9.6 [绝对路径]/OpenSDK1.9.6/*.h
    
    • 1

    在这里插入图片描述

    这里需要注意指定-scope。

    -scope如果没有参数,Objective Sharpie 将尝试为导入的任何 iOS SDK 标头生成绑定,例如#import ,生成一个巨大的定义文件,在编译绑定项目时可能会生成错误。使用 -scope 参数集时,Objective Sharpie 不会为作用域文件夹之外的任何标头生成绑定。

    转换成功后,会在你指定的文件夹生成ApiDefinitions.cs和StructsAndEnums.cs,StructsAndEnums.cs 对应的是一些常量和枚举类型, ApiDefinitions.cs 对应的是一些接口和方法。
    在这里插入图片描述

    创建 MAUI 的 iOS 绑定项目

    通过命令行创建MAUI的iOS绑定库

    dotnet new iosbinding -o WeChatSDK.IOS
    
    • 1

    将生成的ApiDefinitions.cs和StructsAndEnums.cs替换掉项目对应内的文件并对.csproj调整

    <ItemGroup>
        <ObjcBindingApiDefinition Include="ApiDefinitions.cs" />
        <ObjcBindingCoreSource Include="StructsAndEnums.cs" />
    </ItemGroup>
    
    • 1
    • 2
    • 3
    • 4

    生成一下,发现报错了

    在这里插入图片描述

    看了文档之后,了解到Verify标注只是让我们确认转换是否正常,删除掉即可。删除verify后得到以下界面

    在这里插入图片描述

    这里忘记了添加对静态库libWeChatSDK.a文件的引用,添加下并根据微信文档对.csproj调整

    <ItemGroup>
        <NativeReference Include="libWeChatSDK.a">
          <Kind>Static</Kind>
          <ForceLoad>True</ForceLoad>
          <Frameworks>CFNetwork CoreTelephony Security SystemConfiguration</Frameworks>
          <LinkerFlags>-ObjC -all_load -lstdc++ -lsqlite3.0 -lz</LinkerFlags>
        </NativeReference>
    </ItemGroup>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    生成后发现还有报错

    在这里插入图片描述

    删除AutoGeneratedName,删除后显示生成成功

    在这里插入图片描述
    绑定成功后如何确定程序已经运行?让我们接着往下看

    测试绑定库

    创建一个MAUI Blazor 项目并给项目添加绑定库的引用

    在这里插入图片描述

    测试一下微信分享(这里只是演示 appid和Universal Links要换成你自己的)

    WXApi.RegisterApp("wxd930ea5d5a258f4f","https://help.wechat.com/sdksample/");
    
    SendMessageToWXReq req = new SendMessageToWXReq();
    req.Text = "Hello,MASA!";
    req.BText = true;
    req.Scene = 1;
    WXApi.SendReq(req,null);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    根据微信文档,在Info.plist中增加对应配置

    在这里插入图片描述
    在这里插入图片描述

    最后来看一下真机效果

    在这里插入图片描述

    踩坑记录

    1. 本人一开始用的Xcode 14,发现在Xcode14中无法真机调试,给官方提了issues,当时Xcode 14 对MAUI还没有很好的支持,根据官方的意见退回到了Xcode 13.4.1。
    2. 使用Sharpie要指定-scope,做MAUI的iOS微信SDK绑定前看了一些Xamarin ios绑定的文章,里面用Sharpie都没有指定scope,照着指令敲转换生成的入口文件带大量无法编译的错误,到不了Verify那一步,看了官网文档后才了解到需要指定scope。
    3. MAUI引用做好的iOS绑定库,发现代码智能感知失效了,但是可以成功构建项目,目前要解决绑定库智能感知的问题,我的做法是直接引用生成的程序集。

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

    • WeChat:MasaStackTechOps
    • QQ:7424099
  • 相关阅读:
    【数据结构】二叉树的链式结构
    LeetCode 1758. 生成交替二进制字符串的最少操作数
    【操作系统】9/35MMAP
    2022/12/4 胡言乱语
    (1)(1.17) Maxbotix 模拟声纳
    【Windows && Linux】计算机存储 | 磁盘分区 | 文件系统
    【网站架构】集群性能并非无限扩展,几千万几亿的网站系统贵在哪
    强化学习简介
    AnyCast技术
    关于c#:displayname属性
  • 原文地址:https://blog.csdn.net/MASAteam/article/details/127551707