这篇文章主要说的是 Unity 发布ios 接高德定位 获取定位信息
教程尽量说详细点
稍后配上工程目录
1.登录高德开放平台 主要参照高德文档来 第一步 点击获取key 然后按照里面的教程来很详细,我就不多说了
2.第二步 点击手动部署 注意是手动部署哦 虽然有人说自动部署更好 但是我xcode是个小白一不注意就失败了。所以我选择了手动部署,然后下载我裱起来两个库文件。
3.然后就是打开Unity 创建一个Unity和ios 沟通的脚本 然后发布打包Xcode文件
//定位信息
[DllImport("__Internal")]
private static extern void initStart();//初始定位
[DllImport("__Internal")]
private static extern void LocalIos();//获取定位
string m_szAmapLocal = "0|0";
//button 开始定位 UNIty创建一个按钮 然后点击按钮响应这个方法
public void StartAmap()
{
initStart();
LocalIos();
Debug.Log("Unity 开始定位");
}
//button 获取定位 Unity 创建一个按钮 点击响应这个方法
public void LocateAction()
{
Debug.Log("Unity开始苹果获取定位");
LocalIos();
}
//储存地理位置
public string AmapLocal()
{
return m_szAmapLocal;
}
//接受从IOS传来的地理位置
void LocateIOSGPS(string s)
{
m_szAmapLocal = s;
Debug.Log("[MsgFrom ios]" + s);
}
然后 按照 手动部署 然后 需要引入的系统库文件 需要申请的权限 ATS设置 高德官方文档很清楚 建议哈 还是按照文档来
4.打包出来的xcode文件找到 点击.xcodeproj打开项目 将第二步下载的库文件拖到xcode里
然后创建一个AmapUnity.h文件
<Foundation/Foundation.h>
@interface AmapUnity : NSObject
@end
然后创建一个桥梁文件 用来沟通c#和ob语言的 AmapUnity .m文件
#import "AmapUnity.h"
#import "AmapGaoDe.h"
@implementation AmapUnity
//Unity to ios dayin
AmapGaoDe *iapAmap =nil;
void initStart()
{
NSLog(@"Msg ==========ios 开始定位");
iapAmap = [[AmapGaoDe alloc] init];
[iapAmap startActive];
}
void LocalIos()
{
NSLog(@"Msg ===========获取 定位");
[iapAmap locateAction];
}
@end
然后 可能.m文件会报错 AmapGaoDe找不到 我们接下来来接高德的SDK了 参照高德官方文档
这块按照你们的项目需求 参照官方文档 我的只是调用了项目需要的一部分
创建了一个AmapGaoDe.h文件 用来沟通之前的.m文件
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AMapLocationKit/AMapLocationKit.h>
@interface AmapGaoDe : UIViewController
@property (nonatomic, strong) AMapLocationManager *locationManager;
- (void)startActive;
- (void)locateAction;
@end
然后 创建.m文件 高德的sdk 这个文件里 按照你们项目需求来 比如:我的项目需求就是获取经纬度 然后内容如下
#import "AmapGaoDe.h"
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
@interface AmapGaoDe () <AMapLocationManagerDelegate>
@property (nonatomic, copy) AMapLocatingCompletionBlock completionBlock;
@end
@implementation AmapGaoDe
- (void)startActive
{
//初始化AMapLocationManager对象,设置代理
[AMapServices sharedServices].apiKey=@"您的key";
self.locationManager = [[AMapLocationManager alloc] init];
[self.locationManager setDelegate:self];
// 带逆地理信息的一次定位(返回坐标和地址信息 高精度)
[self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
// 定位超时时间,最低2s,此处设置为10s
[self.locationManager setLocationTimeout:10];
// 逆地理请求超时时间,最低2s,此处设置为10s
[self.locationManager setReGeocodeTimeout:10];
}
- (void)locateAction
{
//带逆地理的单次定位
//带逆地理(返回坐标和地址信息)。将下面代码中的 YES 改成 NO ,则不会返回地址信息。
[self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
if (error)
{
NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);
NSString *err=@"1|1";
UnitySendMessage("Main", "LocateIOSGPS",[err UTF8String]);
if (error.code == AMapLocationErrorLocateFailed)
{
return;
}
}
//定位信息 经纬度
NSString *lat;
lat = [NSString stringWithFormat:@"%f|%f",location.coordinate.longitude,location.coordinate.latitude];
UnitySendMessage("Main", "LocateIOSGPS",[lat UTF8String]);
//逆地理信息
if (regeocode)
{
NSLog(@"reGeocode:%@", regeocode);
}
}];
}
@end
我采用的设置是: 高精度 单次定位 获取的值是经纬度
我们一共是创建了2个.h文件 2个.m文件 一共四个文件 放到Unity 项目的plugins/IOS文件 下次Unity打包Xcode直接就包含这4个文件