Xamarin的坑 - 绑定(一) - 拿微信iOS SDK 简单说起

编者语:Xamarin 并入微软快一年了,在国内推广还是慢,主要有两个方面,Xamarin在国内的本地化不足真正在国内的解决方案基本上没有,第二就是和本土的一些主要SDK接入案例基本上也没有。上述原因令不少企业放弃使用这个很好的跨平台解决方案。在新一年本人觉得是时候把本人的东西贡献给各界友好了,希望把这几年开发的心得一次过给大家。当然在国内Xamarin社区也开始起步,如衣哥,guitarpark,周岳等Xamarin专家也会分享他们的经验。小弟只是做那么的一点点事摆了。

       大家希望有一些本地化的SDK和Xamarin的整合,这无可避免地需要和一些Static Library 和 Dynamic Framework进行整合。这个时候就需要Binding了。Xamarin 给大家提供一个命令行工具Sharpie,对传统的iOS Static Library 和 iOS Framework 进行转换适配C#的项目。

       先看看Sharpie, Sharpie是一个命令。其实是通过Clang对调用Static Library /Dynamic Framework 时所需要的头文件进行转换,把C++/Objective-C转换成C#。 在Xamarin的网站你可以下载( https://download.xamarin.com/objective-sharpie/ObjectiveSharpie.pkg )。这里补充一点,在使用Sharpie你还是得有对Static Library / Framework 的基本知识,否则你遇到问题时,你就无法入手了。(多次说跨平台不是不学每个平台)。
       这里补充一下Static Library和Framework的知识。

       Static Library(静态库) - 从源代码编译的目标文件的集合,其实就是一个源代码的实现所对应的二进制实现。配合上提供的头文件(.h),可以获取到静态库中(.a)暴露的属性和方法。
       Dynamic Framework(动态库)- 相当于一个包,随时可以调用,像iOS的UIKit之类的就是动态库。它对比起静态库不需要.h文件就可以调用,而且只需要加载一次,对程序的执行效率相对于静态库有所提高。

       很多第三方的组件都喜欢为iOS提供静态库和动态库,像微信就提供了静态库给iOS调用。
       
       微信就提供了libWeChatSDK.a的静态库,和三个头文件,分别对应了微信提供的验证,API, 基础类三个头文件。而Sharpie需要做的是把这三个基于Objective-C的头文件转换为C#.
       

       下面我们尝试去做转换看看有哪些值得注意的地方。      

       1. 做转换让 Sharpie帮你把.h头文件转换成ApiDefinition.cs和Structs.cs


  1. sharpie bind --output=WeChat.iOS --namespace=WeChat.iOS --sdk=iphoneos10.2 /Users/lujianhui/Desktop/OpenSDK1.7.6/WechatAuthSDK.h /Users/lujianhui/Desktop/OpenSDK1.7.6/WXApi.h /Users/lujianhui/Desktop/OpenSDK1.7.6/WXApiObject.h  

       
       转换成功后,会在你指定的文件夹生成ApiDefinitions.cs和StructsAndEnums.cs。


       2. 打开你的Xamarin Studio / Visual Studio for Mac/ Visual Studio (我这里用Visual Studio for Mac)创建iOS Bindings Library 项目
       
       把刚才生成的文件分别放进对应的ApiDefinition.cs和Structs.cs里面
       
       这里马上遇到我们的一个坑了,首先如果你尝试去编译,你会发现你是编译不过的。别慌,哥在!!
       

       首先这是一个标签[Verify(MethodToProperty)],这是需要你去确认,这些地方是否转换正确,因为在OC是一个静态方法,现在在C#会帮你转换成属性,你可以通过原有的头文件转换检查确认无误后,你可以删除/注释掉它。还有一些提示出错的如BaseType不用理,这个只是编辑器不支持这个标签,不影响项目编译和运行。(这里赞赞Sharpie还是转换类挺高的,当然也得赞微信团队,做的东西也是蛮标准的。)重新编译后就能通过了。

   3.把libWeChatSDK.a添加进项目中的Native References文件夹内
   
   这里是另一个坑,由于静态库会有对iOS的不同依赖,所以必须根据要求,对刚加进来的静态库进行调整。
   根据微信文档
   
   我们需要点击libWeChatSDK右键跳到属性,进行修改,首先我们需要把Smart Link 和Force Load钩上,因为这个静态库是必须加载的,其次按照上面的文件,把Frameworks和LinkFlags补上,最后效果如下:
   
   这样我们重新编译就把Binding基本上完成了。
   4.我们尝试把这个项目接入一个Xamarin.iOS做一个简单的测试看看是否成功
     
   接下来按照微信的接入步骤,把一些配置先弄好
   
   还有Bundle ID必须和你在微信注册时候是一致的
   接下来我定义一个简单的类去做一个接入和发送信息到朋友圈的例子。
   先定义一个WeChatAPI类

  1. using System;  

  2. using WeChat.iOS;  

  3.   

  4. namespace WeChat.iOS.Samples  

  5. {  

  6.     public class WeChatAPI: WXApiDelegate  

  7.     {  

  8.         //微信登录  

  9.         public bool Log(string appID)  

  10.         {  

  11.             var result = WXApi.RegisterApp(appID);  

  12.             return result;  

  13.         }  

  14.         //微信链接打开  

  15.         public bool Open(NSUrl url)  

  16.         {  

  17.             var result = WXApi.HandleOpenURL(url, this);  

  18.             return result;  

  19.         }  

  20.         //请求打开微信  

  21.         public override void OnReq(BaseReq req)  

  22.         {  

  23.   

  24.         }  

  25.         //响应微信  

  26.         public override void OnResp(BaseResp resp)  

  27.         {  

  28.   

  29.         }  

  30.   

  31.         //发送信息到朋友圈  

  32.         public bool SendText(string text)  

  33.         {  

  34.             SendMessageToWXReq req = new SendMessageToWXReq();  

  35.             req.Text = text;  

  36.             req.BText = true;  

  37.             req.Scene = 1;  

  38.             WXApi.SendReq(req);  

  39.   

  40.             return true;  

  41.         }  

  42.   

  43.     }  

  44. }  

    在AppDelegate.cs添加如下代码


    
    并在Storyboard添加一个Button,并做一个响应事件
    
    运行看看
    
   是不是很有成就感呢?其实绑定还有一堆坑的,Sharpie随着版本的不断改进,对第三方的SDK兼容性越做越好了。接下来我会说说更多的案例,希望大家看了后有所启发。祝大家有个愉快的周末.

   程序示例https://github.com/lokinfey/WeChatSDK   

