แอปเปิดแผนที่โดยใช้โปรแกรมใน iOS 6


159

ก่อนหน้า iOS 6 การเปิด URL เช่นนี้จะเปิดแอป (Google) Maps:

NSURL *url = [NSURL URLWithString:@"http://maps.google.com/?q=New+York"];
[[UIApplication sharedApplication] openURL:url];

ขณะนี้มีการใช้งาน Apple Maps ใหม่เพียงเปิด Mobile Safari ไปที่ Google Maps ฉันจะทำพฤติกรรมเดียวกันกับ iOS 6 ได้อย่างไร ฉันจะเปิดแอพ Maps โดยทางโปรแกรมได้อย่างไรและชี้ไปยังตำแหน่ง / ที่อยู่ / การค้นหา / อะไรก็ตาม

คำตอบ:


281

นี่คือวิธีการของ Apple อย่างเป็นทางการ:

// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) 
{
    // Create an MKMapItem to pass to the Maps app
    CLLocationCoordinate2D coordinate = 
                CLLocationCoordinate2DMake(16.775, -3.009);
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate 
                                            addressDictionary:nil];
    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
    [mapItem setName:@"My Place"];
    // Pass the map item to the Maps app
    [mapItem openInMapsWithLaunchOptions:nil];
}

หากคุณต้องการรับคำแนะนำในการขับรถหรือเดินเท้าไปยังสถานที่นั้นคุณสามารถรวม a mapItemForCurrentLocationไว้MKMapItemในอาร์เรย์+openMapsWithItems:launchOptions:และตั้งค่าตัวเลือกการเปิดใช้งานอย่างเหมาะสม

// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) 
{
    // Create an MKMapItem to pass to the Maps app
    CLLocationCoordinate2D coordinate = 
                CLLocationCoordinate2DMake(16.775, -3.009);
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate 
                                            addressDictionary:nil];
    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
    [mapItem setName:@"My Place"];

    // Set the directions mode to "Walking"
    // Can use MKLaunchOptionsDirectionsModeDriving instead
    NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeWalking};
    // Get the "Current User Location" MKMapItem
    MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];
    // Pass the current location and destination map items to the Maps app
    // Set the direction mode in the launchOptions dictionary
    [MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem] 
                    launchOptions:launchOptions];
}

คุณสามารถรักษา iOS 5 เดิมของคุณและรหัสที่ลดลงในคำสั่งหลังจากนั้นelse ifโปรดทราบว่าหากคุณย้อนกลับลำดับของรายการในopenMapsWithItems:อาร์เรย์คุณจะได้รับคำแนะนำจากพิกัดไปยังตำแหน่งปัจจุบันของคุณ คุณอาจใช้เพื่อขอเส้นทางระหว่างสถานที่สองแห่งโดยผ่านการสร้างMKMapItemแทนรายการแผนที่ที่ตั้งปัจจุบัน ฉันไม่ได้ลองเลย

สุดท้ายหากคุณมีที่อยู่ (เป็นสตริง) ที่คุณต้องการเส้นทางไปใช้ Geocoder เพื่อสร้างโดยวิธีการMKPlacemarkCLPlacemark

// Check for iOS 6
Class mapItemClass = [MKMapItem class];
if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:@"Piccadilly Circus, London, UK" 
        completionHandler:^(NSArray *placemarks, NSError *error) {

        // Convert the CLPlacemark to an MKPlacemark
        // Note: There's no error checking for a failed geocode
        CLPlacemark *geocodedPlacemark = [placemarks objectAtIndex:0];
        MKPlacemark *placemark = [[MKPlacemark alloc]
                                  initWithCoordinate:geocodedPlacemark.location.coordinate
                                  addressDictionary:geocodedPlacemark.addressDictionary];

        // Create a map item for the geocoded address to pass to Maps app
        MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
        [mapItem setName:geocodedPlacemark.name];

        // Set the directions mode to "Driving"
        // Can use MKLaunchOptionsDirectionsModeWalking instead
        NSDictionary *launchOptions = @{MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving};

        // Get the "Current User Location" MKMapItem
        MKMapItem *currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];

        // Pass the current location and destination map items to the Maps app
        // Set the direction mode in the launchOptions dictionary
        [MKMapItem openMapsWithItems:@[currentLocationMapItem, mapItem] launchOptions:launchOptions];

    }];
}

รหัสใช้งานได้ดีสำหรับ iOS 6 เวิกล่าวถึง currentLocationMapItemแต่ถ้าเส้นทางที่เราต้องการอยู่ห่างจากที่ตั้งของผู้ใช้ปัจจุบันไปยังปลายทางแล้วไม่จำเป็นต้องผ่านใน
Philip007

1
ความจริงที่ว่าคุณใช้พิกัด Tombouctou ก็ทำให้คำตอบที่ดียิ่งขึ้น :)
sachadso

