Call Maps for directions from inside your app - iOS5 iOS6

前端 未结 2 616
鱼传尺愫
鱼传尺愫 2021-01-30 15:24

Here is a strange problem: My app should be able to call the built in Maps in iOS (both 5.1 and 6). Turns out that it works just fine under iOS6 but not under iOS5.1. The maps i

相关标签:
2条回答
  • 2021-01-30 15:58

    I had a similar problem and I had to create some conditional OS code to deal with the fact that the Google Maps application has been removed. From the new MKMapItem Reference

    //first create latitude longitude object
    CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude,longitude);
    
    //create MKMapItem out of coordinates
    MKPlacemark* placeMark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil];
    MKMapItem* destination =  [[MKMapItem alloc] initWithPlacemark:placeMark];
    
    if([destination respondsToSelector:@selector(openInMapsWithLaunchOptions:)])
    {
        //using iOS6 native maps app
        [destination openInMapsWithLaunchOptions:@{MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving}];        
    } 
    else
    {
        //using iOS 5 which has the Google Maps application
        NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=Current+Location&daddr=%f,%f", latitude, longitude];
        [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
    }
    
    [placeMark release];
    [destination release];
    

    To get walking directions:

    1. For iOS 6 maps - You can set MKLaunchOptionsDirectionsModeWalking instead of MKLaunchOptionsDirectionsModeDriving
    2. For Google maps - Add &dirflg=w to the url.

    I think it's better to use the openInMapsWithLaunchOptions in iOS6 because it gives you complete control over how the maps application will respond.

    0 讨论(0)
  • 2021-01-30 16:02

    You can use MKPlacemark and MKMapItem to launch the Maps app with both a coordinate and a title on the map pin:

    NSString *pinTitle;
    CLLocationCoordinate2D coordinate;
    
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:@{(id)kABPersonAddressStreetKey: pinTitle}];
    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
    
    if ([mapItem respondsToSelector:@selector(openInMapsWithLaunchOptions:)])
    {
        [mapItem openInMapsWithLaunchOptions:@{MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving}];
    }
    else
    {
        // Google Maps fallback
        NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%f,%f&saddr=Current+Location", locationItem.coordinate.latitude, locationItem.coordinate.longitude];
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
    }
    

    Note that you'll need to link against AddressBook.framework and also add #import <AddressBook/AddressBook.h> somewhere in your code to make use of the kABPersonAddressStreetKey constant.

    0 讨论(0)
提交回复
热议问题