iOS 無需SDK,一行代碼調(diào)用主流地圖

在開發(fā)中典鸡,有時候我們并不需要太過于復(fù)雜的地圖功能被廓,或許只需要調(diào)用系統(tǒng)地圖、高德萝玷、百度等主流地圖就可以完成我們所需要的功能伊者。比如調(diào)用三方地圖進行一個線路的導(dǎo)航、或者進行地點的標注间护。那么下面將會為大家介紹如何不集成高德、百度等地圖的SDK挖诸,達到在項目中調(diào)用其的效果汁尺。

調(diào)用系統(tǒng)地圖

調(diào)用iPhone系統(tǒng)地圖的話,我們需要導(dǎo)入一個框架多律,即:MapKit.framework

  • 地點標注
MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation];
MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:CLLocationCoordinate2DMake(self.lat.floatValue, self.lon.floatValue) addressDictionary:nil]]; //目的地坐標
toLocation.name = self.destination; //目的地名字
[toLocation openInMapsWithLaunchOptions:nil];
  • 線路導(dǎo)航
MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation];
MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:CLLocationCoordinate2DMake(self.lat.floatValue, self.lon.floatValue) addressDictionary:nil]]; //目的地坐標
    toLocation.name = self.destination; //目的地名字
[MKMapItem openMapsWithItems:@[currentLocation, toLocation] launchOptions:@{MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeWalking,MKLaunchOptionsShowsTrafficKey: [NSNumber numberWithBool:NO]}];

關(guān)于上面這個字典的參數(shù)痴突,給出如下注釋:

/**
         MKLaunchOptionsDirectionsModeKey   路線模式,常量
         MKLaunchOptionsDirectionsModeDriving  駕車模式
         MKLaunchOptionsDirectionsModeWalking 步行模式
         
         MKLaunchOptionsMapTypeKey  地圖類型狼荞,
         枚舉 MKMapTypeStandard :標準模式
         MKMapTypeSatellite :衛(wèi)星模式
         MKMapTypeHybrid  :混合模式
         
         MKLaunchOptionsMapCenterKey 中心點坐標辽装, CLLocationCoordinate2D類型
         MKLaunchOptionsMapSpanKey  地圖顯示跨度,MKCoordinateSpan 類型
         MKLaunchOptionsShowsTrafficKey 是否 顯示交通狀況相味,布爾型
         MKLaunchOptionsCameraKey   3D地圖效果拾积,MKMapCamera類型(注意:此屬性從iOS7及以后可用,前面的屬性從iOS6開始可用)
         */

效果圖:


Map.PNG

調(diào)用三方地圖的準備工作

當然除了系統(tǒng)地圖丰涉,三方地圖的開發(fā)文檔上也都給的有說明拓巧,這里不詳細解釋對應(yīng)的參數(shù),下面代碼中只挑一些必要的進行解釋一死。

  • 配置info.plist
    還有就是三方地圖不像系統(tǒng)地圖調(diào)起來這么方便肛度,而是需要在info.plist文件中添加一些參數(shù)(iOS9.0之后),當然我們的軟件想要打開三方的地圖投慈,首先要需要知道三方app中配置的 URL Schemes承耿,然后在我們的info.plist中添加對應(yīng)的字段,如下圖:


    info.plist.png
  • 判斷設(shè)備是否安裝對應(yīng)的地圖
    既然我們已經(jīng)獲取到了對應(yīng)地圖的 URL Schemes伪煤,那么判斷起來就異常簡單了加袋,以高德舉例

    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"iosamap://"]]) {
        NSLog(@"設(shè)備已安裝高德地圖");
    } else {
        NSLog(@"設(shè)備未安裝高德地圖");
    }

高德地圖

高德SDK文檔中給出的URL如下:

/*
必要參數(shù)的意思:sourceApplication:該app名字; poi name:目的地名稱带族;lat/lon:目的地經(jīng)緯度
dev 參數(shù)進行解釋:dev支持的值為"0"和"1"锁荔,即是否需要進行國測局坐標加密。 如果傳入的坐標已經(jīng)是國測局坐標則傳入0,如果傳入的是地球坐標阳堕,則該參數(shù)傳入1
*/
#define GaoDeNavUrl @"iosamap://navi?sourceApplication=%@&backScheme=myapp&poiname=%@&poiid=BGVIS&lat=%f&lon=%f&dev=0&style=2"
#define GaoDeGPSUrl @"iosamap://viewMap?sourceApplication=%@&poiname=%@&lat=%@&lon=%@&dev=0"

調(diào)用代碼如下:

NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *app_Name = [infoDictionary objectForKey:@"CFBundleName"];
//backScheme=myapp 這個參數(shù)也可以隨便設(shè)置跋理,如果用高德SDK的話,則需要按照api文檔進行配置
NSString *urlString;
if (self.mode == ShowMapModeGPS) {
    urlString = [NSString stringWithFormat:GaoDeGPSUrl, app_Name, self.destination, self.lat, self.lon];
} else {
    urlString = [NSString stringWithFormat:GaoDeNavUrl, app_Name, self.destination, self.lat.floatValue, self.lon.floatValue];
}
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