+1 สำหรับการกล่าวถึงว่าเป็น iOS 6 เท่านั้นและคุณต้องการทางเลือก
Henrik Erlandsson

2
ฉันจะนำทางไปยังแอปพลิเคชันปัจจุบันของฉันจากแอพแผนที่ได้อย่างไร
Apple

1
สถานที่ใดที่ฉันเคยเลือกเมื่อเปิดแอปพลิเคชั่นแผนที่แอปเปิ้ลจะแสดงข้อความแจ้งเตือน "ไม่พบเส้นทางระหว่างตำแหน่งที่ตั้งเหล่านี้ iOS 6" จากนั้นจึงไม่ทำอะไรเลย ความช่วยเหลือใด ๆ
NaXir

80

พบคำตอบสำหรับคำถามของฉันเอง เอกสารของแอปเปิ้ลแมปรูปแบบ URL ที่นี่ ดูเหมือนว่าคุณเป็นหลักสามารถแทนที่ด้วยmaps.google.commaps.apple.com

อัปเดต:ปรากฎว่าสิ่งนี้เป็นจริงใน MobileSafari บน iOS 6; แตะที่ลิงค์เพื่อhttp://maps.apple.com/?q=...เปิดแอป Maps ด้วยการค้นหาเช่นเดียวhttp://maps.google.com/?q=...กับในเวอร์ชันก่อนหน้า ใช้งานได้และมีการบันทึกไว้ในหน้าที่ลิงก์ด้านบน

UPDATE: นี่ตอบคำถามของฉันเกี่ยวกับรูปแบบ URL แต่คำตอบของ nevan king ที่นี่ (ดูด้านล่าง) เป็นบทสรุปที่ยอดเยี่ยมเกี่ยวกับ Maps API ที่แท้จริง


1
น่าสนใจ หากคุณเปิดเบราว์เซอร์ไปที่ maps.apple.com เบราว์เซอร์จะเปลี่ยนเส้นทางไปที่ maps.google.com ฉันสงสัยว่าจะใช้เวลานานเท่าไร
pir800

@ pir800 - ฉันแค่สงสัยว่าจะเกิดอะไรขึ้นถ้าคุณแตะลิงค์ไปที่ maps.apple.com ใน Safari บน iOS 6 ฉันลองแล้วมันจะไปที่ Maps เหมือนกับที่เคยทำใน iOS เวอร์ชันก่อนหน้านี้เมื่อคุณแตะ ลิงก์ไปยัง maps.google.com ฉันคิดว่ามันเป็นสิ่งที่ดีที่พวกเขากำลังเปลี่ยนเส้นทางไปยัง Google maps เพื่อให้ผู้เขียนเว็บไซต์สามารถชี้ลิงค์แผนที่ไปที่ maps.apple.com และใช้งานได้บน iOS ใน Maps แต่ทำงานได้ตามปกติกับลูกค้ารายอื่น ๆ แต่ฉันต้องการยืนยันว่าอย่างใดก่อนที่จะเปลี่ยนลิงก์แผนที่ทั้งหมดของฉันให้ชี้ไปที่ maps.apple.com!
Tom Hamming

@ pir800 - สำหรับผมเปิดmaps.apple.comในเบราว์เซอร์พาฉันไปapple.com/ios/maps บางทีความคิดเห็นก่อนหน้าของฉันอาจเป็นการนึกอยาก
Tom Hamming

ฉันหมายถึงถ้าคุณพยายามค้นหาที่อยู่หรือประสานงาน ลอง maps.apple.com/?q=los angeles, แคลิฟอร์เนีย คุณสามารถเปิดมันบนเครื่องเดสก์ท็อปของคุณและมันจะส่งต่อไปยัง maps.google.com
pir800

มีวิธีเพิ่มโหมดการขนส่งในแบบสอบถามนั้นหรือไม่ (เดิน / ขับรถ) ไม่พบการอ้างอิงใด ๆ บนเว็บ
Lirik

41

วิธีที่ดีที่สุดที่จะทำคือเรียกวิธีการ iOS 6 ใหม่ MKMapItem openInMapsWithLaunchOptions:launchOptions

ตัวอย่าง:

CLLocationCoordinate2D endingCoord = CLLocationCoordinate2DMake(40.446947, -102.047607);
MKPlacemark *endLocation = [[MKPlacemark alloc] initWithCoordinate:endingCoord addressDictionary:nil];
MKMapItem *endingItem = [[MKMapItem alloc] initWithPlacemark:endLocation];

NSMutableDictionary *launchOptions = [[NSMutableDictionary alloc] init];
[launchOptions setObject:MKLaunchOptionsDirectionsModeDriving forKey:MKLaunchOptionsDirectionsModeKey];

[endingItem openInMapsWithLaunchOptions:launchOptions];

