好久沒寫文章了询一,是該好好總結(jié)下,先把我CSDN上有用的文章先搬過來撐撐門面是晨!
我的CSDN主頁肚菠,懶,所有沒幾個文章
這篇文章地址
用過微信的應該都知道這個功能罩缴,對方發(fā)一個位置給你蚊逢,點進去地圖展示對方跟你的當前位置,界面提供了選擇各個地圖應用進行導航箫章,更好這次需求也要搞這個功能烙荷。
這個功能實現(xiàn)不難,個人感覺比應用內(nèi)嵌入第三方地圖導航SDK用起來更舒服檬寂,更接地氣终抽,逼格也高點,主要要的是簡單(畢竟人家啥都處理好了)桶至。
上項目效果圖(還是想吐槽下傻逼的產(chǎn)品昼伴,為啥不直接照搬微信的界面,至少比自己的好看)
這里有一個重點塞茅,主要是彈出的選擇框的選項并不是固定的亩码,而是根據(jù)你手機上有沒有安裝這個地圖應用,沒有就不會出現(xiàn)野瘦。
這里就要用到
- (BOOL)canOpenURL:(NSURL*)url NS_AVAILABLE_IOS(3_0);
判斷手機上有沒有安裝該地圖應用描沟。
所以要知道地圖應用的url Scheme飒泻。
這里提供了幾個常用地圖應用的url Scheme:
baidumap//百度地圖
iosamap//高德地圖
comgooglemaps//谷歌地圖
qqmap//騰訊地圖
…//其他地圖省略
蘋果地圖不需要,因為它是蘋果地圖啊吏廉,這樣也好泞遗,能保證沒有安裝其他地圖app,至少還有一個蘋果地圖席覆,而且蘋果地圖在IOS9也做的越來越好了史辙,本身API提供了一個跳轉(zhuǎn)打開方法。
這里插入一個小細節(jié)佩伤,在IOS9之后聊倔,蘋果進一步完善了安全機制,必須在plist里面設置url scheme白名單生巡,不然無法打開對應的應用
前方高能耙蔑,重點來了!9氯佟5槟啊!
這里我抽了個方法返回支持導航的地圖信息數(shù)組:
#pragma mark - 導航方法
- (NSArray *)getInstalledMapAppWithEndLocation:(CLLocationCoordinate2D)endLocation
{
NSMutableArray *maps = [NSMutableArray array];
//蘋果地圖
NSMutableDictionary *iosMapDic = [NSMutableDictionary dictionary];
iosMapDic[@"title"] = @"蘋果地圖";
[maps addObject:iosMapDic];
//百度地圖
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://"]]) {
NSMutableDictionary *baiduMapDic = [NSMutableDictionary dictionary];
baiduMapDic[@"title"] = @"百度地圖";
NSString *urlString = [[NSString stringWithFormat:@"baidumap://map/direction?origin={{我的位置}}&destination=latlng:%f,%f|name=北京&mode=driving&coord_type=gcj02",endLocation.latitude,endLocation.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
baiduMapDic[@"url"] = urlString;
[maps addObject:baiduMapDic];
}
//高德地圖
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]) {
NSMutableDictionary *gaodeMapDic = [NSMutableDictionary dictionary];
gaodeMapDic[@"title"] = @"高德地圖";
NSString *urlString = [[NSString stringWithFormat:@"iosamap://navi?sourceApplication=%@&backScheme=%@&lat=%f&lon=%f&dev=0&style=2",@"導航功能",@"nav123456",endLocation.latitude,endLocation.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
gaodeMapDic[@"url"] = urlString;
[maps addObject:gaodeMapDic];
}
//谷歌地圖
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"comgooglemaps://"]]) {
NSMutableDictionary *googleMapDic = [NSMutableDictionary dictionary];
googleMapDic[@"title"] = @"谷歌地圖";
NSString *urlString = [[NSString stringWithFormat:@"comgooglemaps://?x-source=%@&x-success=%@&saddr=&daddr=%f,%f&directionsmode=driving",@"導航測試",@"nav123456",endLocation.latitude, endLocation.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
googleMapDic[@"url"] = urlString;
[maps addObject:googleMapDic];
}
//騰訊地圖
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"qqmap://"]]) {
NSMutableDictionary *qqMapDic = [NSMutableDictionary dictionary];
qqMapDic[@"title"] = @"騰訊地圖";
NSString *urlString = [[NSString stringWithFormat:@"qqmap://map/routeplan?from=我的位置&type=drive&tocoord=%f,%f&to=終點&coord_type=1&policy=0",endLocation.latitude, endLocation.longitude] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
qqMapDic[@"url"] = urlString;
[maps addObject:qqMapDic];
}
return maps;
}
這里只要傳入提供的坐標點盐股,就打包好了需要的信息钱豁。
什么,你說彈出疯汁?那玩意自己去寫牲尺,不想寫,自己去找涛目,不然就用系統(tǒng)的actionSheet秸谢。
#pragma mark LCActionSheetDelegate
-(void)actionSheet:(LCActionSheet *)actionSheet didClickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != -1) {
if (buttonIndex == 0) {
[self navAppleMap];
return;
}
NSDictionary *dic = self.maps[buttonIndex];
NSString *urlString = dic[@"url"];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
}
}
//蘋果地圖
- (void)navAppleMap
{
CLLocationCoordinate2D gps = [JZLocationConverter bd09ToWgs84:self.destinationCoordinate2D];
MKMapItem *currentLoc = [MKMapItem mapItemForCurrentLocation];
MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:gps addressDictionary:nil]];
NSArray *items = @[currentLoc,toLocation];
NSDictionary *dic = @{
MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving,
MKLaunchOptionsMapTypeKey : @(MKMapTypeStandard),
MKLaunchOptionsShowsTrafficKey : @(YES)
};
[MKMapItem openMapsWithItems:items launchOptions:dic];
}
最后結(jié)尾還有個小插曲,由于我們后臺給的目標經(jīng)緯度是百度坐標系霹肝,項目用的也是百度地圖估蹄,界面上展示是沒啥問題了,但是由于不同的地圖有自己的坐標系沫换,而要用它們進行導航臭蚁,那傳給它們的必須是標準的經(jīng)緯度坐標,這就蛋疼了讯赏,百度這坑爹只有提供了標準的轉(zhuǎn)成它自己的坐標系垮兑,而沒有提供反轉(zhuǎn)的方法,去官網(wǎng)開發(fā)者社區(qū)發(fā)帖漱挎,也沒用系枪,只是回答你沒有提供,所以我猜傳言百度地圖SDK是實習生寫的還是有一定的可靠性磕谅。
沒辦法私爷,只能求爺爺告奶奶雾棺,去查找對應的資料,還是找到一個第三方的轉(zhuǎn)換方法https://github.com/JackZhouCn/JZLocationConverter衬浑,但是仍然有一定的偏差捌浩,能接受的就接受吧。