NSURL *url = [NSURL URLWithString:urlString];
[[UIApplication sharedApplication] openURL:url];

百度地圖

百度SDK文檔中給出的URL如下:

/*
百度地圖的參數(shù)意思就比較簡單了恬总,對mode做一個解釋前普,mode為調(diào)用地圖之后的導(dǎo)航方式,除了walking(步行)還有driving(駕車)和transit(公交)
origin=latlng:0,0  這個參數(shù)雖然意思上是要給一個當前坐標壹堰,但是可以隨意設(shè)置拭卿,這里設(shè)置兩個0,不影響導(dǎo)航
*/
#define BaiDuNavUrl @"baidumap://map/direction?origin=latlng:0,0|name:我的位置&destination=latlng:%@,%@|name:%@&mode=walking"
#define BaiDuGPSUrl @"baidumap://map/marker?location=%@,%@&title=我的位置&content=%@"

調(diào)用代碼如下:

NSString *urlString;
if (self.mode == ShowMapModeGPS) {
    urlString = [NSString stringWithFormat:BaiDuGPSUrl, self.lat, self.lon, self.destination];
} else {
    urlString = [NSString stringWithFormat:BaiDuNavUrl, self.lat, self.lon, self.destination];
}
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

NSURL *url = [NSURL URLWithString:urlString];
[[UIApplication sharedApplication] openURL:url];

騰訊地圖

騰訊地圖嘛贱纠,按照官網(wǎng)給的說明是還沒有支持Android和iOS


TX.png

不過這怎么能難住我們呢峻厚,我們只需要文檔中給的web的URL稍作修改即可,舉個例子谆焊,這個是官方給的地點標注的url

http://apis.map.qq.com/uri/v1/marker?marker=coord:39.892326,116.342763;title:超好吃冰激凌;addr:手帕口橋北鐵路道口&referer=myapp

我們稍作修改惠桃,如下

qqmap://map/marker?marker=coord:39.892326,116.342763;title:超好吃冰激凌;addr:手帕口橋北鐵路道口&referer=myapp

之后調(diào)用方式便跟高德和百度一樣

#define TXGPSUrl    @"qqmap://map/marker?marker=coord:%@,%@;title:%@;addr:%@"

NSString *urlString = [NSString stringWithFormat:TXGPSUrl, self.lat, self.lon, self.destination, self.destination];
urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    
NSURL *url = [NSURL URLWithString:urlString];
[[UIApplication sharedApplication] openURL:url];

結(jié)束語

  • 代碼是我封裝好的,上邊代碼中應(yīng)該沒有什么難理解的地方辖试。mode 是一個枚舉辜王,如下
typedef NS_ENUM(NSUInteger, ShowMapMode) {
    ShowMapModeGPS, //調(diào)用地圖,只顯示目標點
    ShowMapModeNavigation, //調(diào)用地圖罐孝,并直接進行導(dǎo)航
};
  • 關(guān)于騰訊地圖:由于騰訊地圖進行導(dǎo)航必須傳入起點坐標呐馆,而系統(tǒng)/高德/百度等地圖不需要,考慮到如果添加騰訊地圖的導(dǎo)航會影響該類的封裝性莲兢,這里便舍棄了騰訊地圖的直接導(dǎo)航功能(也有騰訊地圖用的比較少的原因汹来,個人認為)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市改艇,隨后出現(xiàn)的幾起案子俗慈,更是在濱河造成了極大的恐慌,老刑警劉巖遣耍,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闺阱,死亡現(xiàn)場離奇詭異,居然都是意外死亡舵变,警方通過查閱死者的電腦和手機酣溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纪隙,“玉大人赊豌,你說我怎么就攤上這事∶嘣郏” “怎么了碘饼?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我艾恼,道長住涉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任钠绍,我火速辦了婚禮舆声,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柳爽。我一直安慰自己媳握,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布磷脯。 她就那樣靜靜地躺著蛾找,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赵誓。 梳的紋絲不亂的頭發(fā)上腋粥,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音架曹,去河邊找鬼。 笑死闹瞧,一個胖子當著我的面吹牛绑雄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奥邮,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼万牺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洽腺?” 一聲冷哼從身側(cè)響起脚粟,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蘸朋,沒想到半個月后核无,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡藕坯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年团南,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼彪。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡吐根,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辐马,到底是詐尸還是另有隱情拷橘,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站冗疮,受9級特大地震影響萄唇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赌厅,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一穷绵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧特愿,春花似錦仲墨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毒嫡,卻和暖如春癌蚁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兜畸。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工努释, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咬摇。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓伐蒂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肛鹏。 傳聞我的和親對象是個殘疾皇子逸邦,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容