Haritalar uygulamasını iOS 6'da aç


159

İOS 6'dan önce böyle bir URL açıldığında (Google) Haritalar uygulaması açılır:

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

Şimdi yeni Apple Haritalar uygulamasıyla, Mobil Safari Google Haritalar'a açılıyor. İOS 6 ile aynı davranışı nasıl başarabilirim? Haritalar uygulamasını program aracılığıyla nasıl açabilirim ve belirli bir konumu / adresi / aramayı / her neyse işaret etmesini nasıl sağlayabilirim?

Yanıtlar:


281

İşte resmi Apple yolu:

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

Araba kullanırken ya da konuma talimatları yürüyüş almak istiyorsanız, bir içerebilir mapItemForCurrentLocationile MKMapItemde dizide +openMapsWithItems:launchOptions:, ve uygun başlatma seçeneklerini ayarlamak.

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

Bundan elsesonra bir açıklamada orijinal iOS 5 ve düşük kodunuzu koruyabilirsiniz if. Eğer öğelerin sırasını tersine eğer Not openMapsWithItems:dizi sen koordinat yön alırsınız için geçerli konumunuz. MKMapItemGeçerli konum haritası öğesi yerine bir yapıyı geçerek iki konum arasında yol tarifi almak için kullanabilirsiniz . Bunu denemedim.

Son olarak, yol tarifleri almak istediğiniz bir adresiniz (dize olarak) varsa MKPlacemark, yoluyla bir coğrafi kod oluşturmak için geocoder'ı kullanın 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];

    }];
}

Kod iOS 6 için harika çalışıyor. İstediğimiz rota mevcut kullanıcı konumundan bir hedefe ise, o zaman geçmeye gerek yok currentLocationMapItem.
Philip007

1
Tombouctou koordinatlarını kullanmanız cevabı daha da iyi hale getirir :)
sachadso

+1 yalnızca iOS 6 olduğunu ve bir yedeğe ihtiyacınız olduğunu belirtmek için
Henrik Erlandsson 15:13

2
harita uygulamasından mevcut uygulamama nasıl gidebilirim?
Apple

1
Ne kadar şimdiye kadar seçtiğim elma haritaları uygulamasını açtığında seçtiğinde uyarı "yönleri bu konumlar arasında bulunamadı ios 6 bulunamadı" ve sonra hiçbir şey yapmıyor? Herhangi bir yardım
NaXir

80

Kendi sorumun cevabını buldum. Apple, haritalar URL biçimini burada belgeliyor . Aslında yerini alabilir gibi görünüyor maps.google.comile maps.apple.com.

Güncelleme: Aynı şey iOS 6'daki MobileSafari için de geçerli; bir bağlantıya dokunduğunuzda , önceki sürümlerde olduğu gibi http://maps.apple.com/?q=...bu aramayla Haritalar uygulamasını açar http://maps.google.com/?q=.... Bu çalışır ve yukarıda bağlantı verilen sayfada belgelenir.

GÜNCELLEME: Bu, URL biçimiyle ilgili sorumu yanıtlıyor. Ancak nevan king'in buradaki cevabı (aşağıya bakın) gerçek Haritalar API'sının mükemmel bir özetidir.


1
İlginç. Maps.apple.com'a bir tarayıcı açarsanız maps.google.com'a yönlendirir. Bunun ne kadar süreceğini merak ediyorum?
pir800

@ pir800 - Aslında iOS 6'da Safari'de maps.apple.com'a bir bağlantıya dokunursanız ne olacağını merak ediyordum. Denedim ve dokunduğunuzda Haritalar'a önceki iOS sürümlerinde olduğu gibi gidiyor maps.google.com adresine bir bağlantı. Web sitelerinin yazarlarının harita bağlantılarını maps.apple.com'a yönlendirip Haritalar'daki iOS'ta çalışmasını ancak diğer tüm istemcilerde normal şekilde çalışmasını sağlamak için Google haritalarına yönlendirdikleri iyi bir bahis olduğunu düşünüyorum. Ancak tüm harita bağlantılarımı maps.apple.com adresine yönlendirmeden önce bir şekilde doğrulamak istiyorum!
Tom Hamming

@ pir800 - Benim için, açılış maps.apple.com bir tarayıcıda beni alır apple.com/ios/maps . Belki de önceki yorumum arzulu bir düşüncedir.
Tom Hamming

Yani bir adresi veya koordinatı sorgulamaya çalışırsanız. Maps.apple.com/?q=los angeles, ca. adresini deneyin. Masaüstü makinenizde açabilirsiniz ve maps.google.com
adresine gönderilecektir

Bu sorguya geçiş modunu eklemenin bir yolu var mı? (yürüme / sürüş). web üzerinde herhangi bir referans bulamadı.
Lirik

41

Bunu yapmanın en iyi yolu, yeni iOS 6 yöntemini MKMapItem openInMapsWithLaunchOptions:launchOptions

Misal:

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

Bu, geçerli konumdan sürüş için navigasyonu başlatır.


