如何在iOS 6中启动具有特定地址的iOS Maps App? [英] How to launch iOS Maps App with specific address in iOS 6?

查看:141
本文介绍了如何在iOS 6中启动具有特定地址的iOS Maps App?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序,允许用户启动Google地图应用程序(Google或Apple)查看地址。 我曾经这样做过:

p>

  Address * address = [self.person.addresses objectAtIndex:0]; 

NSString * addressString = [NSString stringWithFormat:@%@%@%@%@,%@%@,
address.line1 == nil? @:address.line1,
address.line2 == nil? @:address.line2,
address.line3 == nil? @:address.line3,
address.city == nil? @:address.city,
address.state == nil? @:address.state,
address.zip == nil? @:address.zip];

NSString * mapsURL = [NSString stringWithFormat:@http://maps.google.com/maps?q=%@,[addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mapsURL]];

但是为了支持iOS 6,我将其更改为:

  Address * address = [self.person.addresses objectAtIndex:0]; 

NSString * addressString = [NSString stringWithFormat:@%@%@%@%@,%@%@,
address.line1 == nil? @:address.line1,
address.line2 == nil? @:address.line2,
address.line3 == nil? @:address.line3,
address.city == nil? @:address.city,
address.state == nil? @:address.state,
address.zip == nil? @:address.zip];

//检查iOS 6
类mapItemClass = [MKMapItem class];
if(mapItemClass&& [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions :)])
{
/ *
//创建一个MKMapItem传递给地图app
MKPlacemark * placemark = [[MKPlacemark alloc] initWithCoordinate:nil
addressDictionary:nil];

MKMapItem * mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem openInMapsWithLaunchOptions:nil];
* /

//我想要的是这样的:
MKMapItem * mapItem = [[MKMapItem alloc] initWithAddressQuery:addressString];
[mapItem openInMapsWithLaunchOptions:nil];
}
else
{
NSString * mapsURL = [NSString stringWithFormat:@http://maps.google.com/maps?q=%@,[addressString stringByAddingPercentEscapesUsingEncoding :NSUTF8StringEncoding]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mapsURL]];


$ / code>

基本上,用原始地址(no ABPersonRef 的或任何东西)我需要在Apple Maps中打开位置。 Google曾经这样做很好。

我尝试了从 maps.google.com 地图的简单切换。 apple.com ,但在iOS 5中打开Goog​​le Maps网络应用程序 - 我不想!有一个非常好的本地应用程序。

解决方案

找到答案此处。它通过使用 CLGeocoder 类来完成:

  //检查iOS 6 
类mapItemClass = [MKMapItem class];
if(mapItemClass&& [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions :)])
{
CLGeocoder * geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:addressString
completionHandler:^(NSArray * placemarks,NSError * error){

//将CLPlacemark转换为MKPlacemark
//注意:检查失败的地理编码没有错误
CLPlacemark * geocodedPlacemark = [placemarks objectAtIndex:0];
MKPlacemark * placemark = [[MKPlacemark alloc]
initWithCoordinate:geocodedPlacemark.location.coordinate
addressDictionary:geocodedPlacemark.addressDictionary];

//创建地图项以传递给地图应用的地理编码地址
MKMapItem * mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
[mapItem setName:geocodedPlacemark.name];

//将方向模式设置为驾驶
//可以使用MKLaunchOptionsDirectionsModeWalking来代替
NSDictionary * launchOptions = @ {MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving};

//获取当前用户位置MKMapItem
MKMapItem * currentLocationMapItem = [MKMapItem mapItemForCurrentLocation];

//将当前位置和目标地图项目传递给地图应用程序
//在launchOptions字典中设置方向模式
[MKMapItem openMapsWithItems:@ [currentLocationMapItem,mapItem] launchOptions:launchOptions];

}];
}
// iOS 4/5:
else
{
NSString * mapsURL = [NSString stringWithFormat:@http://maps.google.com/ maps?q =%@,[addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
...


I have an app in which I allow users to launch the Maps App (Google or Apple) to view an address.

I used to do this:

Address *address = [self.person.addresses objectAtIndex:0]; 

NSString *addressString = [NSString stringWithFormat:@"%@ %@ %@ %@, %@ %@",
                                   address.line1 == nil ? @"" : address.line1,
                                   address.line2 == nil ? @"" : address.line2,
                                   address.line3 == nil ? @"" : address.line3,
                                   address.city == nil ? @"" : address.city,
                                   address.state == nil ? @"" : address.state,
                                   address.zip == nil ? @"" : address.zip];

NSString *mapsURL = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", [addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:mapsURL]];

But to support iOS 6, I've changed it to this:

Address *address = [self.person.addresses objectAtIndex:0]; 

        NSString *addressString = [NSString stringWithFormat:@"%@ %@ %@ %@, %@ %@",
                                   address.line1 == nil ? @"" : address.line1,
                                   address.line2 == nil ? @"" : address.line2,
                                   address.line3 == nil ? @"" : address.line3,
                                   address.city == nil ? @"" : address.city,
                                   address.state == nil ? @"" : address.state,
                                   address.zip == nil ? @"" : address.zip];

        // Check for iOS 6
        Class mapItemClass = [MKMapItem class];
        if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
        {
            /*
            // Create an MKMapItem to pass to the Maps app
            MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:nil
                                                           addressDictionary:nil];

            MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
            [mapItem openInMapsWithLaunchOptions:nil];
            */

            // I want something like this:
            MKMapItem *mapItem = [[MKMapItem alloc] initWithAddressQuery:addressString];
            [mapItem openInMapsWithLaunchOptions:nil];
        }
        else
        {
            NSString *mapsURL = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", [addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mapsURL]];

        }

Basically, with the raw address (no ABPersonRef's or anything) I need to open the location in Apple Maps. Google used to do this just fine.

I've tried the simple switch from maps.google.com to maps.apple.com but in iOS 5 it opens to Google Maps web app -- which I don't want! There's a perfectly good native app.

解决方案

Found the answer here. It is accomplished by using the CLGeocoder class:

// Check for iOS 6
    Class mapItemClass = [MKMapItem class];
    if (mapItemClass && [mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
    {
        CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        [geocoder geocodeAddressString:addressString
                     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 4/5:
    else
    {
        NSString *mapsURL = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", [addressString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        ...

这篇关于如何在iOS 6中启动具有特定地址的iOS Maps App?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