6

我想从 iOS < 6 更新使用 Google 地图的应用程序。我的应用程序在地图上有很多大头针,当用户点击其中一个时,iPhone 会像共享应用程序一样调用 Maps,以使用本地 Maps App 从他当前位置和目的地获取方向。在 iOS 6 中,同样的说明(在下面发布)显然会打开 Safari 而不是 Google Maps。我想编写一个 if 循环来检查设备上安装的 iOS:如果 < 6,没有任何改变,如果 iOS > 6 则.....(打开新的苹果地图并在那里获取方向)。

有人可以帮助我吗?

这里是 iOS 6 之前的动作

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control {

    [self.navigationController pushViewController:[[UIViewController alloc] init] animated:YES];


    NSString* addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude];

    NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];  
    [[UIApplication sharedApplication] openURL:url];



}
4

5 回答 5

14

我建议使用 [MKMapItem openMapsWithItems:] 而不是通过 iOS 6 中的 URL 打开地图应用程序。如果使用 URL,您将无法传递“当前位置”并且将失去进行转弯的能力导航。MKMapItem 具有当前位置的特定项目,当通过时,将使用当前位置作为源地址打开地图,从而启用逐向导航。

- (void)openMapsWithDirectionsTo:(CLLocationCoordinate2D)to {
    Class itemClass = [MKMapItem class];
    if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
        MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation];
        MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[[MKPlacemark alloc] initWithCoordinate:to addressDictionary:nil] autorelease]];
        toLocation.name = @"Destination";
        [MKMapItem openMapsWithItems:[NSArray arrayWithObjects:currentLocation, toLocation, nil]
                       launchOptions:[NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:MKLaunchOptionsDirectionsModeDriving, [NSNumber numberWithBool:YES], nil]
                                                                 forKeys:[NSArray arrayWithObjects:MKLaunchOptionsDirectionsModeKey, MKLaunchOptionsShowsTrafficKey, nil]]];
        [toLocation release];
    } else {
        NSMutableString *mapURL = [NSMutableString stringWithString:@"http://maps.google.com/maps?"];
        [mapURL appendFormat:@"saddr=Current Location"];
        [mapURL appendFormat:@"&daddr=%f,%f", to.latitude, to.longitude];
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[mapURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];
    }
}
于 2012-10-08T21:41:29.610 回答
4

我使用了像下面发布的这样的预处理器代码来定义 if 循环的条件。

#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

然后:

if (SYSTEM_VERSION_LESS_THAN(@"6.0")) {
         NSString* addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude];
         NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
         [[UIApplication sharedApplication] openURL:url];
    }

else {
        NSString* addr = [NSString stringWithFormat:@"http://maps.apple.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude];
        NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        [[UIApplication sharedApplication] openURL:url];


    }

它似乎工作再见!

于 2012-09-30T09:54:59.797 回答
1

接受的答案对我不起作用。当前位置需要使用正确的语言,并且 ios6 版本没有正确加载。对我来说,以下工作。

NSString *destinationAddress = @"Amsterdam";

Class itemClass = [MKMapItem class];
if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:destinationAddress completionHandler:^(NSArray *placemarks, NSError *error) {
        if([placemarks count] > 0) {

            MKPlacemark *placeMark = [[MKPlacemark alloc] initWithPlacemark:[placemarks objectAtIndex:0]];

            MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:placeMark];

            MKMapItem *mapItem2 = [MKMapItem mapItemForCurrentLocation];


            NSArray *mapItems = @[mapItem, mapItem2];

            NSDictionary *options = @{
        MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,
        MKLaunchOptionsMapTypeKey:
            [NSNumber numberWithInteger:MKMapTypeStandard],
        MKLaunchOptionsShowsTrafficKey:@YES
            };

            [MKMapItem openMapsWithItems:mapItems launchOptions:options];

        } else {
            //error nothing found
        }
    }];
    return;
} else {

    NSString *sourceAddress = [LocalizedCurrentLocation currentLocationStringForCurrentLanguage];

    NSString *urlToOpen = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=%@&daddr=%@",
                 [sourceAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
                 [destinationAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlToOpen]];
}

对于 ios5,我使用这篇文章http://www.martip.net/blog/localized-current-location-string-for-iphone-apps中的 LocalizedCurrentLocation

对于 ios6,我使用 CLGeocoder 获取地标,然后用它和当前位置打开地图。

记得添加 CoreLocation.framework 和 MapKit.framework

于 2012-12-06T12:11:06.693 回答
1

Swift 2.0兼容。

我还没有找到任何详尽的答案。

/**
Try to open google maps with navigation feature and with given coordinates

- parameter latitude:        destination latitude
- parameter longitude:       destination longitude
- parameter destinationName: destination name
- parameter completion:      completion callback
*/
static func openGoogleMapsNavigation(latitude: Double, longitude: Double, destinationName: String, completion: ((error: NSError?) -> (Void))?) {
    let directionRequest: MKDirectionsRequest = MKDirectionsRequest()
    let destination = Utils.createMapItem(name: destinationName, latitude: latitude, longitude: longitude)
    directionRequest.source = MKMapItem.mapItemForCurrentLocation()
    directionRequest.destination = destination
    directionRequest.transportType = MKDirectionsTransportType.Automobile
    directionRequest.requestsAlternateRoutes = true
    let directions: MKDirections = MKDirections(request: directionRequest)
    directions.calculateDirectionsWithCompletionHandler { (response: MKDirectionsResponse?, error: NSError?) -> Void in
        if error == nil {
            destination.openInMapsWithLaunchOptions([ MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving])
        }
        completion?(error: error)
    }
}

我有这个实用方法的地方:

static func createMapItem(name name: String, latitude: Double, longitude: Double) -> MKMapItem {
    let coordinates = CLLocationCoordinate2DMake(latitude, longitude)
    let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil)
    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = name
    return mapItem
}
于 2015-10-30T11:52:02.993 回答
0

对于快速寻找答案的人-

 //MARK:- ViewDidLoad
         let directionRequest = MKDirectionsRequest()
                    directionRequest.source = self.sourceMapitem
                    directionRequest.destination = self.destinationMapitem
                    directionRequest.transportType = .Automobile
                // where sourceMapitem and destinationMapitem are MKMapItem     
                    let directions = MKDirections(request: directionRequest)
                    directions.calculateDirectionsWithCompletionHandler {
                        (response, error) -> Void in
                   if response != nil {
                        let route = response!.routes[0]
                        self.myMapView.addOverlay((route.polyline), level: MKOverlayLevel.AboveRoads)
                        print("OVER")
                    }
                        else{
                            print(" ERROR: \(error)")
                        }
                    }
        //MARK:- DefineFunctions
        func showRoute(response: MKDirectionsResponse) {

                for route in response.routes {

                    myMapView.addOverlay(route.polyline,
                                        level: MKOverlayLevel.AboveRoads)
                }
            }
于 2016-07-13T05:20:48.290 回答