Xamarin的坑 - 绑定(二) - 高德iOS SDK(.Framework)绑定的一些事

编者语:入门总是用一个hello world,总会让人觉得写code会是很容易的事。开篇绑定了一下微信SDK,不会有太多的难点,可是接下来的这个例子如果欠缺一些耐心,估计你整个人就崩溃了(我从来不会放弃任何的事)。ps这里得谢谢CSDN回帖的人,提示我把一些概念搞错了。嗯!我会修正回来。 我直接拿名家@onevat的日志重新把静态库(.a)和动态框架(Framework)的概念重新引用一次,哈哈希望不会有任何理解上的.

       
       了解更多可以看 https://onevcat.com/2016/01/create-framework/

       第三库在iOS 8后更多用Framework进行封装。本篇以高德SDK为例去完成一个Xamarin对Framework绑定的示例, 我乐意为大家填坑。
       高德地图iOS SDK http://lbs.amap.com/api/ios-sdk/summary 

       我在这里主要用3D地图,主要涉及两个Framework AMapFoundationKit.framework(这是高德的基础库任意地方都需要使用) 和 MAMapKit.framework(3D地图库) 。
       

       1. 在命令行下通过sharpie把两个framework进行分别转换
           AMapFoundationKit转换

  1. sharpie bind -framework /your path/AMapFoundationKit.framework -sdk iphoneos10.2  


           MAMapKit转换


  1. sharpie bind -framework /your path/MAMapKit.framework -sdk iphoneos10.2  

       2. 分别创建对应于AMapFoundationKit和MAMapKit Binding项目,并把生成文件嵌入对应项目中(你可以参照本系列一进行操作http://blog.csdn.net/u014388424/article/details/55517845),还有把Framework放进Binding项目中的Native References文件夹中。
       
      2. 首先尝试编译AMap.iOS Binding ,估计都不会成功的啦,这是常识吧!
      
      看看错误在Structs
      

      是类型错,一般nint需要转换为C#的类型,我这里把它转换成ulong就基本上完事了。 再编译会提示Verify的问题了,把它注释掉。再重新编译就可以顺利把AMapFoundationKit的Binding解决了。(这个和WeChat SDK差不多)。还有别忘记加入using CoreLocation 因为 CLLocationCoordinate2D 需要用到的。

   转换时的命名错误也是需要修改
   

     修正后为
     


  1. <span style="font-size:14px;">public enum MAOfflineCityStatus : uint  

  2. {  

  3.     None = MAOfflineItemStatus.None,  

  4.     Cached = MAOfflineItemStatus.Cached,  

  5.     Installed = MAOfflineItemStatus.Installed,  

  6.     Expired = MAOfflineItemStatus.Expired  

  7. }</span>  


 
     2. 入坑后,再编译AMap.iOS.3D Binding估计你就会哭了,别怕哥帮你刷眼泪。不过这也是一个很好的长经验例子。
      
      初始错误分几种
      a. Structs.cs类型错,这种和第一步一样修正为long
       
      b.ApiDefinition.cs [Verify(ConstantsInterfaceAssociation)]
         这里得说明一下,除了注释这个字段外,还需要合并多个partial interface Constants为一个Constants。

  1. partial interface Constants  

  2.     {  

  3.         // extern NSString *const AMapFoundationVersion;  

  4.         [Field("AMapFoundationVersion""__Internal")]  

  5.         NSString AMapFoundationVersion { get; }  

  6.   

  7.         // extern NSString *const AMapFoundationName;  

  8.         [Field("AMapFoundationName""__Internal")]  

  9.         NSString AMapFoundationName { get; }  

  10.   

  11.         // extern NSString *const MAMapKitVersion;  

  12.         [Field("MAMapKitVersion""__Internal")]  

  13.         NSString MAMapKitVersion { get; }  

  14.   

  15.         // extern NSString *const MAMapKitName;  

  16.         [Field("MAMapKitName""__Internal")]  

  17.         NSString MAMapKitName { get; }  

  18.         // extern const MAMapSize MAMapSizeWorld;  

  19.         [Field("MAMapSizeWorld""__Internal")]  

  20.         MAMapSize MAMapSizeWorld { get; }  

  21.   

  22.         // extern const MAMapRect MAMapRectWorld;  

  23.         [Field("MAMapRectWorld""__Internal")]  

  24.         MAMapRect MAMapRectWorld { get; }  

  25.   

  26.         // extern const MAMapRect MAMapRectNull;  

  27.         [Field("MAMapRectNull""__Internal")]  

  28.         MAMapRect MAMapRectNull { get; }  

  29.   

  30.         // extern const MAMapRect MAMapRectZero;  

  31.         [Field("MAMapRectZero""__Internal")]  

  32.         MAMapRect MAMapRectZero { get; }  

  33.   

  34.         // extern NSString *const kMAMapLayerCenterMapPointKey;  

  35.         [Field("kMAMapLayerCenterMapPointKey""__Internal")]  

  36.         NSString kMAMapLayerCenterMapPointKey { get; }  

  37.   

  38.         // extern NSString *const kMAMapLayerZoomLevelKey;  

  39.         [Field("kMAMapLayerZoomLevelKey""__Internal")]  

  40.         NSString kMAMapLayerZoomLevelKey { get; }  

  41.   

  42.         // extern NSString *const kMAMapLayerRotationDegreeKey;  

  43.         [Field("kMAMapLayerRotationDegreeKey""__Internal")]  

  44.         NSString kMAMapLayerRotationDegreeKey { get; }  

  45.   

  46.         // extern NSString *const kMAMapLayerCameraDegreeKey;  

  47.         [Field("kMAMapLayerCameraDegreeKey""__Internal")]  

  48.         NSString kMAMapLayerCameraDegreeKey { get; }  

  49.   

  50.         [Field("MAOfflineMapDownloadReceivedSizeKey""__Internal")]  

  51.         NSString MAOfflineMapDownloadReceivedSizeKey { get; }  

  52.   

  53.         // extern NSString *const MAOfflineMapDownloadExpectedSizeKey;  

  54.         [Field("MAOfflineMapDownloadExpectedSizeKey""__Internal")]  

  55.         NSString MAOfflineMapDownloadExpectedSizeKey { get; }  

  56.         [Field("MAOfflineMapErrorDomain""__Internal")]  

  57.         NSString MAOfflineMapErrorDomain { get; }  

  58.     }  

        这里有一些接口的错误
        
        修改为:
        
        需要修正命名错误,用sharpie转换很容易把不同方法转换成同个名字
        

        还有把Objective-C的指针*作为变量加上去了(这个也够搞笑,希望Sharpie下个版本能修正),都要删除掉*就解决了  


  1. // -(void)renderLinesWithPoints:(CGPoint *)points pointCount:(NSUInteger)pointCount strokeColor:(UIColor *)strokeColor lineWidth:(CGFloat)lineWidth looped:(BOOL)looped LineJoinType:(MALineJoinType)lineJoinType LineCapType:(MALineCapType)lineCapType lineDash:(BOOL)lineDash;  

  2. [Export("renderLinesWithPoints:pointCount:strokeColor:lineWidth:looped:LineJoinType:LineCapType:lineDash:")]  

  3. unsafe void RenderLinesWithPoints(CGPoint* points, nuint pointCount, UIColor strokeColor, nfloat lineWidth, bool looped, MALineJoinType lineJoinType, MALineCapType lineCapType, bool lineDash);  

         还是Verify字段要去掉

        
       这里有一个更好玩的事,就是扩展方法这里转换老提示以下错误

       

       我查看了一下,发现是怎么也不认扩展方法,看了看stackoverflow ,发现需要把每个属性的get/set通过方法描述解决,这也是醉了。。。。。如这个


  1. [Export("allowsAnnotationViewSorting")]  

  2. bool AllowsAnnotationViewSorting { getset; }  

       需要修正为:

  1. [Export("allowsAnnotationViewSorting")]  

  2. //bool AllowsAnnotationViewSorting { get; set; }  

  3. bool AllowsAnnotationViewSorting();  

  4. [Export("setAllowsAnnotationViewSorting:")]  

  5. void SetAllowsAnnotationViewSorting(bool allowsAnnotationViewSorting);   

      按照上述步骤基本上就可以把项目编译成功了。         


      

      3.接下来就是添加一个iOS项目,做一个简单测试。

      这里需要补充一下,需要对MAMapKit.framework补充关联

        

        在Info.plist中 Location Always Usage Description

               

        还需要把两个绑定Binding引用进去

        

        还需要把AMap资源引用去Resource目录(bundle在MAMapKit.framework内)

        

        最后只需要在ViewController.cs添加如下代码就可以了

  1. AMapServices.SharedServices.ApiKey = "你申请的key";  

  2. AMapServices.SharedServices.EnableHTTPS = true;  

  3. MAMapView map = new MAMapView();  

  4. map.Frame = this.View.Bounds;  

  5. map.SetShowsUserLocation(true);  

  6. map.SetUserTrackingMode(MAUserTrackingMode.Follow);  

  7. this.View.AddSubview(map);  

       Rebuild一下运行


          

      爽爽!!

      代码在github上 https://github.com/lokinfey/AMapSDK,由于时间有限我只会暂时先放一个简单的定位功能上去。给有缘人自己添加功能了。


相关文章:

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

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


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

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

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

相关文章

android 监听安装来源_Flutter插件开发之APK自动安装

点击上方的终端研发部&#xff0c;右上角选择“设为星标”每日早9点半&#xff0c;技术文章准时送上公众号后台回复“学习”&#xff0c;获取作者独家秘制精品资料往期文章记五月的一个Android面试经今日头条屏幕适配方案落地研究图解算法&#xff1a;说一道字节跳动的算法题除…

JavaScript学习总结(一)——JavaScript基础

转载自 JavaScript学习总结(一)——JavaScript基础 一、JavaScript语言特点 1.1、JavaScript是基于对象和事件驱动的(动态的) 它可以直接对用户或客户输入做出响应&#xff0c;无须经过Web服务程序。它对用户的响应&#xff0c;是采用以事件驱动的方式进行的。所谓事件驱动…

idea下使用springinitializr创建项目时 初始化失败的解决

idea自带的地址无使用使用阿里的就可以了 idea下使用springinitializr创建项目时 初始化失败的解决 周山 关注 2020.08.05 13:32:26字数 10阅读 1,085 image.png 修改初始化创建时Custom处 https://start.aliyun.com/ image.png

如何使Mac Docker支持SQL on Linux容器Volume特性

问题引入 这天老鸟火急火燎的找到菜鸟&#xff1a;“鸟儿啊&#xff0c;按照你之前的文章SQL on Linux Run on Docker&#xff0c;当我销毁SQL on Linux Docker容器以后&#xff0c;我容器中的所有数据库数据丢失啦&#xff0c;怎么办&#xff0c;怎么办啊&#xff1f;”。菜鸟…

JavaScript学习总结(二)——逻辑Not运算符详解

转载自 JavaScript学习总结(二)——逻辑Not运算符详解 在JavaScript 中&#xff0c;逻辑NOT运算符与C和Java中的逻辑 NOT 运算符相同&#xff0c;都由感叹号&#xff08;!&#xff09;表示。与逻辑 OR 和逻辑 AND 运算符不同的是&#xff0c;逻辑 NOT 运算符返回的一定是 Boo…

赫夫曼树+图解

图解 代码实现 package com.atguigu.huffmanTree;import javax.swing.*; import java.awt.geom.RoundRectangle2D; import java.util.ArrayList; import java.util.Collections; import java.util.List;/*** 创建人 wdl* 创建时间 2021/3/26* 描述*/ public class HuffmanTree…

四足爬行机器人运动_有自我意识机器人横空出世,还能自我复制,专家表示需警惕其失控...

有自我意识是什么样的&#xff1f;人类自身其实就是有自我意识的生命体&#xff0c;那作为有自我意识的生命体&#xff0c;你想过自我意识是指哪些特征吗&#xff1f;指尖科技说小编先跟你探讨一下&#xff1a;1.主动做事情。就是说在没有其他人控制的情况下&#xff0c;它可以…

微软AirSim,一个无人机和机器人的模拟器

微软开发并开源了AirSim&#xff0c;一个用于模拟无人机在全世界的飞行的工具。这个模拟器基于虚幻引擎&#xff08;Unreal Engine&#xff09;构建&#xff0c;微软很快会增加对机器人和其它类型移动设备的支持。 微软在内部开发了航空信息系统和机器人平台&#xff0c;这个研…

JavaScript学习总结(四)——逻辑OR运算符详解

转载自 JavaScript学习总结(四)——逻辑OR运算符详解 在JavaScript中&#xff0c;逻辑OR运算符用||表示 var bTrue true;var bFalse false;var bResult bTrue || bFalse; 下面的真值表描述了逻辑AND运算符的行为: 运算数 1运算数 2结果truetruetruetruefalsetruefals…

LEANSOFT领航员 – 基于Docker的DevOps实战培训

2016年&#xff0c;LEANSOFT推出了一系列广受开发人员欢迎的培训&#xff0c;包括《构建高效DevOps团队》&#xff0c;《基于Azure的容器化DevOps数据中心》和《Docker基础培训》。在这些培训中&#xff0c;我们得到了很多反馈&#xff0c;大家对使用Docker来支持DevOps的场景有…

高德地图路线规划 时间_路线准、播报拥堵及时,这次自驾出行高德地图可算是帮了大忙...

在我们日常生活中,自驾已经成为一种很普遍的出行方式,不仅在时间上灵活,特别是一家人出行也比较方便。伴随自驾出行的除了爱车外,一款靠谱的地图导航软件也成为了必不可少的旅行伙伴。目前比较常用的地图导航软件当属高德、百度和腾讯,不少人手机里都会有这三款软件中的其中一个…

JavaScript学习总结(七)——JavaScript函数(function)

转载自 JavaScript学习总结(七)——JavaScript函数(function) 一、函数基本概念 为完成某一功能的程序指令(语句)的集合&#xff0c;称为函数。 二、JavaScript函数的分类 1、自定义函数(我们自己编写的函数)&#xff0c;如&#xff1a;function funName(){} 2、系统函数(J…

JavaScript学习总结(八)——JavaScript数组

转载自 JavaScript学习总结(八)——JavaScript数组 JavaScript中的Array对象就是数组&#xff0c;首先是一个动态数组&#xff0c;无需预先制定大小&#xff0c;而且是一个像Java中数组、ArrayList、Hashtable等的超强综合体。 一、数组的声明 常规方式声明&#xff1a; 1、…

命令点无效怎么处理_CAD执行修改命令,你试过重复选择对象吗?

你在执行命令的时候&#xff0c;是习惯先选择对象还是之后才选择对象的呢&#xff1f;不知道细心的你有没有发觉&#xff0c;明明已经先选择对象了才执行命令&#xff0c;为什么之后还要重复选择对象&#xff1f;这里可以分几种情况来讨论一下。CAD版本&#xff1a;中望CAD 202…

一起脱去小程序的外套和内衣 - 微信小程序架构解析

作者介绍&#xff1a; 渠宏伟&#xff0c;腾讯高级工程师&#xff0c;从事Web前端开发5年&#xff0c;先后负责企鹅电竞、腾讯视频VIP、腾讯OA开发框架、腾讯微信HR助手等项目。对Web前端架构、.NET架构有丰富的经验。 | 导语 微信小程序的公测掀起了学习小程序开发的浪潮&…

JavaScript学习总结(九)——Javascript面向(基于)对象编程

转载自 JavaScript学习总结(九)——Javascript面向(基于)对象编程 一、澄清概念 1.JS中"基于对象面向对象" 2.JS中没有类(Class)&#xff0c;但是它取了一个新的名字叫“原型对象”&#xff0c;因此"类原型对象" 二、类(原型对象)和对象(实例)的区别与联…

将Springboot项目放在服务器上一直运行

nohup java -jar hz-sms-0.0.1-SNAPSHOT.jar >/www/wwwroot/...-0.0.1-SNAPSHOT.out 2>&1 &

迁移数据库到SQL on Linux Docker

问题引入 前一篇文章&#xff0c;菜鸟找到了SQL on Linux Docker容器销毁后&#xff0c;容器中的数据库文件可以得以保留的方法&#xff0c;老鸟非常开心。所以&#xff0c;今天又提出了新的问题&#xff1a;“鸟儿&#xff0c;如果我想把我的数据库从SQL on Windows迁移到SQL …

Spring IoC 容器

转载自 Spring IoC 容器 IoC 容器 Spring 容器是 Spring 框架的核心。容器将创建对象&#xff0c;把它们连接在一起&#xff0c;配置它们&#xff0c;并管理他们的整个生命周期从创建到销毁。Spring 容器使用依赖注入&#xff08;DI&#xff09;来管理组成一个应用程序的组…