นี่จะเป็นการเริ่มการนำทางสำหรับการขับรถจากตำแหน่งปัจจุบัน


1
ตกลงดังนั้นวิธีที่ง่ายที่สุดในการรับอินสแตนซ์MKMapItemเมื่อฉันมีที่อยู่คืออะไร? API นี้ดูเหมือนซับซ้อนเล็กน้อยสำหรับกรณีการใช้งานที่เรียบง่าย
Tom Hamming

MKPlacemark * endLocation = [[MKPlacemark จัดสรร] initWithCoordinate: ไม่มีที่อยู่พจนานุกรม: yourAdressDictHere]; คุณสามารถส่งที่อยู่ Dictonary ใน
mariusLAN

7

ฉันเห็นคุณพบ maps.apple.com url "โครงร่าง" เป็นตัวเลือกที่ดีเพราะจะเปลี่ยนเส้นทางอุปกรณ์เก่าไปยัง maps.google.com โดยอัตโนมัติ แต่สำหรับ iOS 6 มีระดับใหม่ที่คุณอาจต้องการที่จะใช้ประโยชน์จาก: MKMapItem

สองวิธีที่คุณสนใจ:

  1. -openInMapsWithLaunchOptions: - เรียกมันบนอินสแตนซ์ MKMapItem เพื่อเปิดใน Maps.app
  2. + openMapsWithItems: launchOptions: - เรียกมันในคลาส MKMapItem เพื่อเปิดอาร์เรย์ของอินสแตนซ์ MKMapItem

นั่นดูมีประโยชน์ แต่มันก็ดูเหมือนจะซับซ้อนกว่าเล็กน้อยในการใช้; คุณต้องinit MKMapItemใช้แอพMKPlacemarkซึ่งจะได้รับโดยการจัดหาคู่ละติจูด / ลองจิจูดและพจนานุกรมที่อยู่ http://maps.apple.com/?q=1+infinite+loop+cupertino+caดูเหมือนง่ายเพียงแค่เปิด มีประโยชน์ที่จะใช้MKMapItemเมื่อสิ่งที่คุณต้องการทำคือการแสดงที่อยู่ในแผนที่?
Tom Hamming

คุณไม่จำเป็นต้องเริ่มต้นMKMapItemถ้าคุณยังไม่มีการอ้างอิงถึงสิ่งที่คุณต้องการใช้ เพียงแค่ใช้วิธีการเรียนที่+openMapsWithItems:launchOptions:เกี่ยวกับการMKMapItemที่จะทำในสิ่งเดียวกัน
Mark Adams

@ MarkAdams วิธีการเรียนใช้อาร์เรย์ของอินสแตนซ์ของคลาส 'ดังนั้นเขาต้องมีอย่างน้อยหนึ่งเริ่มต้น
Filip Radelic

ดังนั้นในสถานการณ์ที่เมื่อฉันเปิดพิกัด GPS แต่ไม่มีที่อยู่ฉันใช้MKMapItemAPI และมันลดจุดบนแผนที่ที่มีป้ายกำกับว่า "ตำแหน่งที่ไม่รู้จัก" มีวิธีที่จะให้มันแสดงชื่อของที่ตั้งหรือไม่? ฉันไม่เห็นปุ่มใด ๆ นี้ในตัวเลือกสำหรับการพจนานุกรมที่อยู่ ...
ทอม Hamming

5
@ Mr.Jefferson ตั้งชื่อทรัพย์สินของ MKMapItem
matt

5

นี่คือคลาสที่ใช้โซลูชันของ nevan king เสร็จสมบูรณ์ใน Swift:

class func openMapWithCoordinates(theLon:String, theLat:String){

            var coordinate = CLLocationCoordinate2DMake(CLLocationDegrees(theLon), CLLocationDegrees(theLat))

            var placemark:MKPlacemark = MKPlacemark(coordinate: coordinate, addressDictionary:nil)

            var mapItem:MKMapItem = MKMapItem(placemark: placemark)

            mapItem.name = "Target location"

            let launchOptions:NSDictionary = NSDictionary(object: MKLaunchOptionsDirectionsModeDriving, forKey: MKLaunchOptionsDirectionsModeKey)

            var currentLocationMapItem:MKMapItem = MKMapItem.mapItemForCurrentLocation()

            MKMapItem.openMapsWithItems([currentLocationMapItem, mapItem], launchOptions: launchOptions)
}

4

ฉันพบว่ามันน่ารำคาญที่การใช้http://maps.apple.com?q= ... การตั้งค่าลิงค์จะเปิดเบราว์เซอร์ซาฟารีก่อนที่อุปกรณ์รุ่นเก่า

