2012-09-28 12 views
6

Desidero aggiornare un'app da iOS < 6 che utilizza Google Maps. La mia app ha molti spilli su una mappa e, quando un utente tocca uno di essi, l'iPhone chiama Maps come un'applicazione condivisa per ottenere la direzione dalla sua posizione corrente e dalla destinazione con l'app Maps nativa. Con iOS 6, le stesse istruzioni (pubblicate sotto) ovviamente aprono Safari invece di Google Maps. Voglio scrivere un ciclo if che controlla l'iOS installato sul dispositivo: se < 6, non è cambiato nulla, se iOS> 6 poi ..... (apri nuove mappe apple e ottieni indicazioni).Come posso ottenere la direzione su un'applicazione iPhone iOS 6 in Xcode da A a B?

Qualcuno può aiutarmi per favore?

Qui l'azione prima di 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]; 



} 

risposta

4

Ho usato un codice preprocessore come questo postato qui sotto per definire la mia condizione per il caso del ciclo.

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

Poi:

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


    } 

sembra funzionare Bye!

+1

@Alessandro Brava: thxs il codice mi ha aiutato. volevo chiedere una cosa ora .. come posso tornare alla mia app direttamente. Ora non sono in grado di tornare alla mia app dopo aver ottenuto il percorso dall'app della mappa. Per favore aiutatemi .. grazie !! – nikesh

14

Si consiglia di utilizzare [MKMapItem openMapsWithItems:] invece di aprire l'app delle mappe tramite un URL in iOS 6. Se si utilizza un URL, non sarà possibile passare "Posizione attuale" e perderà la capacità di eseguire -senza di navigazione. MKMapItem ha una voce specifica per la posizione corrente che, una volta passata, aprirà Mappe usando la Posizione corrente come indirizzo sorgente, consentendo così la navigazione turn-by-turn.

- (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]]]; 
    } 
} 
+0

ciao, ho provato questo. ma nella mappa della mela viene visualizzato un avviso come "Indicazioni non disponibili". Perché? – Dev

+0

Quali sono i tuoi indirizzi di origine e destinazione? Puoi ottenere indicazioni stradali tra questi punti nell'app Maps?È possibile che non ci siano informazioni di routing tra questi due punti. – bromanko

+0

La mia fonte è il Kuwait e l'indirizzo di destinazione è l'Oman. In google maps Iam ottiene la direzione tra questi due. Ma nell'app delle mappe non si ottiene e sta dicendo "Indicazioni non disponibili". Puoi suggerire qualche indirizzo per il quale posso ottenere la direzione. – Dev

1

La risposta accettata non ha funzionato per me. La posizione corrente deve essere nella lingua corretta e anche la versione ios6 non è stata caricata correttamente. Per me ha funzionato.

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

Per iOS5 Io uso il LocalizedCurrentLocation da questo post http://www.martip.net/blog/localized-current-location-string-for-iphone-apps

Per iOS6 io uso il CLGeocoder per ottenere il segnaposto e quindi aprire la mappa con esso e la posizione corrente.

ricordarsi di aggiungere CoreLocation.framework e MapKit.framework

1

Swift 2.0 compatibili.

Non ho ancora trovato una risposta esaustiva.

/** 
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) 
    } 
} 

Dove ho questo metodo di utilità:

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 
} 
0

Per le persone alla ricerca di una risposta a Swift -

//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) 
       } 
      } 
Problemi correlati