2012-09-14 15 views
8

Đây là sự cố lạ: Ứng dụng của tôi có thể gọi được tích hợp trong Maps trong iOS (cả 5.1 và 6). Hóa ra nó hoạt động tốt dưới iOS6 nhưng không hoạt động dưới iOS5.1. Các bản đồ trong iOS6 được gọi và các hướng dẫn từ saddr đến daddr được truy tìm nhưng khi tôi ở iOS5, ứng dụng bản đồ được gọi nhưng chỉ một pin được đặt ở daddr. Đối với một số lý do không xác định tọa độ ban đầu (saddr) không hiển thị và không có hướng nào được truy tìm.Gọi Bản đồ chỉ đường từ bên trong ứng dụng của bạn - iOS5 iOS6

Đây là mã của tôi:

addr = [NSString stringWithFormat: @"maps://saddr=%f,%f&daddr=%f,%f", newLocation.coordinate.latitude, newLocation.coordinate.longitude, oldLatitude, oldLongitude]; 
NSURL *url = [NSURL URLWithString:addr]; 
[[UIApplication sharedApplication] openURL:url]; 

Tôi đã cố gắng thay đổi URL để "http://maps.google.com/something" nhưng nó gọi Safari thay vì xây dựng trong ứng dụng Maps. Tôi đã nhận thấy rằng các biến đang được truyền chính xác đến URL.

Bất kỳ ý tưởng nào?

Cảm ơn trước!

+0

Câu hỏi giống hệt nhau [cho câu hỏi cũ hơn] (http://stackoverflow.com/q/576768/119114), ngoại trừ địa chỉ xuất phát là vị trí hiện tại trong câu hỏi khác (không thực sự thay đổi nhiều vấn đề). – Nate

Trả lời

35

Tôi gặp sự cố tương tự và tôi phải tạo một số mã OS có điều kiện để xử lý thực tế là ứng dụng Google Maps đã bị xóa. Từ mới 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]; 

Để có được đường đi bộ:

  1. For iOS 6 bản đồ - Bạn có thể đặt MKLaunchOptionsDirectionsModeWalking thay vì MKLaunchOptionsDirectionsModeDriving
  2. Đối với bản đồ Google - Thêm &dirflg=w vào url.

Tôi nghĩ tốt hơn nên sử dụng openInMapsWithLaunchOptions trong iOS6 vì nó cung cấp cho bạn toàn quyền kiểm soát cách ứng dụng bản đồ sẽ phản hồi.

+1

Cảm ơn bạn đã giúp đỡ! Tôi làm theo lời khuyên của bạn và sử dụng openInMapsWithLaunchOptions và nó hoạt động hoàn hảo. Bí quyết duy nhất tôi đã sử dụng là chuyển vị trí hiện tại dưới dạng tham số bên trong NSString * url = [NSString stringWithFormat: @ "http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f" , currentLatitude, currentLongitude, vĩ độ, kinh độ]; bởi vì tôi không thể sử dụng sintax Current + Location để làm việc. Có lẽ nó có một cái gì đó để làm về sandboxing trong iOS 5.1.1. – lsp

+0

@lsp, Các vấn đề với việc sử dụng 'Vị trí + Hiện tại' được thảo luận trong câu trả lời của tôi [cho câu hỏi cũ tương tự này] (http://stackoverflow.com/a/964131/119114) và các nhận xét phản hồi nó. – Nate

+0

Tôi không muốn chế độ xem bản đồ che phủ toàn màn hình, nó sẽ hiển thị chỉ một nửa màn hình của tôi là có thể. – Arun

0

Bạn có thể sử dụng MKPlacemarkMKMapItem để khởi động ứng dụng Maps với cả một phối hợp một tiêu đề vào điểm bản đồ:

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

Lưu ý rằng bạn sẽ cần phải liên kết chống lại AddressBook.framework và cũng thêm #import <AddressBook/AddressBook.h> ở đâu đó trong mã của bạn để sử dụng hằng số kABPersonAddressStreetKey.