使用Apple Maps以编程方式获取路线

时间:2012-09-24 15:34:11

标签: objective-c cocoa-touch ios6 ios6-maps

我对文档感到有点困惑。经过一些研究和实验,这就是我所拥有的。

if ([self canUseMKMapItem]) {
            [self iosTheMap];
        } else {
            [self googleTheMap];
        }

使用它来检测我们是否可以使用IOS6映射功能:

- (BOOL) canUseMKMapItem {
    Class itemClass = [MKMapItem class];
    return (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]);
}

这适用于IOS5,使用谷歌地图。它会自动将我们带到一个屏幕,其中包含从当前地址(如果用户允许)到目的地的路线列表。

- (void)googleTheMap
{
    NSNumber *userLat = [[NSNumber alloc]initWithDouble:mapView.userLocation.coordinate.latitude];
    NSNumber *userLong = [[NSNumber alloc]initWithDouble:mapView.userLocation.coordinate.longitude];

    NSMutableString *queryString = [NSMutableString stringWithFormat:@"http://maps.google.com/?saddr=%@,%@&daddr=",userLat,userLong];
    NSString *address = [partnerObject valueForKey:ATTRIBUTE_ADDRESS];
    [queryString appendString:address];
    NSString *escaped = [queryString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:escaped]];
}

这是一个棘手的部分 - 这就是我正在尝试使用Apple Maps

- (void)iosTheMap {
    NSNumber * latitude = [partnerObject valueForKey:ATTRIBUTE_LATITUDE];
    NSNumber * longitude = [partnerObject valueForKey:ATTRIBUTE_LONGITUDE];
    CLLocationCoordinate2D coordinate;
    coordinate.latitude = latitude.doubleValue;
    coordinate.longitude = longitude.doubleValue;
    NSMutableDictionary *addressDictionary = [[NSMutableDictionary alloc] init];
    [addressDictionary setValue:[partnerObject valueForKey:ATTRIBUTE_ADDRESS] forKey:kABPersonAddressStreetKey];
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:addressDictionary];
    MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
    [mapItem openInMapsWithLaunchOptions:nil];
}

这种“有效”,有点像。它将用户带到一个带有显示地址的引脚的地图屏幕。用户可以点击它并获取路线。但是,我对这种方法有一些保留意见:

  1. 我有一个编译器警告,我在其中设置kABPersonAddressStreetKey:“不兼容的指针类型将'const CFStringRef'(又名'const struct __CFString * const')发送到'NSString *'类型的参数”
  2. 我使用的字符串值是完整地址。我将该值用于街道地址,尽管地址值更具原子性 - 街道,城市,州。它似乎有效,但我担心这不是正确的方法。
  3. 如果Apple Maps显示商家/目的地的名称,而不仅仅是地址,那就太好了。
  4. 让Apple Maps自动显示路线会很棒,而不是带有目的地点的地图,这样可以为用户节省一些时间。
  5. 有关如何改进方法的任何建议?虽然它似乎有用,但我怀疑这不是正确的方法。

1 个答案:

答案 0 :(得分:8)

你非常接近。您需要使用MKLaunchOptionsDirectionsModeDriving,MKLaunchOptionsDirectionsModeKey值和键为openInMapsWithLaunchOptions函数指定Launch Options字典。

    Class itemClass = [MKMapItem class];
    if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
        // Use iOS 6 maps
        CLLocationCoordinate2D coordinate = [((LocationAnnotation*)[map.annotations objectAtIndex:0]) coordinate];
        MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil];
        MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
        [mapItem openInMapsWithLaunchOptions:[NSDictionary dictionaryWithObjectsAndKeys:MKLaunchOptionsDirectionsModeDriving, MKLaunchOptionsDirectionsModeKey, nil]];
    } else {
        //Fall back on google
        ...
    }