原文地址:http://blog.csdn.net/kinfey/article/details/51280945


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS刷新页面的几种方法

转载自 JS刷新页面的几种方法 Javascript刷新页面的几种方法: 1 history.go(0) 2 location.reload() 3 locationlocation 4 location.assign(location) 5 document.execCommand(‘Refresh‘) 6 window.navigate(location) 7 location.replace(location) …

16岁应该遵循什么_成人学习一般遵循的规律

成人学习一般遵循的规律第一阶段是激发起对过去的经历的回忆,让学习者回头想想自己以前做了些什么,是在什么情况下运用什么方法做的;第二阶段,启发学习者对这些经历进行反思,检讨这些经历的成功与失败之所在&#xff0…

stream进行分组统计

// //groupingBy分组 // Map<Integer, Long> map houseList.stream().collect(Collectors.groupingBy(House::getBuildId, Collectors.counting())); // //控制台输出map // map.forEach((k,v)->{ // System.out.println("k"k",v"v)…

js实现页面跳转重定向的几种方式

转载自 js实现页面跳转重定向的几种方式 这篇文章主要介绍js实现页面跳转重定向的几种方式,需要的朋友可以参考下 第一种&#xff1a; <script language"javascript"type"text/javascript"> window.location.href"http://shanghepinpai.c…

二分查找+思路分析

思路分析 代码实现 package com.atguigu.search;/*** 创建人 wdl* 创建时间 2021/3/23* 描述*/ //注意&#xff1a;使用二分查找的前提是&#xff0c;该数组是有序的 public class BinarySearch {public static void main(String[] args) {int arr[]{1,8,10,89,1000,1234};int…

SQLServer On Linux Package List on CentOS

问题引出 “鸟儿啊&#xff0c;到底SQLServer on Linux肚里装了多少东西&#xff0c;在我们的CentOS系统安装了哪些物理文件呢&#xff1f;”&#xff0c;老鸟这天火急火燎的问道。“这个啊&#xff1f;让本鸟帮你一探究竟。”&#xff0c;菜鸟耐心回答道。 问题分析 菜鸟一边想…

开发环境 Minio 添加桶的操作流程-页面操作

命令操作 d开发环境 Minio 添加桶的操作流程_摇曳的精灵的博客-CSDN博客_minio创建桶 页面操作