1
Tamam, o MKMapItemzaman sahip olduğum tek adres olduğunda bir örnek almanın en kolay yolu nedir? Bu API, bu basit kullanım durumu için biraz karmaşık görünüyor.
Tom Hamming

MKPlacemark * endLocation = [[MKPlacemark ayır] initWithCoordinate: nil addressDictionary: yourAdressDictHere]; Dictonary'de bir adres verebilirsiniz
mariusLAN

7

Maps.apple.com url "şemasını" bulduğunuzu görüyorum. Eski cihazları otomatik olarak maps.google.com'a yönlendireceği için iyi bir seçimdir. Ancak iOS 6 için faydalanmak isteyebileceğiniz yeni bir sınıf var: MKMapItem .

İlginizi çeken iki yöntem:

  1. -openInMapsWithLaunchOptions: - Maps.app içinde açmak için bir MKMapItem örneğinde çağırın
  2. + openMapsWithItems: launchOptions: - bir dizi MKMapItem örneği açmak için MKMapItem sınıfında çağırın.

Yararlı görünüyor. Ancak kullanımı biraz daha karmaşık görünüyor; Mecbur init MKMapItembir ile MKPlacemarkbir enlem / boylam çiftini ve bir adres sözlüğünü sağlayarak olsun, hangi. Açmak daha basit görünüyor http://maps.apple.com/?q=1+infinite+loop+cupertino+ca. Tek MKMapItemyapmanız gereken Haritalar'da bir adres göstermek olduğunda kullanmanın bir avantajı var mı ?
Tom Hamming

Kullanmak istediğiniz MKMapItembir referansa zaten sahip değilseniz , bir başlatmanız gerekmez. Sadece, sınıf yöntemi kullanmak +openMapsWithItems:launchOptions:üzerine MKMapItemaynı şeyi yapmak.
Mark Adams

@MarkAdams bu sınıf yöntemi sınıfın bir dizi örneğini alır, bu yüzden evet en az bir tane başlatılmış olması gerekir.
Filip Radelic

Bu yüzden açmak için GPS koordinatlarına sahip olduğum, ancak adres olmadığında, MKMapItemAPI'yi kullanıyorum ve harita üzerinde "Bilinmeyen Konum" etiketli bir nokta bırakıyor. Konum için bir ad görüntülemesini sağlamanın bir yolu var mı? Adres sözlüğü seçeneklerinde bunun için hiçbir anahtar göremiyorum ...
Tom Hamming

5
@ Mr.Jefferson MKMapItem
matt

5

Swift'te tamamlanan nevan king'in çözümünü kullanan bir sınıf:

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= ... bağlantı kurulumunu kullanmanın önce eski cihazlarda safari tarayıcısını açmasını can sıkıcı buldum .

Uygulamanızı maps.apple.com'a referansla açan bir iOS 5 cihazı için adımlar şöyle görünür:

  1. app bir şey tıklayın ve maps.apple.com url atıfta
  2. safari bağlantıyı açar
  3. maps.apple.com sunucusu maps.google.com url'sine yönlendirir
  4. maps.google.com url'si yorumlanır ve google Haritalar uygulamasını açar.

(Çok açık ve kafa karıştırıcı) 2 ve 3. adımların kullanıcılar için can sıkıcı olduğunu düşünüyorum. Bu nedenle işletim sistemi sürümünü kontrol ediyorum ve cihazda maps.google.com veya maps.apple.com'u çalıştırıyorum (sırasıyla ios 5 veya ios 6 işletim sistemi sürümleri için).


Ben de öyle yapıyorum. En iyi yaklaşım gibi görünüyor.
Tom Hamming

3

Bu konudaki araştırmam beni şu sonuçlara götürdü:

  1. Maps.google.com'u kullanırsanız, haritayı her iOS için safari içinde açar.
  2. Maps.apple.com'u kullanırsanız haritayı ios 6'nın harita uygulamasında açar ve ayrıca ios 5 ile greate çalışır ve ios 5'te haritayı safari'de normal olarak açar.

3

Bunun yerine Google Haritalar'ı açmak (veya ikincil bir seçenek olarak sunmak) istiyorsanız, burada belgelenen comgooglemaps://ve comgooglemaps-x-callback://URL şemalarını kullanabilirsiniz .


3

URL'yi başlatmadan önce, URL'den herhangi bir özel karakteri kaldırın ve boşlukları + ile değiştirin. Bu size bazı baş ağrılarını kurtaracaktır:

    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'un cevabına dayanarak Swift 4 olarak güncellendi:

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

Harita kullanmamak, sadece programlı olarak bir UiButton eylemi kullanmak, bu benim için çok işe yaradı.

// 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!)

                }

Bu kodun bir kısmını biraz yayabilirsiniz. Örneğin, değişkeni bir sınıf seviyesi değişkeni olarak koydum, başka bir işlevi doldurdu ve sonra düğmeye basıldığında sadece değişkente olanı aldı ve bir URL'de kullanılmak üzere fırçaladı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.