做的項(xiàng)目里面有見面功能? 所以就需要有導(dǎo)航? 導(dǎo)航兩種實(shí)現(xiàn)方式 (集成第三方SDK、URL跳轉(zhuǎn)第三方應(yīng)用)? 項(xiàng)目要求實(shí)現(xiàn)直接跳轉(zhuǎn) 所以接下來做的是實(shí)現(xiàn)URL跳轉(zhuǎn)第三方地圖來導(dǎo)航了
實(shí)現(xiàn)如下的效果
項(xiàng)目中實(shí)現(xiàn)彈窗讓用戶輸入目的地? 實(shí)現(xiàn)導(dǎo)航使雙方見面
思路:把輸入的目的地地理編碼? 獲取到的經(jīng)緯度再調(diào)用第三方的導(dǎo)航
實(shí)現(xiàn)中遇到的坑:首先地理編碼得到的地標(biāo)會不止一個 (這個可以把所有的地標(biāo)信息展示出來? 讓用戶來選擇是哪一個 可是沒有地圖出現(xiàn)直接這樣展示有點(diǎn)詭異 所以我放棄了這種)
其次遇到的坑:從地標(biāo)中拿到了經(jīng)緯度 這樣得到的是地球坐標(biāo)(也就是GPS使用的是WGS84的坐標(biāo)系統(tǒng)? 但在我國 出于國家安全考慮 國內(nèi)所有導(dǎo)航電子地圖必須使用國家測繪局制定的加密坐標(biāo)系統(tǒng) 即將一個真實(shí)的經(jīng)緯度坐標(biāo)加密成一個不正確的經(jīng)緯度坐標(biāo) 即火星坐標(biāo)) 當(dāng)然這樣也可以實(shí)現(xiàn)? 只是要考慮到每種地圖的坐標(biāo)系都不同? 這樣做就是得每種都計(jì)算 所以也放棄了
接下來說一下我的實(shí)現(xiàn)
實(shí)現(xiàn)跳轉(zhuǎn)首先想到的肯定是配置URL Scheme 和白名單了
百度地圖 URL Scheme: baidumap:// ? ? ? ? ? ? ? ?文檔鏈接
高德地圖 URL Scheme:? iosamap:// ? ? ? ? ? ? ? ? ?文檔鏈接
谷歌地圖 URL Scheme:comgooglemaps:// ? ? ?文檔鏈接
騰訊地圖 URL Scheme:qqmap:// ? ? ? ? ? ? ? ? ? ? ? ?文檔鏈接
配置好白名單之后就要敲代碼了? 如果沒有安裝某個地圖App? 那么對應(yīng)的選項(xiàng)就不應(yīng)該出現(xiàn)? 檢測App是否安裝? 只需要調(diào)用下面的方法即可
[[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]
我所做的是讓用戶輸入目的地 調(diào)用第三方地圖應(yīng)用的路線接口 直接把目的地傳進(jìn)去 用戶可以選擇導(dǎo)航 因?yàn)槲覀兊膽?yīng)用做的是附近人的見面 所以我選擇的出行方式是walk 但是騰訊地圖用這種方式是實(shí)現(xiàn)不了的 蘋果自帶的地圖也實(shí)現(xiàn)不了 需要傳經(jīng)緯度
通過位置調(diào)用地理編碼 為蘋果地圖和騰訊地圖的實(shí)現(xiàn)傳入經(jīng)緯度
///? 地理編碼- (void)geocoderClick:(NSString *)addressString{
// 創(chuàng)建
Geocoder? ? CLGeocoder *geocoder = [CLGeocoder new];
// 調(diào)用方法
[geocoder geocodeAddressString:addressString completionHandler:^(NSArray* _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count == 0 || error) {
[MATools showServerResultInView:self.view withText:@"您輸入的地址有誤上炎,請重新輸入" andImage:nil];
return;
}
CLPlacemark *pm = [placemarks lastObject];
CLLocationCoordinate2D gps = CLLocationCoordinate2DMake(pm.location.coordinate.latitude, pm.location.coordinate.longitude);
self.maps = [self getInstalledMapAppWithAddr:addressString withEndLocation:gps];
[self alertAmaps:gps];
}];
}
下面是我封裝的方法獲取手機(jī)上所安裝了的地圖
#pragma mark - 路線規(guī)劃方法
- (NSArray *)getInstalledMapAppWithAddr:(NSString *)addrString withEndLocation:(CLLocationCoordinate2D)endLocation
{
NSMutableArray *maps = [NSMutableArray array];
//蘋果地圖
NSMutableDictionary *iosMapDic = [NSMutableDictionary dictionary];
iosMapDic[@"title"] = @"蘋果地圖";
[maps addObject:iosMapDic];
NSString *appStr = NSLocalizedString(@"app_name", nil);
//高德地圖
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]) {
NSMutableDictionary *gaodeMapDic = [NSMutableDictionary dictionary];
gaodeMapDic[@"title"] = @"高德地圖";
NSString *urlString = [[NSString stringWithFormat:@"iosamap://path?sourceApplication=%@&sid=BGVIS1&did=BGVIS2&dname=%@&dev=0&t=2",appStr ,addrString] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet? URLQueryAllowedCharacterSet]];
gaodeMapDic[@"url"] = urlString;
[maps addObject:gaodeMapDic];
}
//百度地圖
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]]) {
NSMutableDictionary *baiduMapDic = [NSMutableDictionary dictionary];
baiduMapDic[@"title"] = @"百度地圖";
NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin=我的位置&destination=%@&mode=walking&src=%@",addrString ,appStr] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet? URLQueryAllowedCharacterSet]];
baiduMapDic[@"url"] = urlString;
[maps addObject:baiduMapDic];
}
//騰訊地圖
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"qqmap://"]]) {
NSMutableDictionary *qqMapDic = [NSMutableDictionary dictionary];
qqMapDic[@"title"] = @"騰訊地圖";
NSString *urlString = [[NSString stringWithFormat:@"qqmap://map/routeplan?from=我的位置&type=walk&tocoord=%f,%f&to=%@&coord_type=1&policy=0",endLocation.latitude , endLocation.longitude ,addrString] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet? URLQueryAllowedCharacterSet]];
qqMapDic[@"url"] = urlString;
[maps addObject:qqMapDic];
}
//谷歌地圖
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"comgooglemaps://"]]) {
NSMutableDictionary *googleMapDic = [NSMutableDictionary dictionary];
googleMapDic[@"title"] = @"谷歌地圖";
NSString *urlString = [[NSString stringWithFormat:@"comgooglemaps://?saddr=&daddr=%@&directionsmode=walking",addrString] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet? URLQueryAllowedCharacterSet]];
googleMapDic[@"url"] = urlString;
[maps addObject:googleMapDic];
}
return maps;
}
彈窗提示用戶所能打開的第三方地圖應(yīng)用
- (void)alertAmaps:(CLLocationCoordinate2D)gps
{
if (self.maps.count == 0) {
return;
}
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
for (int i = 0; i < self.maps.count; i++) {
if (i == 0) {
[alertVC addAction:[UIAlertAction actionWithTitle:self.maps[i][@"title"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self navAppleMap:gps];
}]];
}else{
[alertVC addAction:[UIAlertAction actionWithTitle:self.maps[i][@"title"] style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self otherMap:i];
}]];
}
}
[alertVC addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alertVC animated:YES completion:nil];
}
蘋果地圖實(shí)現(xiàn)導(dǎo)航的方法 需要導(dǎo)入頭文件#import<CoreLocation/CoreLocation.h> #import<MapKit/MapKit.h>
// 蘋果地圖
- (void)navAppleMap:(CLLocationCoordinate2D)gps
{
MKMapItem *currentLoc = [MKMapItem mapItemForCurrentLocation];
MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:gps addressDictionary:nil]];
NSArray *items = @[currentLoc,toLocation];
NSDictionary *dic = @{
MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeWalking,
MKLaunchOptionsMapTypeKey: @(MKMapTypeStandard),
MKLaunchOptionsShowsTrafficKey: @(YES)
};
[MKMapItem openMapsWithItems:items launchOptions:dic];
}
通過url打開第三方地圖應(yīng)用
///? 第三方地圖
- (void)otherMap:(NSInteger)index
{
NSDictionary *dic = self.maps[index];
NSString *urlString = dic[@"url"];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
}