ดังนั้นสำหรับอุปกรณ์ iOS 5 ที่เปิดแอปของคุณโดยมีการอ้างอิงถึง maps.apple.com ขั้นตอนมีลักษณะดังนี้:

  1. คุณคลิกที่บางสิ่งบางอย่างในแอพและมันหมายถึง url maps.apple.com
  2. ซาฟารีเปิดลิงก์
  3. เซิร์ฟเวอร์ maps.apple.com เปลี่ยนเส้นทางไปยัง maps.google.com url
  4. maps.google.com url ตีความและเปิดแอป Google Maps

ฉันคิดว่าขั้นตอนที่ 2 และ 3 น่ารำคาญมากสำหรับผู้ใช้ ดังนั้นฉันจะตรวจสอบเวอร์ชั่นของระบบปฏิบัติการและเรียกใช้ maps.google.com หรือ maps.apple.com บนอุปกรณ์ (สำหรับรุ่น iOS 5 หรือ iOS 6 OS)


นั่นคือสิ่งที่ฉันทำ ดูเหมือนว่าวิธีที่ดีที่สุด
Tom Hamming

3

การวิจัยของฉันเกี่ยวกับปัญหานี้ทำให้ฉันสรุปได้ดังต่อไปนี้:

  1. หากคุณใช้ maps.google.com จากนั้นจะเปิดแผนที่เป็นซาฟารีสำหรับทุก ๆ iOS
  2. ถ้าคุณใช้ maps.apple.com แล้วมันจะเปิดแผนที่ในแอปพลิเคชั่นแผนที่ของ iOS 6 และยังทำงานได้ดีกับ ios 5 และใน iOS 5 มันเปิดแผนที่ตามปกติในซาฟารี

3

หากคุณต้องการที่จะเปิด Google Maps แทน (หรือข้อเสนอเป็นตัวเลือกรอง), คุณสามารถใช้comgooglemaps://และcomgooglemaps-x-callback://แผนการ URL เอกสารที่นี่


3

ก่อนเรียกใช้ url ให้ลบอักขระพิเศษใด ๆ จาก url และแทนที่ช่องว่างด้วย + วิธีนี้จะช่วยให้คุณปวดหัว:

    NSString *mapURLStr = [NSString stringWithFormat: @"http://maps.apple.com/?q=%@",@"Limmattalstrasse 170, 8049 Zürich"];

    mapURLStr = [mapURLStr stringByReplacingOccurrencesOfString:@" " withString:@"+"];
    NSURL *url = [NSURL URLWithString:[mapURLStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
    if ([[UIApplication sharedApplication] canOpenURL:url]){
            [[UIApplication sharedApplication] openURL:url];
        }

2
NSString *address = [NSString stringWithFormat:@"%@ %@ %@ %@"
                             ,[dataDictionary objectForKey:@"practice_address"]
                             ,[dataDictionary objectForKey:@"practice_city"]
                             ,[dataDictionary objectForKey:@"practice_state"]
                             ,[dataDictionary objectForKey:@"practice_zipcode"]];


        NSString *mapAddress = [@"http://maps.apple.com/?q=" stringByAppendingString:[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

        NSLog(@"Map Address %@",mapAddress);

        [objSpineCustomProtocol setUserDefaults:mapAddress :@"webSiteToLoad"];

        [self performSegueWithIdentifier: @"provider_to_web_loader_segue" sender: self];

// VKJ


2

อัปเดตเป็น Swift 4 ตามคำตอบของ @ PJeremyMalouf:

private func navigateUsingAppleMaps(to coords:CLLocation, locationName: String? = nil) {
    let placemark = MKPlacemark(coordinate: coords.coordinate, addressDictionary:nil)
    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = locationName
    let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving]
    let currentLocationMapItem = MKMapItem.forCurrentLocation()

    MKMapItem.openMaps(with: [currentLocationMapItem, mapItem], launchOptions: launchOptions)
}

1

ไม่ใช้แผนที่เพียงใช้ UiButton แอ็คชั่นโดยทางโปรแกรมมันใช้งานได้ดีสำหรับฉัน

// Button triggers the map to be presented.

@IBAction func toMapButton(sender: AnyObject) {

//Empty container for the value

var addressToLinkTo = ""

//Fill the container with an address

self.addressToLinkTo = "http://maps.apple.com/?q=111 Some place drive, Oak Ridge TN 37830"

self.addressToLinkTo = self.addressToLinkTo.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!

let url = NSURL(string: self.addressToLinkTo)
UIApplication.sharedApplication().openURL(url!)

                }

คุณสามารถกระจายรหัสบางส่วนออกไปเล็กน้อย ตัวอย่างเช่นฉันใส่ตัวแปรเป็นตัวแปรระดับคลาสมีฟังก์ชั่นอื่นเติมให้และจากนั้นเมื่อกดปุ่มก็แค่เอาสิ่งที่อยู่ในตัวแปรและขัดมันเพื่อใช้ใน URL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.