3

ユーザーがマップ アプリ (Google または Apple) を起動して住所を表示できるようにするアプリがあります。

私はこれをやっていた:

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

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

        }

基本的に、生の住所 (noABPersonRefなど) を使用して、Apple Maps でその場所を開く必要があります。Googleはこれをうまくやっていた。

maps.google.comからへの簡単な切り替えを試みましたmaps.apple.comが、iOS 5 では Google マップ Web アプリが開きます。これは望ましくありません。完全に優れたネイティブ アプリがあります。

4

1 に答える 1

4

ここで答えを見つけました。これは、次のCLGeocoderクラスを使用して実現されます。

// 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]];
        ...
于 2012-11-23T20:13:48.077 に答える