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转换
sharpie bind -framework /your path/AMapFoundationKit.framework -sdk iphoneos10.2
MAMapKit转换
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 需要用到的。
转换时的命名错误也是需要修改
修正后为
<span style="font-size:14px;">public enum MAOfflineCityStatus : uint
{
None = MAOfflineItemStatus.None,
Cached = MAOfflineItemStatus.Cached,
Installed = MAOfflineItemStatus.Installed,
Expired = MAOfflineItemStatus.Expired
}</span>
2. 入坑后,再编译AMap.iOS.3D Binding估计你就会哭了,别怕哥帮你刷眼泪。不过这也是一个很好的长经验例子。
初始错误分几种
a. Structs.cs类型错,这种和第一步一样修正为long
b.ApiDefinition.cs [Verify(ConstantsInterfaceAssociation)]
这里得说明一下,除了注释这个字段外,还需要合并多个partial interface Constants为一个Constants。
partial interface Constants
{
// extern NSString *const AMapFoundationVersion;
[Field("AMapFoundationVersion", "__Internal")]
NSString AMapFoundationVersion { get; }
// extern NSString *const AMapFoundationName;
[Field("AMapFoundationName", "__Internal")]
NSString AMapFoundationName { get; }
// extern NSString *const MAMapKitVersion;
[Field("MAMapKitVersion", "__Internal")]
NSString MAMapKitVersion { get; }
// extern NSString *const MAMapKitName;
[Field("MAMapKitName", "__Internal")]
NSString MAMapKitName { get; }
// extern const MAMapSize MAMapSizeWorld;
[Field("MAMapSizeWorld", "__Internal")]
MAMapSize MAMapSizeWorld { get; }
// extern const MAMapRect MAMapRectWorld;
[Field("MAMapRectWorld", "__Internal")]
MAMapRect MAMapRectWorld { get; }
// extern const MAMapRect MAMapRectNull;
[Field("MAMapRectNull", "__Internal")]
MAMapRect MAMapRectNull { get; }
// extern const MAMapRect MAMapRectZero;
[Field("MAMapRectZero", "__Internal")]
MAMapRect MAMapRectZero { get; }
// extern NSString *const kMAMapLayerCenterMapPointKey;
[Field("kMAMapLayerCenterMapPointKey", "__Internal")]
NSString kMAMapLayerCenterMapPointKey { get; }
// extern NSString *const kMAMapLayerZoomLevelKey;
[Field("kMAMapLayerZoomLevelKey", "__Internal")]
NSString kMAMapLayerZoomLevelKey { get; }
// extern NSString *const kMAMapLayerRotationDegreeKey;
[Field("kMAMapLayerRotationDegreeKey", "__Internal")]
NSString kMAMapLayerRotationDegreeKey { get; }
// extern NSString *const kMAMapLayerCameraDegreeKey;
[Field("kMAMapLayerCameraDegreeKey", "__Internal")]
NSString kMAMapLayerCameraDegreeKey { get; }
[Field("MAOfflineMapDownloadReceivedSizeKey", "__Internal")]
NSString MAOfflineMapDownloadReceivedSizeKey { get; }
// extern NSString *const MAOfflineMapDownloadExpectedSizeKey;
[Field("MAOfflineMapDownloadExpectedSizeKey", "__Internal")]
NSString MAOfflineMapDownloadExpectedSizeKey { get; }
[Field("MAOfflineMapErrorDomain", "__Internal")]
NSString MAOfflineMapErrorDomain { get; }
}
这里有一些接口的错误
修改为:
需要修正命名错误,用sharpie转换很容易把不同方法转换成同个名字
还有把Objective-C的指针*作为变量加上去了(这个也够搞笑,希望Sharpie下个版本能修正),都要删除掉*就解决了
// -(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;
[Export("renderLinesWithPoints:pointCount:strokeColor:lineWidth:looped:LineJoinType:LineCapType:lineDash:")]
unsafe void RenderLinesWithPoints(CGPoint* points, nuint pointCount, UIColor strokeColor, nfloat lineWidth, bool looped, MALineJoinType lineJoinType, MALineCapType lineCapType, bool lineDash);
还是Verify字段要去掉
这里有一个更好玩的事,就是扩展方法这里转换老提示以下错误
我查看了一下,发现是怎么也不认扩展方法,看了看stackoverflow ,发现需要把每个属性的get/set通过方法描述解决,这也是醉了。。。。。如这个
[Export("allowsAnnotationViewSorting")]
bool AllowsAnnotationViewSorting { get; set; }
需要修正为:
[Export("allowsAnnotationViewSorting")]
//bool AllowsAnnotationViewSorting { get; set; }
bool AllowsAnnotationViewSorting();
[Export("setAllowsAnnotationViewSorting:")]
void SetAllowsAnnotationViewSorting(bool allowsAnnotationViewSorting);
按照上述步骤基本上就可以把项目编译成功了。
3.接下来就是添加一个iOS项目,做一个简单测试。
这里需要补充一下,需要对MAMapKit.framework补充关联
在Info.plist中 Location Always Usage Description
还需要把两个绑定Binding引用进去
还需要把AMap资源引用去Resource目录(bundle在MAMapKit.framework内)
最后只需要在ViewController.cs添加如下代码就可以了
AMapServices.SharedServices.ApiKey = "你申请的key";
AMapServices.SharedServices.EnableHTTPS = true;
MAMapView map = new MAMapView();
map.Frame = this.View.Bounds;
map.SetShowsUserLocation(true);
map.SetUserTrackingMode(MAUserTrackingMode.Follow);
this.View.AddSubview(map);
Rebuild一下运行
爽爽!!
代码在github上 https://github.com/lokinfey/AMapSDK,由于时间有限我只会暂时先放一个简单的定位功能上去。给有缘人自己添加功能了。
相关文章:
Xamarin的坑 - 绑定(一) - 拿微信iOS SDK 简单说起
原文地址:http://blog.csdn.net/kinfey/article/details/56303998
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
赞赏
人赞赏
Xamarin的坑 - 绑定(二) - 高德iOS SDK(.Framework)绑定的一些事相关推荐
- 《模拟飞行入坑(二)P3D SDK环境搭建及CHM文件转化为html》
SDK包下载 官网下载地址及文档:https://www.prepar3d.com/support/sdk/ 因为游戏使用的是P3DV4.2的版本,所以SDK优先选择 Prepar3D_v4_SDK_ ...
- iOS一次定位解决方案(基于高德iOS SDK)
部分LBS应用,在打开app时获取当前的准确位置就能满足要求,一直开着定位,不仅会浪费流量也费电,所以这里给大家推荐一个一次定位的解决方法. 步骤如下: 1.开启定位,请求获取位置信息.(注意:iOS ...
- ASP.NET MVC Model绑定(二)
ASP.NET MVC Model绑定(二) 前言 上篇对于Model绑定的简单演示想必大家对Model绑定的使用方式有一点的了解,那大家有没有想过Model绑定器是在什么时候执行的?又或是执行的过程 ...
- Xamarin的坑 - 绑定(一) - 拿微信iOS SDK 简单说起
编者语:Xamarin 并入微软快一年了,在国内推广还是慢,主要有两个方面,Xamarin在国内的本地化不足真正在国内的解决方案基本上没有,第二就是和本土的一些主要SDK接入案例基本上也没有.上述原因 ...
- flutter引入高德地图_Flutter笔记-调用原生IOS高德地图sdk
一.前言 2017年底因公司业务组合部门调整,新的团队部分维护的项目用React Native技术混合开发.为适应环境变化,开启疯狂RN学习之旅,晚上回来啃资料看视频.可能由于本身对RN技术体验不感冒 ...
- [iOS]高德地图SDK开发--准备篇
本文是对高德地图SDK使用的总结,对于高德地图不做过多介绍,可直接登录其官网开放平台进行了解; PS: 这里主要是讲解地图使用的准备工作,最后,以显示地图并定位到当前位置来验证;对于其他的使用,可参看 ...
- 【iOS】—— 高德地图SDK基础使用
最近稍微学了学iOS调用高德的SDK,就随便做做笔记.注意:本篇博客基于高德地图SDK的3D地图来写的,若使用的是2D地图可能有的方法可能有所不同,比如自定义定位蓝点之类的. 一.准备工作: 具体的准 ...
- Xamarin.iOS调试提示需要iOS SDK
Xamarin.iOS调试提示需要iOS SDK 错误信息:The version of Xamarin.iOS requires th iOS 9.3 SDK (shipped with Xcode ...
- iOS调用高德地图SDK
准备工作: 安装CocoaPods 使用下载第三方库相同的方法下载SDK 方法如下: (1)打开终端,cd 文件路径 进入到所创建的项目文件中 (2)输入pod init为该项目创建Podfile文件 ...
最新文章
- 理解Lucene索引与搜索过程中的核心类
- 04 Java面试题之数组
- django 模板语言之 simple_tag 自定义模板
- vue中webpack默认配置_Vue-cli 中 Webpack 配置优化(一)
- [Python图像处理] 二十四.图像特效处理之毛玻璃、浮雕和油漆特效
- asp服务器组件安装包,ASP服务器组件
- k8s核心技术-Helm引入---K8S_Google工作笔记0043
- 易天ETU-link 100G QSFP28光模块系列资料
- 代号斗罗显示服务器暂未开放,代号斗罗手游
- 第三天:完善数据层(controller)真正对接数据库Mysql
- Git 及 GitHub实用教程
- java socket保活_gb28181简单实现sip信令服务器(java版基于springboot):四、sip摄像头心跳保活、推流(tcp/udp)和结束推流...
- hd计算机技术,BD和HD的区别是什么?
- 用python在大麦网抢票攻略_大麦网抢票有什么攻略?
- 利用uniapp实现手机摇一摇H5项目
- 收藏!一文搞定工作中Git的使用实践和常用命令合集
- 使用OpenCV和Python进行人脸识别
- 网站标题设置优化方法
- 亚马逊SP-API对接实践
- ppt精选111个毕业答辩模板