在iOS 6的编程方式打开地图应用(Programmatically open Maps app i

2019-06-18 05:33发布

上一页到iOS 6,打开这样的URL将打开(谷歌)地图应用:

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

现在,随着新的苹果地图的实现,这只是打开移动Safari浏览器谷歌地图。 我怎样才能做到与iOS 6相同的行为? 如何编程方式打开地图应用,并将它指向一个特定位置/地址/搜索/什么?

Answer 1:

下面是苹果官方的方法:

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

如果你想获得驾车或步行指示的位置,你可以包括mapItemForCurrentLocationMKMapItem阵列中的+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];

    }];
}


Answer 2:

找到了答案,以我自己的问题。 苹果记录其地图URL格式在这里 。 它看起来像你基本上可以代替maps.google.commaps.apple.com

更新:原来,同样是在MobileSafari在iOS 6上真实的; 攻链接到http://maps.apple.com/?q=...打开与搜索的地图应用程序,以同样的方式http://maps.google.com/?q=...没以前版本。 这个工程在上面链接的页面进行了说明。

更新:这个回答我有关的URL格式问题。 但是妮娃王的答案在这里 (见下文)是实际的地图API的一个很好的总结。



Answer 3:

要做到这一点,最好的方法是调用新的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];

这将启动导航从当前位置行驶。



Answer 4:

我看你找到了maps.apple.com网址“方案”。 这是一个很好的选择,因为它会自动重定向旧设备到maps.google.com。 但对于iOS 6的存在,你可能想利用的一个新的类: MKMapItem 。

两种方法是您感兴趣的:

  1. -openInMapsWithLaunchOptions: -调用它的MKMapItem比如在Maps.app打开它
  2. + openMapsWithItems:launchOptions: -调用它MKMapItem类打开MKMapItem实例的数组。


Answer 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)
}


Answer 6:

我发现它烦人,使用http://maps.apple.com?q= ...链路建立在旧设备首次打开Safari浏览器。

因此,对于在iOS 5设备打开你的应用程序有一个参考maps.apple.com的步骤是这样的:

  1. 您单击应用程序的东西,它是指maps.apple.com网址
  2. Safari浏览器打开该链接
  3. 在maps.apple.com服务器重定向到maps.google.com网址
  4. maps.google.com的URL被解释并打开谷歌地图应用。

我认为,(很明显和混乱)步骤2和3是恼人的用户。 因此,我检查操作系统版本,要么在设备上运行maps.google.com或maps.apple.com(对于RESP。IOS 5或6 IOS OS的版本)。



Answer 7:

我对这个问题的研究使我得出以下结论:

  1. 如果你使用maps.google.com,然后它会在Safari为每部iOS打开地图。
  2. 如果你使用maps.apple.com那么将在iOS 6中的地图应用程序中打开地图,也运行马丽娟与iOS 5,并在iOS 5中它打开地图,如野生动物园正常。


Answer 8:

如果你想打开谷歌地图,而不是(或提供作为第二选项),你可以使用comgooglemaps://comgooglemaps-x-callback://记录URL方案在这里 。



Answer 9:

启动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];
        }


Answer 10:

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

// K,



Answer 11:

更新斯威夫特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)
}


Answer 12:

不使用的地图,只是以编程方式使用一个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中使用。



文章来源: Programmatically open Maps app in iOS 6