python 可视化数据库_python实现地址分布可视化

当你知道某些详细地址信息&#xff0c;该如何利用。本文通过调用百度地图接口&#xff0c;实现用户可视化展示&#xff0c;便于更清楚地了解用户。注册百度地图开放平台帐号Python调用通过http调用接口格式如下&#xff1a;全选复制放进笔记http://api.map.baidu.com/geocoder/…

冬至快乐

男生关注会更帅&#xff0c;女生关注会更美&#xff01;冬至冬至到&#xff0c;吃水饺&#xff0c;颗颗都有年味道。头常挠&#xff0c;口常笑&#xff0c;睿智快乐常围绕。摇摇头&#xff0c;晃晃脑&#xff0c;轻松健康直到腰。扭扭臂&#xff0c;捏捏脚&#xff0c;健康到底…

JavaScript原生添加移除class的方法

转载自 JavaScript原生添加移除class的方法 1.JavaScript原生移除class方法 window.onload function () {var stamp document.getElementById("btGetCode"); //根据id查找到该标签removeClass(stamp, "can-code"); //调…

二分查找(一次查找多个相同的值)

package com.atguigu.search;import java.util.ArrayList; import java.util.List;/*** 创建人 wdl* 创建时间 2021/3/23* 描述*/ //注意&#xff1a;使用二分查找的前提是&#xff0c;该数组是有序的 public class BinarySearch {public static void main(String[] args) {int…

介绍Portable PDB

为了调试编译的应用程序&#xff0c;有必要将IL代码或二进制的机器代码与源代码行进行匹配。虽然数据可以嵌入在应用程序中&#xff0c;但这会显著增加EXE或DLL文件的大小。取而代之的是&#xff0c;通常会使用单独的“symbols”文件。在Windows平台上&#xff0c;这被称为PDB或…

RedisGeo实现增删改查 java计算指定坐标最近的距离并排序

利用Redis的Geo功能实现查找附近的位 - 云社区 - 腾讯云 package com.easy.hotel.pms.util;import com.easy.hotel.common.data.tenant.TenantContextHolder; import com.easy.hotel.pms.mapper.CommunityMapper; import com.easy.hotel.pms.service.impl.CommunityServiceImpl…

openglshader实现虚拟场景_opengl+shader

1、环境介绍&#xff1a;】软件 &#xff1a;visual studio编程语言&#xff1a;opengl库 &#xff1a;glad glfw【2、内容介绍】-- 绘制场景&#xff1a;场景1&#xff1a; 一片沙漠中&#xff0c;一本书&#xff0c;四周出现 5 个自球&#xff0c;逐渐被黑雾笼罩场景2&#x…

没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))

今天在开发指纹识别的项目时候&#xff0c;出现了个问题&#xff0c;这个问题之前也没有见过&#xff0c;所以无从下手&#xff0c;只能从网上找解决方法&#xff0c;找了半天说要注册com组件啥的&#xff0c;我老是注册不成功&#xff0c;后来瞎捣鼓终于解决了&#xff0c;原因…

JS获取自定义属性data-*值与dataset

转载自 JS获取自定义属性data值 <body> <div id"tree" data-leaves"47" data-plant-height"2.4m"></div> <script> var tree document.getElementById("tree"); //getAttribute()取值属性 console.log(tr…

插值查找+代码实现+注意事项

图解 代码实现 package com.atguigu.search;import java.util.Arrays;/*** 创建人 wdl* 创建时间 2021/3/23* 描述*/ public class InsertValueSearch {public static void main(String[] args) {int[] arrnew int[100];for (int i 0; i < 100; i) {arr[i]i1;}// S…

SQL Server on Linux的文件和目录结构

问题引入 “鸟儿啊&#xff0c;我记得你写过一篇《SQLServer On Linux Package List on CentOS》的文章&#xff0c;从这篇文章&#xff0c;我们很清楚的知道了SQL Server on Linux包含有哪些必要的包。那么&#xff0c;我们怎么知道SQL Server on Linux到底包含哪些重要的文件…

3级调度 fpga_FPGA的软核、硬核、固核

“核”现在的FPGA设计&#xff0c;规模巨大而且功能复杂&#xff0c;因此设计的每一个部分都从头开始是不切实际的。一种解决的办法是&#xff1a;对于较为通用的部分可以重用现有的功能模块&#xff0c;而把主要的时间和资源用在设计中的那些全新的、独特的部分。这就像是你在…