【H5调用iOS原生高德定位】

柴正祥
2023-12-01

一.原生集成iOS SDK流程
1、创建新应用
进入控制台,创建一个新应用。如果您之前已经创建过应用,可直接跳过这个步骤。
2、添加新Key
在创建的应用上点击"添加新Key"按钮,在弹出的对话框中,依次:输入应用名名称,选择绑定的服务为“iOS平台SDK”,输入安全码 Bundle ID。
需要注意的是: 1个KEY只能用于一个应用(多渠道安装包属于多个应用),1个Key在多个应用上使用会出现服务调用失败。
在阅读完高德地图API服务条款后,勾选此选项,点击“提交”,完成 Key 的申请,此时您可以在所创建的应用下面看到刚申请的 Key 了。
如何获取 Bundle Identifier
以下为您提供两种获取 Bundle Identifier 的方法。
方法一
通过代码获取,代码如下所示:
NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];
方法二
Xcode 切换到 General 标签,查看 Bundle Identifier。
二.自动部署
1、设置 ruby 的软件源。
由于默认的 ruby 的软件源(https://rubygems.org/)被墙阻拦导致 CocoaPods 安装失败,因此需要更新一下 ruby 的源。依次执行如下命令:
gem sources -l #(查看当前ruby的源) gem sources --remove https://rubygems.org/ #(移除当前ruby的源) gem sources -a https://ruby.taobao.org/ #(设置当前ruby源为淘宝源) gem sources -l #(再次查看当前ruby的源)
显示如下文字表示更新成功。
*** CURRENT SOURCES *** https://ruby.taobao.org/
2、升级 gem。
gem 版本较低也可能导致安装或者升级失败,所以需要升级 gem。使用以下命令:
sudo gem update --system
3、安装 CocoaPods
检查一下您的 OS X 的版本。
若您的 OS X 版本小于等于 10.11,依次执行下面的命令安装 CocoaPods。
sudo gem install cocoapods pod setup
大于 10.11,使用如下命令安装。
sudo gem install -n /usr/local/bin cocoapods pod setup
注意:安装过程可能会耗时比较长,也有可能受网络状况影响造成失败,需要多次尝试直到成功。
使用 CocoaPods 安装 SDK
1、在您当前工程文件(.xcodeproj)所在文件夹下创建一个名为 Podfile 的文件。如果您尚未创建 Xcode 项目,请立即创建一个并将其保存到您的本地计算机。 Podfile 内容如下(以 3D 地图 SDK 为例,其他 SDK 的 Pod 库名称参考下表):
platform :ios, ‘7.0’ #手机的系统 target ‘YourProjectTarget’ do #工程名字 pod ‘AMap3DMap’ #3D地图 SDK end
高德 iOS SDK 的 Pod 库的名称如下表:
2、然后执行下面命令进行配置并安装 SDK。
pod repo update #用于保证本地地图相关SDK为最新版 pod install
3、命令执行成功后,会生成 .xcworkspace 文件,打开.xcworkspace 文件以启动工程(注意:此时不能同时开启.xcodeproj文件)
4、升级 SDK
若已经安装了高德 iOS 地图 SDK,想更新到最新版本。在 Podfile 文件的目录下使用以下命令:
pod repo update #用于保证本地地图相关SDK为最新版 pod update

指定 SDK 版本
使用指定版本 SDK,需要修改 Podfile 文件,添加版本相关信息,其文件内容如下:
platform :ios, ‘7.0’ #手机的系统 target ‘YourProjectTarget’ do #工程名字 pod ‘AMap3DMap’, ‘~>4.4.1’#此处指定版本号 end
再执行命令:
pod repo update #用于保证本地地图相关SDK为最新版 pod install

三.sdk使用指南
1、自 iOS 地图 SDK V4.0.0 版、iOS 定位 SDK V2.0.0 版、iOS 导航 SDK V2.0.0 版之后的全部 iOS SDK 均需要引入基础 SDK。
2、基础 SDK 自 V1.2.0 版本后集成了 IDFA 服务,如果您的 APP 中并没有使用到相关服务,请您务必查看提交AppStore必读。
3、iOS 地图 SDK V4.0.0 版、iOS 定位 SDK V2.0.0 版、iOS 导航 SDK V2.0.0 版本及以后版本的 SDK设置Key时,需要引入基础SDK头文件#import <AMapFoundationKit/AMapFoundationKit.h>并添加如下示例代码,配置之前在官申请的高德Key。

[AMapServices sharedServices].apiKey =@“您的key”;
权限配置
第 1 步,升级 SDK
请对照下表更新您的SDK。
第 2 步 ,开启 HTTPS 功能
您只需在配置高德 Key 前,添加开启 HTTPS 功能的代码,如下:
[[AMapServices sharedServices] setEnableHTTPS:YES];
四.地图sdk的使用
iOS定位SDK提供的持续定位功能获取定位数据(地图SDK可以将获取的数据进行展示),与CLLocationManager的使用方法类似。

实现持续定位的步骤如下:

第 1 步,引入头文件

在调用定位功能的类中引入AMapFoundationKit.h和AMapLocationKit.h这两个头文件,注意Swift需要在桥接文件中引入头文件:

#import

#import

//在桥接文件中引入头文件

#import

#import

第 2 步,配置Key

在调用定位时,需要添加Key,需要注意的是请在 SDK 任何类的初始化以及方法调用之前设置正确的 Key。

如果您使用的是定位SDK v2.x版本需要引入基础 SDK AMapLocationKit.framework ,设置apiKey的方式如下:

iOS 定位SDK v2.x版本设置 Key:

[AMapServices sharedServices].apiKey =@“您的key”;

AMapServices.shared().apiKey = “您的key”

如果您使用的是定位SDK v1.x版本,请您尽快更新。

iOS 定位SDK v1.x版本设置 Key:

[AMapLocationServices sharedServices].apiKey =@“您的key”;

AMapLocationServices.shared().apiKey = “您的key”

第 3 步,初始化

初始化AMapLocationManager对象,设置代理。代码如下:

  • (void)viewDidLoad

{undefined

self.locationManager = [[AMapLocationManager alloc] init];

self.locationManager.delegate = self;

}

override func viewDidLoad() {undefined

locationManager = AMapLocationManager()

locationManager.delegate = self

}

设置持续定位开启地址描述返回:

注意:在海外地区是没有地址描述返回的,地址描述只在中国国内返回。

/**

  • 持续定位是否返回逆地理信息,默认NO。

*/

@property (nonatomic, assign) BOOL locatingWithReGeocode;

第 4 步,开启持续定位

调用AMapLocationManager提供的startUpdatingLocation方法实现。

代码如下:

[self.locationManager startUpdatingLocation];

locationManager.startUpdatingLocation()

如果需要持续定位返回逆地理编码信息,(自 V2.2.0版本起支持)需要做如下设置:

[self.locationManager setLocatingWithReGeocode:YES];

[self.locationManager startUpdatingLocation];

locationManager.locatingWithReGeocode = true

locationManager.startUpdatingLocation()

第 5 步,接收位置更新

实现AMapLocationManagerDelegate代理的amapLocationManager:didUpdateLocation: 方法,处理位置更新。

代码如下:

-(void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location

{undefined

NSLog(@“location:{lat:%f; lon:%f; accuracy:%f}”, location.coordinate.latitude, location.coordinate.longitude, location.horizontalAccuracy);

}

func amapLocationManager(_ manager: AMapLocationManager!, didUpdate location: CLLocation!) {undefined

NSLog(“location:{lat:(location.coordinate.latitude); lon:(location.coordinate.longitude); accuracy:(location.horizontalAccuracy)};”);

}

自 V2.2.0 版本起amapLocationManager:didUpdateLocation:reGeocode:方法可以在回调位置的同时回调逆地理编码信息。请注意,如果实现了amapLocationManager:didUpdateLocation:reGeocode: 回调,将不会再回调amapLocationManager:didUpdateLocation: 方法。

代码如下:

-(void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode

{undefined

NSLog(@“location:{lat:%f; lon:%f; accuracy:%f}”, location.coordinate.latitude, location.coordinate.longitude, location.horizontalAccuracy);

if (regeocode)

{undefined

NSLog(@“reGeocode:%@”, regeocode);

}

}

最后一步,停止持续定位

当不再需要定位时,调用AMapLocationManager提供的stopUpdatingLocation方法停止定位。代码如下:

[self.locationManager stopUpdatingLocation];

locationManager.stopUpdatingLocation()

五.使用WKWebView与JS交互

WKWebView在iOS9才开始完善,所以建议将工程设置成最低支持iOS9

1.WKWebView调用JS方法
WKWebView调用JS方法是通过直接执行JS代码来实现的
iOS中WK的的方法 evaluateJavaScript 就是执行的js代码
2.JS调用WKWebView方法
JS调用WKWebView都是通过WKScriptMessageHandler协议来实现的

  • (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;

OC Code

WKUserContentController * userContent = [[WKUserContentController alloc]init];
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.userContentController = userContent;
WKUserScript *usrScript = [[WKUserScript alloc] initWithSource:[ZLJSBridge handlerJS] injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
[userContent addUserScript:usrScript];
[userContent addScriptMessageHandler:self name:@“ZLJSBridge”];
_wkWebView = [[WKWebView alloc]initWithFrame:[UIScreen mainScreen].bounds configuration:configuration];
_wkWebView.navigationDelegate = self;
_wkWebView.UIDelegate = self;

JS Code

let messsage = ‘name’ : ‘lllllin’
window.webkit.messageHandlers.ZLJSBridge.postMessage(message);

iOS在WKScriptMessageHandler协议中的方法接受参数

message.name为addScriptMessageHandler时传递的name
message.body为JS传递的参数

  • (void)userContentController:(WKUserContentController *)userContentController
    didReceiveScriptMessage:(WKScriptMessage *)message
    {
    if ([message.name isEqualToString:@“ZLJSBridge”])
    {
    NSLog(@“%@”,message.body);
    }
    }
  1. JS调用WKWebView方法并且WKWebView给JS回调
    ZLJSBridge.js中plugin为约定好OC的类名
    /// JS调用的方法
    /// @param params JS传递的参数
    /// @param callBackID JS传递的callBackID
  • (void)getNativeInfo:(NSDictionary *)params callBackID:(NSString *)callBackID;

/// 给回调的callBackID
@property (nonatomic, copy) NSString *getNativeInfoCBid;

/// 对应getNativeInfo的回调方法
/// @param response 回调参数
/// @param wkWebview 执行回调的wkWebView

  • (void)getNativeCallBack:(id)response wkWwebView:(WKWebView *)wkWebview;

JS Code
//getNativeInfo为约定好的方法名 params为参数 res为给的回调内容
//res格式为jsonString 如果需要用json对象的话需要用JSON.parse(res)转义一下
JSBridge.callAPI(“getNativeInfo”, params, res => {
document.getElementById(‘div2’).innerHTML = res;
});

操作步骤
引用#import “WKWebViewJavascriptBridge.h”
遵守协议
UIWebViewDelegate

需要高德定位时候开启定位调用
[self.locationManager startUpdatingLocation];
不需要定位时候调用
[self.locationManager stopUpdatingLocation];
locationManager.stopUpdatingLocation()

高德定位数据在协议
-(void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode
中获取。

调用方法注册EWKWebView的H5回调
[self registerEWKWebViewHandler];

  • (void)registerEWKWebViewHandler {
    [WKWebViewJavascriptBridge enableLogging];
    self.wkBridge = [WKWebViewJavascriptBridge bridgeForWebView:self.ewkWebView.wkWebView];
    [self.wkBridge setWebViewDelegate:self.ewkWebView];
    ComWeak(weakSelf);

[self.wkBridge registerHandler:@“nativeCloseJoyer” handler:^(id data, WVJBResponseCallback responseCallback) {

    responseCallback(data);//这里的添加高德地图回调的地图数据
}];
[self.wkBridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" } responseCallback:^(id responseData) {
}];

}

 类似资料: