如何从AddressDictionary获取格式化的地址NSString?

尝试从AddressGeneration获得格式化的地址,我从CLGeocoder获得。 使用下面的代码没有结果:

subtitle = [NSString stringWithString:[[addressDict objectForKey:@"FormattedAddressLines"]objectAtIndex:0]]; 

还试过:

 subtitle = [[[ABAddressBook sharedAddressBook] formattedAddressFromDictionary:placemark.addressDictionary] string]; 

但是这个代码似乎只适用于Mac OS X。

编译器询问有关ABAdressBook,但我有两个头文件导入。

 #import <AddressBook/ABAddressBook.h> #import <AddressBook/AddressBook.h> 

addressDictionary属性的文档说:

您可以格式化此字典的内容以获取完整的地址string,而不是自己创build地址。 要格式化字典,请使用“地址簿UI函数参考”中所述的ABCreateStringWithAddressDictionary函数。

因此,添加和导入AddressBookUI框架,并尝试:

 subtitle = ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO); 

在iOS 6.1下进行挖掘之后,我发现CLPlacemark地址字典包含一个预格式化的地址:

 CLLocation *location = [[CLLocation alloc]initWithLatitude:37.3175 longitude:-122.041944]; [[[CLGeocoder alloc]init] reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { CLPlacemark *placemark = placemarks[0]; NSArray *lines = placemark.addressDictionary[ @"FormattedAddressLines"]; NSString *addressString = [lines componentsJoinedByString:@"\n"]; NSLog(@"Address: %@", addressString); }]; 

我还找不到有关这方面的文档,但它适用于我testing的所有地址。

正如Martyn Davis强调的, ABCreateStringWithAddressDictionary在iOS 9中已被弃用。

您可以使用下面的函数将addressDictionary转换为新的CNMutablePostalAddress ,然后使用CNPostalAddressFormatter生成一个本地化的string,只要您导入Contacts框架即可。

Swift 3.x

 // Convert to the newer CNPostalAddress func postalAddressFromAddressDictionary(_ addressdictionary: Dictionary<NSObject,AnyObject>) -> CNMutablePostalAddress { let address = CNMutablePostalAddress() address.street = addressdictionary["Street" as NSObject] as? String ?? "" address.state = addressdictionary["State" as NSObject] as? String ?? "" address.city = addressdictionary["City" as NSObject] as? String ?? "" address.country = addressdictionary["Country" as NSObject] as? String ?? "" address.postalCode = addressdictionary["ZIP" as NSObject] as? String ?? "" return address } // Create a localized address string from an Address Dictionary func localizedStringForAddressDictionary(addressDictionary: Dictionary<NSObject,AnyObject>) -> String { return CNPostalAddressFormatter.string(from: postalAddressFromAddressDictionary(addressDictionary), style: .mailingAddress) } 

Swift 2.x

 import Contacts // Convert to the newer CNPostalAddress func postalAddressFromAddressDictionary(addressdictionary: Dictionary<NSObject,AnyObject>) -> CNMutablePostalAddress { let address = CNMutablePostalAddress() address.street = addressdictionary["Street"] as? String ?? "" address.state = addressdictionary["State"] as? String ?? "" address.city = addressdictionary["City"] as? String ?? "" address.country = addressdictionary["Country"] as? String ?? "" address.postalCode = addressdictionary["ZIP"] as? String ?? "" return address } // Create a localized address string from an Address Dictionary func localizedStringForAddressDictionary(addressDictionary: Dictionary<NSObject,AnyObject>) -> String { return CNPostalAddressFormatter.stringFromPostalAddress(postalAddressFromAddressDictionary(addressDictionary), style: .MailingAddress) } 
 func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { // get the address if let location = locations.last { CLGeocoder().reverseGeocodeLocation(location, completionHandler: { (result: [CLPlacemark]?, err: NSError?) -> Void in if let placemark = result?.last , addrList = placemark.addressDictionary?["FormattedAddressLines"] as? [String] { let address = addrList.joinWithSeparator(", ") print(address) } }) } } 

以上是迅捷版本。

我正在使用Swift 3 / XCode 8

ZYiOS的回答很好,但是没有为我编译。

该问题询问如何从现有的地址字典获取string地址。 这就是我所做的:

 import CoreLocation func getAddressString(placemark: CLPlacemark) -> String? { var originAddress : String? if let addrList = placemark.addressDictionary?["FormattedAddressLines"] as? [String] { originAddress = addrList.joined(separator: ", ") } return originAddress } 

Swift 3 / Xcode 8 Helper Mehtod从CLPlaceMark获取地址

 class func formattedAddress(fromPlacemark placemark: CLPlacemark) -> String{ var address = "" if let name = placemark.addressDictionary?["Name"] as? String { address = constructAddressString(address, newString: name) } if let city = placemark.addressDictionary?["City"] as? String { address = constructAddressString(address, newString: city) } if let state = placemark.addressDictionary?["State"] as? String { address = constructAddressString(address, newString: state) } if let country = placemark.country{ address = constructAddressString(address, newString: country) } return address } 

简单地创buildCLLocation扩展:

 typealias AddressDictionaryHandler = ([String: Any]?) -> Void extension CLLocation { func addressDictionary(completion: @escaping AddressDictionaryHandler) { CLGeocoder().reverseGeocodeLocation(self) { placemarks, _ in completion(placemarks?.first?.addressDictionary as? [String: AnyObject]) } } } 

例:

 let location = CLLocation() location.addressDictionary { dictionary in let city = dictionary?["City"] as? String let street = dictionary?["Street"] as? String }