一.原生集成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对象,设置代理。代码如下:
{undefined
self.locationManager = [[AMapLocationManager alloc] init];
self.locationManager.delegate = self;
}
override func viewDidLoad() {undefined
locationManager = AMapLocationManager()
locationManager.delegate = self
}
设置持续定位开启地址描述返回:
注意:在海外地区是没有地址描述返回的,地址描述只在中国国内返回。
/**
*/
@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协议来实现的
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传递的参数
/// 给回调的callBackID
@property (nonatomic, copy) NSString *getNativeInfoCBid;
/// 对应getNativeInfo的回调方法
/// @param response 回调参数
/// @param 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];
[self.wkBridge registerHandler:@“nativeCloseJoyer” handler:^(id data, WVJBResponseCallback responseCallback) {
responseCallback(data);//这里的添加高德地图回调的地图数据
}];
[self.wkBridge callHandler:@"testJavascriptHandler" data:@{ @"foo":@"before ready" } responseCallback:^(id responseData) {
}];
}