diff --git a/Directions Example/ViewController.swift b/Directions Example/ViewController.swift index b0ac774c5..e4b7f5833 100644 --- a/Directions Example/ViewController.swift +++ b/Directions Example/ViewController.swift @@ -31,9 +31,9 @@ class ViewController: UIViewController { let request = MBDirectionsRequest(sourceCoordinate: mb, destinationCoordinate: wh) request.version = .Four - directions = MBDirections(request: request, accessToken: MapboxAccessToken) + directions = MBDirections(accessToken: MapboxAccessToken) - directions!.calculateDirectionsWithCompletionHandler { (response, error) in + directions!.calculateDirectionsWithCompletionHandler(request) { (response, error) in if let route = response?.routes.first { print("Route summary:") let steps = route.legs.first!.steps diff --git a/MapboxDirections.swift.podspec b/MapboxDirections.swift.podspec index 0f8ae2d52..26dd4b226 100644 --- a/MapboxDirections.swift.podspec +++ b/MapboxDirections.swift.podspec @@ -130,7 +130,7 @@ Pod::Spec.new do |s| s.module_name = "MapboxDirections" # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" } - s.dependency "NBNRequestKit" + s.dependency "Alamofire", "~> 3.0" s.dependency "Polyline", "~> 3.0" end diff --git a/MapboxDirections.xcodeproj/project.pbxproj b/MapboxDirections.xcodeproj/project.pbxproj index 3af0007e9..bffda1c29 100644 --- a/MapboxDirections.xcodeproj/project.pbxproj +++ b/MapboxDirections.xcodeproj/project.pbxproj @@ -10,8 +10,8 @@ 8543D22E59F4F058585E18B9 /* Pods_MapboxDirectionsTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72B856631C2DD5B041A03A48 /* Pods_MapboxDirectionsTests.framework */; }; 910EA7231CB5734F00858D31 /* driving_dc_polyline.json in Resources */ = {isa = PBXBuildFile; fileRef = 910EA7221CB5734F00858D31 /* driving_dc_polyline.json */; }; 9151CBAA1CB5A36C006CF17B /* Polyline.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 910EA7241CB5917000858D31 /* Polyline.framework */; }; + 9151CBAC1CB5C295006CF17B /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9151CBAB1CB5C295006CF17B /* Alamofire.framework */; }; BB44F9743C24BD97DFD53E9F /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 779CA65749150F5A75B46628 /* Pods.framework */; }; - DA2133B21CAEEE3200AA2594 /* RequestKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA2133B11CAEEE3200AA2594 /* RequestKit.framework */; }; DA2133B31CAEEFE100AA2594 /* MapboxDirections.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA6C9D881CAE442B00094FBC /* MapboxDirections.framework */; }; DA2E03E91CB0E0B000D1269A /* MBDirectionsResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03E81CB0E0B000D1269A /* MBDirectionsResponse.swift */; }; DA2E03EB1CB0E13D00D1269A /* MBDirectionsRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA2E03EA1CB0E13D00D1269A /* MBDirectionsRequest.swift */; }; @@ -59,10 +59,10 @@ 78F47212D6DC575EFAC36509 /* Pods-MapboxDirectionsTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MapboxDirectionsTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-MapboxDirectionsTests/Pods-MapboxDirectionsTests.release.xcconfig"; sourceTree = ""; }; 910EA7221CB5734F00858D31 /* driving_dc_polyline.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = driving_dc_polyline.json; sourceTree = ""; }; 910EA7241CB5917000858D31 /* Polyline.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Polyline.framework; path = "../../Library/Developer/Xcode/DerivedData/MapboxDirections-cxcrsxhcoorbtxaohfcuxrgxzrsg/Build/Products/Debug-iphonesimulator/Polyline.framework"; sourceTree = ""; }; + 9151CBAB1CB5C295006CF17B /* Alamofire.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Alamofire.framework; path = "Pods/../build/Debug-iphoneos/Alamofire.framework"; sourceTree = ""; }; A338BDE4A863FFF749998470 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; B2FF88ACFEC9E7E276EF93DA /* Pods-MapboxDirectionsTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MapboxDirectionsTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-MapboxDirectionsTests/Pods-MapboxDirectionsTests.debug.xcconfig"; sourceTree = ""; }; D4657820F4366F9DB1C432FB /* Pods-Unit Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Unit Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Unit Tests/Pods-Unit Tests.debug.xcconfig"; sourceTree = ""; }; - DA2133B11CAEEE3200AA2594 /* RequestKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RequestKit.framework; path = "Pods/../build/Debug-iphoneos/RequestKit.framework"; sourceTree = ""; }; DA2E03E81CB0E0B000D1269A /* MBDirectionsResponse.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBDirectionsResponse.swift; sourceTree = ""; }; DA2E03EA1CB0E13D00D1269A /* MBDirectionsRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MBDirectionsRequest.swift; sourceTree = ""; }; DA6C9D881CAE442B00094FBC /* MapboxDirections.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MapboxDirections.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -90,8 +90,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 9151CBAC1CB5C295006CF17B /* Alamofire.framework in Frameworks */, 9151CBAA1CB5A36C006CF17B /* Polyline.framework in Frameworks */, - DA2133B21CAEEE3200AA2594 /* RequestKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -119,8 +119,8 @@ 4025371970E36C6D8BF67116 /* Frameworks */ = { isa = PBXGroup; children = ( + 9151CBAB1CB5C295006CF17B /* Alamofire.framework */, 910EA7241CB5917000858D31 /* Polyline.framework */, - DA2133B11CAEEE3200AA2594 /* RequestKit.framework */, 371BFE7855E3EA8B44CA2B5F /* Pods_Unit_Tests.framework */, 779CA65749150F5A75B46628 /* Pods.framework */, 72B856631C2DD5B041A03A48 /* Pods_MapboxDirectionsTests.framework */, @@ -531,6 +531,10 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/build/Debug-iphoneos", + ); INFOPLIST_FILE = MapboxDirections/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -551,6 +555,10 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/build/Debug-iphoneos", + ); INFOPLIST_FILE = MapboxDirections/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; diff --git a/MapboxDirections/MBDirections.swift b/MapboxDirections/MBDirections.swift index 76641ce47..e421f11dc 100644 --- a/MapboxDirections/MBDirections.swift +++ b/MapboxDirections/MBDirections.swift @@ -1,4 +1,5 @@ import Foundation +import Alamofire import CoreLocation public typealias MBDirectionsHandler = (MBDirectionsResponse?, NSError?) -> Void @@ -13,8 +14,11 @@ public enum MBDirectionsErrorCode: UInt { case InvalidInput = 422 } +/** + A named coordinate commonly used to represent a waypoint + along a route + */ public class MBPoint { - public let name: String? public let coordinate: CLLocationCoordinate2D @@ -22,7 +26,6 @@ public class MBPoint { self.name = name self.coordinate = coordinate } - } extension CLLocationCoordinate2D { @@ -34,31 +37,19 @@ extension CLLocationCoordinate2D { public class MBDirections: NSObject { - private let request: MBDirectionsRequest private let configuration: MBDirectionsConfiguration - private var task: NSURLSessionDataTask? - public var calculating: Bool { - return task?.state == .Running - } - - private var errorForSimultaneousRequests: NSError { - let userInfo = [ - NSLocalizedFailureReasonErrorKey: "Cannot calculate directions on an MBDirections object that is already calculating.", - ] - return NSError(domain: MBDirectionsErrorDomain, code: -1, userInfo: userInfo) - } - public init(request: MBDirectionsRequest, accessToken: String) { - self.request = request + public init(accessToken: String) { + Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders = ["User-Agent": "MapboxDirections.swift/0.4.0"] configuration = MBDirectionsConfiguration(accessToken) super.init() } - public func calculateDirectionsWithCompletionHandler(completionHandler: MBDirectionsHandler) { - guard !calculating else { - completionHandler(nil, errorForSimultaneousRequests) - return - } + /** + Run a Directions API request against the web service, returning + the request and calling a completion handler on success or failure + */ + public func calculateDirectionsWithCompletionHandler(request: MBDirectionsRequest, completionHandler: MBDirectionsHandler) -> Request? { var profileIdentifier = request.profileIdentifier let version = request.version @@ -66,12 +57,12 @@ public class MBDirections: NSObject { switch version { case .Four: profileIdentifier = profileIdentifier.stringByReplacingOccurrencesOfString("/", withString: ".") - router = MBDirectionsRouter.V4(configuration, profileIdentifier, waypointsForDirections, request.requestsAlternateRoutes, nil, .Polyline, nil) + router = MBDirectionsRouter.V4(configuration, profileIdentifier, waypointsForDirections(request), request.requestsAlternateRoutes, nil, .Polyline, nil) case .Five: - router = MBDirectionsRouter.V5(configuration, profileIdentifier, waypointsForDirections, request.requestsAlternateRoutes, .Polyline, .Full, true, nil) + router = MBDirectionsRouter.V5(configuration, profileIdentifier, waypointsForDirections(request), request.requestsAlternateRoutes, .Polyline, .Full, true, nil) } - task = taskWithRouter(router, completionHandler: { (source, waypoints, destination, routes, error) in + return taskWithRouter(router, request: request, completionHandler: { (source, waypoints, destination, routes, request, error) in let response = MBDirectionsResponse(source: source, waypoints: Array(waypoints), destination: destination, routes: routes.map { MBRoute(source: source, waypoints: Array(waypoints), destination: destination, json: $0, profileIdentifier: profileIdentifier, version: version) }) @@ -81,22 +72,18 @@ public class MBDirections: NSObject { }) } - public func calculateETAWithCompletionHandler(completionHandler: MBETAHandler) { - guard !calculating else { - completionHandler(nil, errorForSimultaneousRequests) - return - } + public func calculateETAWithCompletionHandler(request: MBDirectionsRequest, completionHandler: MBETAHandler) -> Request? { let router: MBDirectionsRouter switch request.version { case .Four: let profileIdentifier = request.profileIdentifier.stringByReplacingOccurrencesOfString("/", withString: ".") - router = MBDirectionsRouter.V4(configuration, profileIdentifier, waypointsForDirections, false, nil, .None, false) + router = MBDirectionsRouter.V4(configuration, profileIdentifier, waypointsForDirections(request), false, nil, .None, false) case .Five: - router = MBDirectionsRouter.V5(configuration, request.profileIdentifier, waypointsForDirections, false, .GeoJSON, .None, false, nil) + router = MBDirectionsRouter.V5(configuration, request.profileIdentifier, waypointsForDirections(request), false, .GeoJSON, .None, false, nil) } - task = taskWithRouter(router, completionHandler: { (source, waypoints, destination, routes, error) in + return taskWithRouter(router, request: request, completionHandler: { (source, waypoints, destination, routes, request, error) in let expectedTravelTime = routes.flatMap { $0["duration"] as? NSTimeInterval }.minElement() @@ -111,7 +98,7 @@ public class MBDirections: NSObject { }) } - private var waypointsForDirections: [MBDirectionsWaypoint] { + private func waypointsForDirections(request: MBDirectionsRequest) -> [MBDirectionsWaypoint] { var sourceHeading: MBDirectionsWaypoint.Heading? = nil if let heading = request.sourceHeading { sourceHeading = MBDirectionsWaypoint.Heading(heading: heading, headingAccuracy: 90) @@ -122,16 +109,13 @@ public class MBDirections: NSObject { [MBDirectionsWaypoint(coordinate: request.destinationCoordinate, accuracy: nil, heading: nil)]].flatMap{ $0 } } - private func taskWithRouter(router: MBDirectionsRouter, completionHandler completion: (MBPoint, [MBPoint], MBPoint, [JSON], NSError?) -> Void, errorHandler: (NSError?) -> Void) -> NSURLSessionDataTask? { - return router.loadJSON(JSON.self) { [weak self] (json, error) in - guard let dataTaskSelf = self where dataTaskSelf.task?.state == .Completed else { - return - } + private func taskWithRouter(router: MBDirectionsRouter, request: MBDirectionsRequest, completionHandler completion: (MBPoint, [MBPoint], MBPoint, [JSON], MBDirectionsRequest, NSError?) -> Void, errorHandler: (NSError?) -> Void) -> Request? { + let httpRequest = Alamofire.request(router).responseJSON { response in + let error = response.result.error + let json = response.result.value guard error == nil && json != nil else { - dispatch_sync(dispatch_get_main_queue()) { - errorHandler(error as? NSError) - } + errorHandler(error) return } @@ -153,9 +137,7 @@ public class MBDirections: NSObject { NSLocalizedFailureReasonErrorKey: errorMessage!, ] let apiError = NSError(domain: MBDirectionsErrorDomain, code: 200, userInfo: userInfo) - dispatch_sync(dispatch_get_main_queue()) { - errorHandler(apiError) - } + errorHandler(apiError) return } @@ -195,14 +177,9 @@ public class MBDirections: NSObject { var waypoints = points.suffixFrom(1) waypoints = waypoints.prefixUpTo(waypoints.count) - dispatch_sync(dispatch_get_main_queue()) { - completion(source, Array(waypoints), destination, routes, error as? NSError) - } + completion(source, Array(waypoints), destination, routes, request, error) } + + return httpRequest } - - public func cancel() { - self.task?.cancel() - } - } diff --git a/MapboxDirections/MBDirectionsConfiguration.swift b/MapboxDirections/MBDirectionsConfiguration.swift index 6aa613b0c..397b2809c 100644 --- a/MapboxDirections/MBDirectionsConfiguration.swift +++ b/MapboxDirections/MBDirectionsConfiguration.swift @@ -1,11 +1,14 @@ import Foundation -import RequestKit -internal struct MBDirectionsConfiguration: Configuration { +internal struct MBDirectionsConfiguration { internal var apiEndpoint: String = "https://api.mapbox.com" internal var accessToken: String? + /** + Create a new configuration object. + - Parameter accessToken: a Mapbox access token is required to use the Mapbox Geocoding API + */ internal init(_ accessToken: String) { self.accessToken = accessToken } -} +} \ No newline at end of file diff --git a/MapboxDirections/MBDirectionsRequest.swift b/MapboxDirections/MBDirectionsRequest.swift index 4e7507904..f5565e58c 100644 --- a/MapboxDirections/MBDirectionsRequest.swift +++ b/MapboxDirections/MBDirectionsRequest.swift @@ -12,7 +12,6 @@ public class MBDirectionsRequest { case Automobile = "mapbox/driving" case Walking = "mapbox/walking" case Cycling = "mapbox/cycling" -// case Any = "" } public let sourceCoordinate: CLLocationCoordinate2D @@ -29,11 +28,6 @@ public class MBDirectionsRequest { } } public var profileIdentifier: String = MBDirectionsTransportType.Automobile.rawValue - // var departureDate: NSDate! - // var arrivalDate: NSDate! - - // class func isDirectionsRequestURL - // func initWithContentsOfURL public init(sourceCoordinate: CLLocationCoordinate2D, waypointCoordinates: [CLLocationCoordinate2D] = [], destinationCoordinate: CLLocationCoordinate2D, sourceHeading: CLLocationDirection? = nil) { self.sourceCoordinate = sourceCoordinate diff --git a/MapboxDirections/MBDirectionsResponse.swift b/MapboxDirections/MBDirectionsResponse.swift index fbfa0279e..6c3a3c4f8 100644 --- a/MapboxDirections/MBDirectionsResponse.swift +++ b/MapboxDirections/MBDirectionsResponse.swift @@ -23,10 +23,7 @@ public class MBDirectionsResponse: MBResponse { } public class MBRoute { -// var polyline: MKPolyline! { get } public let legs: [MBRouteLeg] -// public let name: String -// var advisoryNotices: [AnyObject]! { get } public let distance: CLLocationDistance public let expectedTravelTime: NSTimeInterval public var transportType: MBDirectionsRequest.MBDirectionsTransportType { @@ -66,17 +63,14 @@ public class MBRoute { } public class MBRouteLeg { -// var polyline: MKPolyline! { get } public let steps: [MBRouteStep] public let name: String -// var advisoryNotices: [AnyObject]! { get } public let distance: CLLocationDistance public let expectedTravelTime: NSTimeInterval public var transportType: MBDirectionsRequest.MBDirectionsTransportType { return MBDirectionsRequest.MBDirectionsTransportType(rawValue: profileIdentifier) ?? .Automobile } public let profileIdentifier: String - public let source: MBPoint public let destination: MBPoint @@ -94,6 +88,9 @@ public class MBRouteLeg { } public class MBRouteStep { + /** + A maneuver is an action that is required along a route + */ public enum ManeuverType: String { case Turn = "turn" case PassNameChange = "new name" @@ -149,9 +146,7 @@ public class MBRouteStep { } } - // var polyline: MKPolyline! { get } public let instructions: String - // var notice: String! { get } public let distance: CLLocationDistance public let transportType: MBDirectionsRequest.MBDirectionsTransportType public let profileIdentifier: String @@ -227,4 +222,4 @@ public class MBETAResponse: MBResponse { self.destination = destination self.expectedTravelTime = expectedTravelTime } -} +} \ No newline at end of file diff --git a/MapboxDirections/MBDirectionsRouter.swift b/MapboxDirections/MBDirectionsRouter.swift index 356b6e9a0..861fecfd5 100644 --- a/MapboxDirections/MBDirectionsRouter.swift +++ b/MapboxDirections/MBDirectionsRouter.swift @@ -1,6 +1,6 @@ import Foundation import CoreLocation -import RequestKit +import Alamofire internal struct MBDirectionsWaypoint: CustomStringConvertible { struct Heading: CustomStringConvertible { @@ -23,7 +23,8 @@ internal struct MBDirectionsWaypoint: CustomStringConvertible { } } -internal enum MBDirectionsRouter: Router { +internal enum MBDirectionsRouter: URLRequestConvertible { + enum InstructionFormat: String { case Text = "text" case HTML = "html" @@ -32,13 +33,11 @@ internal enum MBDirectionsRouter: Router { enum GeometryFormatV4: String { case None = "false" case GeoJSON = "geojson" - /// Encoded polyline; see . case Polyline = "polyline" } enum GeometryFormatV5: String { case GeoJSON = "geojson" - /// Encoded polyline; see . case Polyline = "polyline" } @@ -48,30 +47,16 @@ internal enum MBDirectionsRouter: Router { case Full = "full" } - case V4(Configuration, String, [MBDirectionsWaypoint], Bool?, InstructionFormat?, GeometryFormatV4?, Bool?) - case V5(Configuration, String, [MBDirectionsWaypoint], Bool?, GeometryFormatV5?, OverviewGranularity?, Bool?, Bool?) - - var method: HTTPMethod { - return .GET - } - - var encoding: HTTPEncoding { - return .URL - } - - var configuration: Configuration { - switch self { - case .V4(let config, _, _, _, _, _, _): return config - case .V5(let config, _, _, _, _, _, _, _): return config - } - } + case V4(MBDirectionsConfiguration, String, [MBDirectionsWaypoint], Bool?, InstructionFormat?, GeometryFormatV4?, Bool?) + case V5(MBDirectionsConfiguration, String, [MBDirectionsWaypoint], Bool?, GeometryFormatV5?, OverviewGranularity?, Bool?, Bool?) - var params: [String: String] { + var URLRequest: NSMutableURLRequest { + let result: (configuration: MBDirectionsConfiguration, path: String, parameters: [String: AnyObject]) switch self { - case .V4(_, _, _, let includeAlternatives, let instructionFormat, let geometryFormat, let includeSteps): - var params: [String: String] = [ - "alternatives": String(includeAlternatives ?? false), - ] + case .V4(let configuration, let profileIdentifier, let waypoints, let includeAlternatives, let instructionFormat, let geometryFormat, let includeSteps): + var params: [String:AnyObject] = ["access_token": configuration.accessToken!] + let coordinates = waypoints.map{ "\($0)" }.joinWithSeparator(";") + params["alternatives"] = String(includeAlternatives ?? false) if let instructionFormat = instructionFormat { params["instructions"] = instructionFormat.rawValue } @@ -81,10 +66,11 @@ internal enum MBDirectionsRouter: Router { if let includeSteps = includeSteps { params["steps"] = String(includeSteps) } - return params + result = (configuration, "/v4/directions/\(profileIdentifier)/\(coordinates).json", params) - case .V5(_, _, let waypoints, let includeAlternative, let geometryFormat, let overviewGranularity, let includeSteps, let allowPointUTurns): - var params: [String: String] = [:] + case .V5(let configuration, let profileIdentifier, let waypoints, let includeAlternative, let geometryFormat, let overviewGranularity, let includeSteps, let allowPointUTurns): + var params: [String:AnyObject] = ["access_token": configuration.accessToken!] + let coordinates = waypoints.map{ "\($0)" }.joinWithSeparator(";") if let includeAlternative = includeAlternative { params["alternative"] = String(includeAlternative) } @@ -92,7 +78,7 @@ internal enum MBDirectionsRouter: Router { if hasHeadings { params["bearings"] = waypoints.map { return $0.heading != nil ? "\($0.heading!)" : "" - }.joinWithSeparator(";") + }.joinWithSeparator(";") } if let geometryFormat = geometryFormat { params["geometries"] = geometryFormat.rawValue @@ -104,7 +90,7 @@ internal enum MBDirectionsRouter: Router { if hasAccuracies { params["radiuses"] = waypoints.map { return $0.accuracy != nil ? "\($0.accuracy!)" : "" - }.joinWithSeparator(";") + }.joinWithSeparator(";") } if let includeSteps = includeSteps { params["steps"] = String(includeSteps) @@ -112,19 +98,13 @@ internal enum MBDirectionsRouter: Router { if let allowPointUTurns = allowPointUTurns { params["uturns"] = String(allowPointUTurns) } - return params - } - } - - var path: String { - switch self { - case .V4(_, let profileIdentifier, let waypoints, _, _, _, _): - let coordinates = waypoints.map{ "\($0)" }.joinWithSeparator(";") - return "v4/directions/\(profileIdentifier)/\(coordinates).json" - - case .V5(_, let profileIdentifier, let waypoints, _, _, _, _, _): - let coordinates = waypoints.map{ "\($0)" }.joinWithSeparator(";") - return "directions/v5/\(profileIdentifier)/\(coordinates).json" + result = (configuration, "/directions/v5/\(profileIdentifier)/\(coordinates).json", params) } + + let URL = NSURL(string: result.configuration.apiEndpoint + result.path)! + let URLRequest = NSURLRequest(URL: URL) + let encoding = Alamofire.ParameterEncoding.URL + + return encoding.encode(URLRequest, parameters: result.parameters).0 } } \ No newline at end of file diff --git a/MapboxDirectionsTests/MapboxDirectionsTests.swift b/MapboxDirectionsTests/MapboxDirectionsTests.swift index ce697ee22..151814b03 100644 --- a/MapboxDirectionsTests/MapboxDirectionsTests.swift +++ b/MapboxDirectionsTests/MapboxDirectionsTests.swift @@ -16,39 +16,36 @@ class MapboxDirectionsTests: XCTestCase { func testV4Router() { let json = Fixture.stringFromFileNamed("driving_dc_polyline") - stubRequest("GET", "https://api.mapbox.com/v4/directions/mapbox.driving/-122.42,37.78;-77.03,38.91.json?access_token=\(BogusToken)&alternatives=true&geometry=polyline").andReturn(200).withHeaders(["Content-Type": "application/json"]).withBody(json) - + stubRequest("GET", "https://api.mapbox.com/v4/directions/mapbox.driving/-122.42,37.78%3B-77.03,38.91.json?access_token=\(BogusToken)&alternatives=true&geometry=polyline").andReturn(200).withHeaders(["Content-Type": "application/json"]).withBody(json) let expectation = expectationWithDescription("v4") let request = MBDirectionsRequest(sourceCoordinate: CLLocationCoordinate2D(latitude: 37.78, longitude: -122.42), destinationCoordinate: CLLocationCoordinate2D(latitude: 38.91, longitude: -77.03)) request.version = .Four request.requestsAlternateRoutes = true - let directions = MBDirections(request: request, accessToken: BogusToken) + let directions = MBDirections(accessToken: BogusToken) var routes: [MBRoute] = [] - directions.calculateDirectionsWithCompletionHandler { (response, error) in + directions.calculateDirectionsWithCompletionHandler(request) { (response, error) in XCTAssertNil(error, "Error: \(error)") - XCTAssertFalse(directions.calculating) - XCTAssertNotNil(response) routes = response!.routes + XCTAssertEqual(routes.count, 2) + XCTAssertEqual(routes.first!.geometry.count, 28268) + + // confirming actual decoded values is important because the Directions API + // uses an atypical precision level for polyline encoding + XCTAssertEqual(round(routes.first!.geometry.first!.latitude), 38) + XCTAssertEqual(round(routes.first!.geometry.first!.longitude), -122) + XCTAssertEqual(routes.first!.legs.count, 1) + XCTAssertEqual(routes.first!.legs.first!.steps.count, 136) + XCTAssertEqual(routes.first!.legs.first!.steps[24].distance, 106_258) + XCTAssertEqual(routes.first!.legs.first!.steps[24].duration, 3_929) + XCTAssertEqual(routes.first!.legs.first!.steps[24].name, "I 80") expectation.fulfill() } - waitForExpectationsWithTimeout(2) { (error) in - XCTAssertNil(error, "Error: \(error)") - XCTAssertFalse(directions.calculating) - } - XCTAssertEqual(routes.count, 2) - XCTAssertEqual(routes.first!.geometry.count, 28268) - // confirming actual decoded values is important because the Directions API - // uses an atypical precision level for polyline encoding - XCTAssertEqual(round(routes.first!.geometry.first!.latitude), 38) - XCTAssertEqual(round(routes.first!.geometry.first!.longitude), -122) - XCTAssertEqual(routes.first!.legs.count, 1) - XCTAssertEqual(routes.first!.legs.first!.steps.count, 136) - XCTAssertEqual(routes.first!.legs.first!.steps[24].distance, 106_258) - XCTAssertEqual(routes.first!.legs.first!.steps[24].duration, 3_929) - XCTAssertEqual(routes.first!.legs.first!.steps[24].name, "I 80") + waitForExpectationsWithTimeout(2) { error in + XCTAssertNil(error, "Error: \(error)") + } } } diff --git a/Podfile b/Podfile index 63485fc8f..648e4c02e 100644 --- a/Podfile +++ b/Podfile @@ -1,7 +1,7 @@ platform :ios, '8.0' use_frameworks! -pod 'NBNRequestKit', :git => 'https://github.com/1ec5/RequestKit.git', :branch => 'mapbox-podspec' +pod 'Alamofire', '~> 3.0' pod 'Polyline', '~> 3.0' target 'MapboxDirectionsTests' do