diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/jameswolfe.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/jameswolfe.xcuserdatad/UserInterfaceState.xcuserstate index 48b5a59..2a4c7bc 100644 Binary files a/.swiftpm/xcode/package.xcworkspace/xcuserdata/jameswolfe.xcuserdatad/UserInterfaceState.xcuserstate and b/.swiftpm/xcode/package.xcworkspace/xcuserdata/jameswolfe.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/AtlasKit.podspec b/AtlasKit.podspec index 389daf3..d050ea2 100644 --- a/AtlasKit.podspec +++ b/AtlasKit.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |spec| spec.name = "AtlasKit" - spec.version = "0.1.4" + spec.version = "0.1.5" spec.license = "MIT" spec.summary = "A swift library for quickly integrating a location search in your app." spec.homepage = "https://github.com/appoly/AtlasKit" diff --git a/Sources/AtlasKit/AtlasKit.swift b/Sources/AtlasKit/AtlasKit.swift index 88d3fe4..7f37bbd 100644 --- a/Sources/AtlasKit/AtlasKit.swift +++ b/Sources/AtlasKit/AtlasKit.swift @@ -63,6 +63,8 @@ public class AtlasKit { performMapKitSearch(term, completion: completion) case .google: performGooglePlacesSearch(term, completion: completion) + case .getAddress: + performGetAddressSearch(term, completion: completion) } } @@ -111,9 +113,9 @@ public class AtlasKit { let request = sessionManager.request(URL(string: "https://maps.googleapis.com/maps/api/place/findplacefromtext/json")!, method: .get, - parameters: parameters, - encoding: URLEncoding.methodDependent, - headers: nil) + parameters: parameters, + encoding: URLEncoding.methodDependent, + headers: nil) request.validate(statusCode: 200..<300).responseJSON { [weak self] (response) in switch response.result { @@ -136,12 +138,70 @@ public class AtlasKit { } + private func performGetAddressSearch(_ postcode: String, completion: @escaping ([AtlasKitPlace]?, AtlasKitError?) -> Void) { + let parameters = [ + "api-key": datasource.apiKey! + ] + + let request = sessionManager.request(URL(string: "https://api.getaddress.io/find/\(postcode)")!, + method: .get, + parameters: parameters, + encoding: URLEncoding.methodDependent, + headers: nil) + + request.validate(statusCode: 200..<300).responseJSON { [weak self] (response) in + switch response.result { + case .failure(_): + completion(nil, .generic) + case .success(let value): + guard let json = value as? [String: Any] else { + completion(nil, .generic) + return + } + + guard let data = json["addresses"] as? [String] else { + completion(nil, .generic) + return + } + + guard let latitude = json["latitude"] as? Double else { + completion(nil, .generic) + return + } + + guard let longitude = json["longitude"] as? Double else { + completion(nil, .generic) + return + } + + completion(self?.formatResults(data, postcode: postcode.capitalized.removingAllWhitespaces, latitude: latitude, longitude: longitude), nil) + } + } + } + + // MARK: - Utilities private func formatResults(_ items: [MKPlacemark]) -> [AtlasKitPlace] { return items.map({ AtlasKitPlace(streetAddress: $0.postalAddress!.street, city: $0.postalAddress!.city, postcode: $0.postalAddress!.postalCode, state: $0.postalAddress!.state, country: $0.postalAddress!.country, location: $0.coordinate) }) } + + + private func formatResults(_ items: [String], postcode: String, latitude: Double, longitude: Double) -> [AtlasKitPlace] { + return items.map({ + let components = $0.split(separator: ",") + let address1 = components.indices.contains(0) ? components[0] : "" + let address2 = components.indices.contains(1) ? components[1] : "" + let address3 = components.indices.contains(2) ? components[2] : "" + let address4 = components.indices.contains(3) ? components[3] : "" + let address = ([address1, address2, address3, address4].filter({ !$0.isEmpty }).map({ String($0) }).joined(separator: ", ")) + let city = components.indices.contains(5) ? components[5] : "" + let county = components.indices.contains(6) ? components[6] : "" + + return AtlasKitPlace(streetAddress: address, city: String(city), postcode: postcode, state: String(county), country: "United Kingdom", location: CLLocationCoordinate2D(latitude: latitude, longitude: longitude)) + }) + } private func formatResults(_ items: [[String: Any]]) -> [AtlasKitPlace] { @@ -165,3 +225,13 @@ public class AtlasKit { } } + + + +extension String { + + var removingAllWhitespaces: Self { + filter { !$0.isWhitespace } + } + +} diff --git a/Sources/AtlasKit/AtlasKitDatasource.swift b/Sources/AtlasKit/AtlasKitDatasource.swift index cc6b0c7..6562e52 100644 --- a/Sources/AtlasKit/AtlasKitDatasource.swift +++ b/Sources/AtlasKit/AtlasKitDatasource.swift @@ -15,6 +15,7 @@ import Foundation public enum AtlasKitDataSource { case google(key: String) case apple + case getAddress(key: String) } @@ -23,6 +24,8 @@ extension AtlasKitDataSource { switch self { case .google(let key): return key + case .getAddress(let key): + return key case .apple: return nil }