प्रोग्राम आईओएस 6 में मैप्स ऐप खोलें


159

IOS 6 से पहले, इस तरह एक URL खोलने से (Google) मैप्स ऐप खुल जाएगा:

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

अब नए एप्पल मैप्स के कार्यान्वयन के साथ, यह सिर्फ मोबाइल सफारी को गूगल मैप्स के लिए खोलता है। मैं iOS 6 के साथ समान व्यवहार कैसे पूरा कर सकता हूं? मैं मैप्स ऐप को प्रोग्रामेटिक रूप से कैसे खोल सकता हूं और क्या यह किसी विशिष्ट स्थान / पते / खोज / जो कुछ भी है, उसकी ओर इशारा करता है?

जवाबों:


281

यहाँ आधिकारिक एप्पल तरीका है:

// 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];
}

यदि आप स्थान पर ड्राइविंग या चलना निर्देश प्राप्त करना चाहते हैं, तो आप सरणी में एक के 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वर्तमान स्थान मानचित्र आइटम के बजाय किसी निर्माण को पास करके किसी भी दो स्थानों के बीच निर्देश प्राप्त करने के लिए इसका उपयोग कर सकते हैं । मैंने कोशिश नहीं की है।

अंत में, यदि आपके पास एक पता (एक स्ट्रिंग के रूप में) है जिसे आप दिशाओं के लिए चाहते हैं MKPlacemark, तो रास्ते से, बनाने के लिए जियोकोडर का उपयोग करें CLPlacemark

// 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
फिलिप ००।

1
तथ्य यह है कि आप Tombouctou निर्देशांक का इस्तेमाल किया जवाब सिर्फ बेहतर बनाता है :)
sachadso

+1 यह उल्लेख करने के लिए कि यह केवल iOS 6 है और आपको एक कमबैक की आवश्यकता है
हेनरिक एरलैंडसन

2
मैं मैप ऐप्स से अपने वर्तमान एप्लिकेशन पर कैसे नेविगेट कर सकता हूं?
Apple

1
जब मैं ऐप्पल मैप्स ऐप खोलता हूं तो वह कितना स्थान चुनता है यह अलर्ट दिखाता है "निर्देश इन स्थानों ios 6" के बीच नहीं पाया जा सकता है और फिर कुछ भी नहीं कर रहा है? कोई मदद
NaXir

80

मेरे ही सवाल का जवाब मिल गया। Apple अपने मैप्स URL फॉर्मेट को यहाँ दस्तावेज़ित करता है । ऐसा लगता है कि आप अनिवार्य रूप से जगह ले सकता है maps.google.comके साथ maps.apple.com

अपडेट: यह पता चला है कि iOS 6 पर मोबाइलसफरी में भी यही सच है; http://maps.apple.com/?q=...उस खोज के साथ मैप्स ऐप को खोलने के लिए एक लिंक पर टैप करना , उसी तरह http://maps.google.com/?q=...पिछले संस्करणों पर किया गया था। यह काम करता है और ऊपर लिंक किए गए पृष्ठ में प्रलेखित है।

अद्यतन: यह URL प्रारूप से संबंधित मेरे प्रश्न का उत्तर देता है। लेकिन nevan राजा के जवाब यहाँ (नीचे देखें) वास्तविक मैप्स एपीआई का एक बहुत अच्छा सारांश है।


1
दिलचस्प। यदि आप maps.apple.com पर ब्राउज़र खोलते हैं तो यह maps.google.com पर पुनर्निर्देशित करता है। मुझे आश्चर्य है कि यह कब तक चलेगा?
पाइर 800

@ pir800 - मैं वास्तव में सोच रहा था कि क्या होगा यदि आप सफारी 6 में आईओएस 6 में maps.apple.com के लिंक पर टैप करते हैं। मैंने इसे आज़माया, और यह मैप्स पर उसी तरह जाता है जैसे पिछले iOS वर्जन पर जब आपने टैप किया था maps.google.com का लिंक। मुझे लगता है कि यह एक अच्छा दांव है कि वे Google मानचित्रों पर पुनर्निर्देशित कर रहे हैं ताकि वेबसाइट लेखक maps.apple.com के लिए केवल मानचित्र लिंक को इंगित कर सकें और यह मैप्स में iOS पर काम कर सके लेकिन अन्य सभी क्लाइंट्स पर सामान्य रूप से काम करें। लेकिन मैं किसी भी तरह से सत्यापित करने से पहले अपने सभी मानचित्र लिंक को maps.apple.com पर इंगित करना चाहता हूं!
टॉम हैमिंग

@ pir800 - मेरे लिए, ब्राउज़र में maps.apple.com खोलना मुझे Apple.com/ios/maps पर ले जाता है । शायद मेरी पिछली टिप्पणी इच्छाधारी सोच है।
टॉम हैमिंग

मेरा मतलब था कि यदि आप किसी पते को क्वेरी करने या समन्वय करने का प्रयास करते हैं। Maps.apple.com/?q=los देवदूतों की कोशिश करो, ca. आप इसे अपने डेस्कटॉप मशीन पर खोल सकते हैं और यह
बजे

क्या उस क्वेरी में ट्रांज़िट मोड को जोड़ने का कोई तरीका है? (चलना / ड्राइविंग)। वेब पर इसका कोई संदर्भ नहीं मिल सका।
लिरिक

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जब मेरे पास एक पता है , तो एक उदाहरण प्राप्त करने का सबसे आसान तरीका क्या है ? यह एपीआई उस सरल उपयोग के मामले के लिए थोड़ा जटिल लगता है।
टॉम हैमिंग

MKPlacemark * endLocation = [[MKPlacemark आबंटित] initWithCoordinate: nil एड्रेसबार्ड: yourAdressDictHere]; आप एक निपुण डिक्टोनरी को हाथ में ले सकते हैं
मर्सलैन

7

मैं देख रहा हूं कि आपको maps.apple.com url "स्कीम" मिली। यह एक अच्छा विकल्प है क्योंकि यह पुराने उपकरणों को स्वचालित रूप से maps.google.com पर रीडायरेक्ट करेगा। लेकिन iOS 6 के लिए एक नया वर्ग है जिसका आप लाभ उठाना चाहते हैं: MKMapItem

दो विधियाँ जो आपकी रुचि के हैं:

  1. -openInMapsWithLaunchOptions: - इसे मैप्सऐप में खोलने के लिए MKMapItem इंस्टेंस पर कॉल करें
  2. + OpenMapsWithItems: launchOptions: - MKMapItem इंस्टेंस की एक सरणी खोलने के लिए इसे MKMapItem वर्ग पर कॉल करें।

यह उपयोगी लगता है। लेकिन यह भी उपयोग करने के लिए थोड़ा अधिक जटिल लगता है; आपके पास init MKMapItemएक है MKPlacemark, जो आपको एक अक्षांश / देशांतर जोड़ी और एक पता शब्दकोश प्रदान करके मिलता है। सिर्फ खोलने के लिए सरल लगता है http://maps.apple.com/?q=1+infinite+loop+cupertino+ca। वहाँ का उपयोग करने का लाभ यह है MKMapItemजब सब आप क्या करना चाहते मानचित्र में पता प्रदर्शित?
टॉम हैमिंग सेप

MKMapItemयदि आपको पहले से एक का संदर्भ नहीं है जिसे आप उपयोग करना चाहते हैं, तो आपको प्रारंभ नहीं करना है। बस कक्षा पद्धति का उपयोग करें, उसी कार्य +openMapsWithItems:launchOptions:को MKMapItemकरने के लिए।
मार्क एडम्स

@MarkAdams कि क्लास मेथड में क्लास के इंस्टेंस की एक सरणी होती है, इसलिए हाँ उसे कम से कम एक इनिशियलाइज़ होना चाहिए।
फिलिप रेडेलिक

इसलिए ऐसी स्थिति में जब मेरे पास जीपीएस को खोलने के लिए निर्देशांक होता है, लेकिन कोई पता नहीं, मैं MKMapItemएपीआई का उपयोग करता हूं और यह "अज्ञात स्थान" लेबल वाले नक्शे पर एक बिंदु को गिरा देता है। क्या स्थान के लिए नाम प्रदर्शित करने के लिए इसे प्राप्त करने का कोई तरीका है? मुझे पता शब्दकोश के लिए विकल्पों में इसके लिए कोई कुंजी नहीं
दिखती है

5
@ Mr.Jefferson MKMapItem के नाम संपत्ति सेट करें
मैट

5

यहाँ स्विफ्ट में पूरा हुआ नवन राजा के समाधान का उपयोग करने वाला एक वर्ग है:

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. आप एप्लिकेशन में कुछ क्लिक करते हैं और यह maps.apple.com url को संदर्भित करता है
  2. सफारी लिंक को खोलता है
  3. maps.apple.com सर्वर maps.google.com url पर रीडायरेक्ट करता है
  4. maps.google.com url की व्याख्या हो जाती है और Google मैप्स ऐप खुल जाता है।

मुझे लगता है कि (बहुत स्पष्ट और भ्रमित) चरण 2 और 3 उपयोगकर्ताओं को परेशान कर रहे हैं। इसलिए मैं ओएस संस्करण की जांच करता हूं और या तो डिवाइस पर maps.google.com या maps.apple.com चलाता हूं (सम्मान के लिए। ios 5 या ios 6 OS संस्करण)।


यही मैं भी कर रहा हूं। सबसे अच्छा दृष्टिकोण की तरह लगता है।
टॉम हैमिंग

3

इस मुद्दे पर मेरे शोध ने मुझे निम्नलिखित निष्कर्षों तक पहुँचाया:

  1. यदि आप maps.google.com का उपयोग करते हैं तो यह प्रत्येक आईओएस के लिए मानचित्र को सफारी में खोल देगा।
  2. यदि आप maps.apple.com का उपयोग करते हैं तो यह ios 6 के मानचित्र अनुप्रयोग में मानचित्र को खोलेगा और ios 5 के साथ भी काम करेगा और ios 5 में यह मानचित्र को सफारी में सामान्य रूप से खोलता है।

3

यदि आप इसके बजाय Google मानचित्र खोलना चाहते हैं (या एक द्वितीयक विकल्प के रूप में पेश करते हैं), तो आप यहाँ प्रलेखित URL 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

@ PJeremyMalouf के जवाब के आधार पर स्विफ्ट 4 को अपडेट किया गया:

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

मैप्स का उपयोग नहीं करना, बस प्रोग्रामेटिक रूप से यूआईबटन कार्रवाई का उपयोग करना, यह मेरे लिए बहुत अच्छा काम किया।

// 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 में उपयोग करने के लिए स्क्रब किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.