6

Googleマップを使用するiOS<6のアプリを更新したい。私のアプリには地図上にたくさんのピンがあり、ユーザーがそのうちの1つをタップすると、iPhoneは共有アプリケーションのようにマップを呼び出し、ネイティブのマップアプリで現在地と目的地からの道順を取得します。iOS 6では、同じ手順(以下に投稿)は明らかにGoogleマップではなくSafariを開きます。デバイスにインストールされているiOSをチェックするif-cycleを作成したいと思います。<6の場合、何も変更されません。iOS> 6の場合、.....(新しいアップルマップを開いて、そこに方向を示します)。

誰かが私を助けてくれますか?

ここにiOS6以前のアクションがあります

- (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

iOS 6でURLを介してマップアプリを開く代わりに、[MKMapItem openMapsWithItems:]を使用することをお勧めします。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の場合、この投稿のLocalizedCurrentLocationを使用しますhttp://www.martip.net/blog/localized-current-location-string-for-iphone-apps

iOS6の場合、CLGeocoderを使用して目印を取得し、それと現在の場所を含む地図を開きます。

CoreLocation.frameworkとMapKit.frameworkを追加することを忘れないでください

于 2012-12-06T12:11:06.693 に答える
1

Swift2.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 に答える