From 36a7acbd461814860c6ca799134a8d0cca83c5d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B8=D1=82=D0=B0=D0=BB=D0=B8=D0=B8=CC=86=20=D0=9A?= =?UTF-8?q?=D0=BE=D1=80=D0=BE=D1=82=D0=BA=D0=B8=D0=B8=CC=86?= Date: Fri, 1 Jun 2018 14:50:12 +0900 Subject: [PATCH] Add Alamofire support --- Cartfile | 1 + Podfile | 4 + Podfile.lock | 8 +- .../WebServiceAlamofireBaseEngine.swift | 157 ++++++++++++++++++ .../WebServiceAlamofireSimpleEngine.swift | 121 ++++++++++++++ Source/PThreadMutexLock.swift | 38 +++++ Source/WebService.swift | 29 ---- WebServiceExample.xcodeproj/project.pbxproj | 41 ++++- WebServiceSwift.podspec | 17 +- 9 files changed, 378 insertions(+), 38 deletions(-) create mode 100755 Cartfile create mode 100644 Source/Alamofire/WebServiceAlamofireBaseEngine.swift create mode 100644 Source/Alamofire/WebServiceAlamofireSimpleEngine.swift create mode 100644 Source/PThreadMutexLock.swift diff --git a/Cartfile b/Cartfile new file mode 100755 index 0000000..ba68cee --- /dev/null +++ b/Cartfile @@ -0,0 +1 @@ +github "Alamofire/Alamofire" ~> 4.7 diff --git a/Podfile b/Podfile index 53ab8b1..e24ec22 100644 --- a/Podfile +++ b/Podfile @@ -6,3 +6,7 @@ target 'WebServiceExample' do pod 'Alamofire' end +target 'WebServiceSwift' do + pod 'Alamofire' +end + diff --git a/Podfile.lock b/Podfile.lock index 5191f8a..e20c76c 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -4,9 +4,13 @@ PODS: DEPENDENCIES: - Alamofire +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Alamofire + SPEC CHECKSUMS: Alamofire: e4fa87002c137ba2d8d634d2c51fabcda0d5c223 -PODFILE CHECKSUM: e272eb5ac7ed6c653efe6688b042a0992b735290 +PODFILE CHECKSUM: 8c5d5d4f811ce36fa921b4d5cad56c9fda10835d -COCOAPODS: 1.4.0 +COCOAPODS: 1.5.2 diff --git a/Source/Alamofire/WebServiceAlamofireBaseEngine.swift b/Source/Alamofire/WebServiceAlamofireBaseEngine.swift new file mode 100644 index 0000000..e5583a5 --- /dev/null +++ b/Source/Alamofire/WebServiceAlamofireBaseEngine.swift @@ -0,0 +1,157 @@ +// +// WebServiceAlamofireBaseEngine.swift +// WebServiceSwift 2.3.0 +// +// Created by ViR (Короткий Виталий) on 31.05.2018. +// Copyright © 2018 ProVir. All rights reserved. +// + +import Foundation +import Alamofire + + +open class WebServiceAlamofireBaseEngine: WebServiceEngining { + public let queueForRequest: DispatchQueue? + public let queueForDataHandler: DispatchQueue? = nil + public let queueForDataHandlerFromStorage: DispatchQueue? = DispatchQueue.global(qos: .default) + + public let useNetworkActivityIndicator: Bool + + public init(queueForRequest: DispatchQueue?, useNetworkActivityIndicator: Bool) { + self.queueForRequest = queueForRequest + self.useNetworkActivityIndicator = useNetworkActivityIndicator + } + + + private struct TaskData { + var requestId: UInt64 + var requestData: RequestData + var request: Alamofire.DataRequest + } + + public struct RequestData { + public var request: WebServiceBaseRequesting + + public var completionWithData: (Any) -> Void + public var completionWithError: (Error) -> Void + public var canceled: () -> Void + + public var innerData: Any? + + public init(request: WebServiceBaseRequesting, + completionWithData: @escaping (Any) -> Void, + completionWithError: @escaping (Error) -> Void, + canceled: @escaping () -> Void, + innerData: Any? = nil) { + self.request = request + self.completionWithData = completionWithData + self.completionWithError = completionWithError + self.canceled = canceled + self.innerData = innerData + } + } + + + private let lock = PThreadMutexLock() + private var tasks = [UInt64: TaskData]() + + + public func performRequest(requestId: UInt64, request: WebServiceBaseRequesting, completionWithData: @escaping (Any) -> Void, completionWithError: @escaping (Error) -> Void, canceled: @escaping () -> Void) { + do { + let data = RequestData(request: request, completionWithData: completionWithData, completionWithError: completionWithError, canceled: canceled) + if let af_request = try self.performRequest(requestId: requestId, data: data) { + startAlamofireRequest(af_request, requestId: requestId, data: data) + } + } catch { + completionWithError(error) + } + } + + open func cancelRequest(requestId: UInt64) { + if let task:TaskData = lock.synchronized({ self.tasks.removeValue(forKey: requestId) }) { + task.request.cancel() + task.requestData.canceled() + + canceledAlamofireRequest(task.request, requestId: requestId) + } + } + + + + //MARK: - Need Override + open func isSupportedRequest(_ request: WebServiceBaseRequesting, rawDataTypeForRestoreFromStorage: Any.Type?) -> Bool { + fatalError("WebServiceAlamofireBaseEngine: require override isSupportedRequest(request:rawDataForRestoreFromStorage:) function. ") + } + + open func performRequest(requestId: UInt64, data: RequestData) throws -> Alamofire.DataRequest? { + fatalError("WebServiceAlamofireBaseEngine: require override request(data:) function. You need use function startAlamofireRequest(:data:)") + } + + open func dataHandler(request: WebServiceBaseRequesting, data: Any, isRawFromStorage: Bool) throws -> Any? { + fatalError("WebServiceAlamofireBaseEngine: require override dataHandler(request:data:isRawFromStorage:) function. ") + } + + + //MARK: Can override + open func canceledAlamofireRequest(_ request: Alamofire.DataRequest, requestId: UInt64) { + + } + + open func responseAlamofire(_ response: Alamofire.DataResponse, requestId: UInt64, requestData: RequestData) throws -> Any { + //Default implementation + switch response.result { + case .success(let data): + return data + + case .failure(let error): + throw error + } + } + + + + //MARK: - Helper + public func startAlamofireRequest(_ request: Alamofire.DataRequest, requestId: UInt64, data: RequestData) { + let task = TaskData(requestId: requestId, requestData: data, request: request) + + lock.synchronized { + self.tasks[requestId] = task + } + + task.request.responseData(queue: queueForDataHandlerFromStorage) { [weak self] response in + if let sSelf = self { + sSelf.lock.synchronized { + sSelf.tasks.removeValue(forKey: requestId) + } + + do { + let result = try sSelf.responseAlamofire(response, requestId: requestId, requestData: data) + data.completionWithData(result) + } catch { + data.completionWithError(error) + } + } else { + data.canceled() + } + } + } + + public func requestData(forSessionTask sessionTask: URLSessionTask) -> (requestId: UInt64, data: RequestData)? { + return lock.synchronized { + for (requestId, taskData) in tasks { + if taskData.request.task == sessionTask { + return (requestId, taskData.requestData) + } + } + + return nil + } + } + + public func updateRequestData(requestId: UInt64, data: RequestData) { + lock.synchronized { + tasks[requestId]?.requestData = data + } + } + +} diff --git a/Source/Alamofire/WebServiceAlamofireSimpleEngine.swift b/Source/Alamofire/WebServiceAlamofireSimpleEngine.swift new file mode 100644 index 0000000..155524c --- /dev/null +++ b/Source/Alamofire/WebServiceAlamofireSimpleEngine.swift @@ -0,0 +1,121 @@ +// +// WebServiceAlamofireSimpleEngine.swift +// WebServiceSwift 2.3.0 +// +// Created by ViR (Короткий Виталий) on 01.06.2018. +// Copyright © 2018 ProVir. All rights reserved. +// + +import Foundation +import Alamofire + + +//MARK: Request +public protocol WebServiceAlamofireBaseRequesting { + func afRequest(sessionManager: Alamofire.SessionManager) throws -> Alamofire.DataRequest + + var afResponseType: WebServiceAlamofireResponseType { get } + func afBaseDecodeResponse(_ data: WebServiceAlamofireResponseData) throws -> Any? +} + +public protocol WebServiceAlamofireRequesting: WebServiceAlamofireBaseRequesting, WebServiceRequesting { + func afDecodeResponse(_ data: WebServiceAlamofireResponseData) throws -> ResultType +} + +public extension WebServiceAlamofireRequesting { + func afBaseDecodeResponse(_ data: WebServiceAlamofireResponseData) throws -> Any? { + return try afDecodeResponse(data) + } +} + +//MARK: Response +public enum WebServiceAlamofireResponseType { + case binary + case json +} + +public struct WebServiceAlamofireResponseData { + //Only one is not null + public let binary: Data! + public let json: Any! + + public init(binary: Data) { + self.binary = binary + self.json = nil + } + + public init(json: Any) { + self.json = json + self.binary = nil + } +} + +//MARK: Auto decoders +protocol WebServiceAlamofireAutoDecoder: WebServiceRequesting { } + +extension WebServiceAlamofireAutoDecoder where ResultType == Void { + var afResponseType: WebServiceAlamofireResponseType { return .binary } + func afDecodeResponse(_ data: WebServiceAlamofireResponseData) throws -> Void { + return Void() + } +} + +extension WebServiceAlamofireAutoDecoder where ResultType == Data { + var afResponseType: WebServiceAlamofireResponseType { return .binary } + func afDecodeResponse(_ data: WebServiceAlamofireResponseData) throws -> Data { + return data.binary + } +} + + +//MARK: Engine +public class WebServiceAlamofireSimpleEngine: WebServiceAlamofireBaseEngine { + private let sessionManager: Alamofire.SessionManager + + public init(sessionManager: Alamofire.SessionManager = Alamofire.SessionManager.default, queueForRequest: DispatchQueue? = nil, useNetworkActivityIndicator: Bool = true) { + self.sessionManager = sessionManager + super.init(queueForRequest: queueForRequest, useNetworkActivityIndicator: useNetworkActivityIndicator) + } + + public override func isSupportedRequest(_ request: WebServiceBaseRequesting, rawDataTypeForRestoreFromStorage: Any.Type?) -> Bool { + return request is WebServiceAlamofireBaseRequesting + } + + public override func performRequest(requestId: UInt64, data: WebServiceAlamofireBaseEngine.RequestData) throws -> DataRequest? { + guard let request = data.request as? WebServiceAlamofireBaseRequesting else { + throw WebServiceRequestError.notSupportRequest + } + + return try request.afRequest(sessionManager: sessionManager) + } + + public override func responseAlamofire(_ response: DataResponse, requestId: UInt64, requestData: WebServiceAlamofireBaseEngine.RequestData) throws -> Any { + switch response.result { + case .success(let data): + if let statusCode = response.response?.statusCode, statusCode >= 300 { + throw WebServiceResponseError.httpStatusCode(statusCode) + } + + return data + + case .failure(let error): + throw error + } + } + + public override func dataHandler(request: WebServiceBaseRequesting, data: Any, isRawFromStorage: Bool) throws -> Any? { + guard let binary = data as? Data, let request = request as? WebServiceAlamofireBaseRequesting else { + throw WebServiceRequestError.notSupportDataHandler + } + + switch request.afResponseType { + case .binary: + return try request.afBaseDecodeResponse(WebServiceAlamofireResponseData(binary: binary)) + + case .json: + let jsonData = try JSONSerialization.jsonObject(with: binary, options: []) + return try request.afBaseDecodeResponse(WebServiceAlamofireResponseData(json: jsonData)) + } + } + +} diff --git a/Source/PThreadMutexLock.swift b/Source/PThreadMutexLock.swift new file mode 100644 index 0000000..5dfe5e4 --- /dev/null +++ b/Source/PThreadMutexLock.swift @@ -0,0 +1,38 @@ +// +// PThreadMutexLock.swift +// WebServiceExample +// +// Created by Короткий Виталий on 01.06.2018. +// Copyright © 2018 ProVir. All rights reserved. +// + +import Foundation + +internal class PThreadMutexLock: NSObject, NSLocking { + private var mutex = pthread_mutex_t() + + override init() { + super.init() + + pthread_mutex_init(&mutex, nil) + } + + deinit { + pthread_mutex_destroy(&mutex) + } + + func lock() { + pthread_mutex_lock(&mutex) + } + + func unlock() { + pthread_mutex_unlock(&mutex) + } + + @discardableResult + func synchronized(_ handler: () throws -> T) rethrows -> T { + pthread_mutex_lock(&mutex) + defer { pthread_mutex_unlock(&mutex) } + return try handler() + } +} diff --git a/Source/WebService.swift b/Source/WebService.swift index a0ef270..190990f 100644 --- a/Source/WebService.swift +++ b/Source/WebService.swift @@ -733,32 +733,3 @@ public class WebService { } } -//MARK: Helpers -private class PThreadMutexLock: NSObject, NSLocking { - private var mutex = pthread_mutex_t() - - override init() { - super.init() - - pthread_mutex_init(&mutex, nil) - } - - deinit { - pthread_mutex_destroy(&mutex) - } - - func lock() { - pthread_mutex_lock(&mutex) - } - - func unlock() { - pthread_mutex_unlock(&mutex) - } - - @discardableResult - func synchronized(_ handler: () throws -> T) rethrows -> T { - pthread_mutex_lock(&mutex) - defer { pthread_mutex_unlock(&mutex) } - return try handler() - } -} diff --git a/WebServiceExample.xcodeproj/project.pbxproj b/WebServiceExample.xcodeproj/project.pbxproj index 7663345..f82bacd 100644 --- a/WebServiceExample.xcodeproj/project.pbxproj +++ b/WebServiceExample.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 1E83A77DD9EC16D322D9B583 /* Pods_WebServiceSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6C775317C0A1CC5D1DF5292 /* Pods_WebServiceSwift.framework */; }; 501D2AC11F4E8DD0000E3FA3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501D2AC01F4E8DD0000E3FA3 /* AppDelegate.swift */; }; 501D2AC31F4E8DD0000E3FA3 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501D2AC21F4E8DD0000E3FA3 /* ViewController.swift */; }; 501D2AC61F4E8DD0000E3FA3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 501D2AC41F4E8DD0000E3FA3 /* Main.storyboard */; }; @@ -20,6 +21,9 @@ 501D2AF21F5188CC000E3FA3 /* WebServiceHtmlEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501D2AEF1F4EA1EC000E3FA3 /* WebServiceHtmlEngine.swift */; }; 501D2AFA1F527D03000E3FA3 /* WebServiceProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501D2AE91F4E917A000E3FA3 /* WebServiceProtocols.swift */; }; 501D2AFB1F527D05000E3FA3 /* WebService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501D2AE41F4E8FA2000E3FA3 /* WebService.swift */; }; + 5054625520C0665000595948 /* WebServiceAlamofireBaseEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5054625320C065DE00595948 /* WebServiceAlamofireBaseEngine.swift */; }; + 5054625820C066FD00595948 /* PThreadMutexLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5054625620C066B500595948 /* PThreadMutexLock.swift */; }; + 5054625A20C1026800595948 /* WebServiceAlamofireSimpleEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5054625920C1026800595948 /* WebServiceAlamofireSimpleEngine.swift */; }; 506CAFCF2084D729008AB016 /* WebServiceTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 506CAFCD2084D707008AB016 /* WebServiceTypes.swift */; }; 50844338207D244900C757C7 /* WebServiceMockEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F4943120565FD1004F1E08 /* WebServiceMockEngine.swift */; }; 50AB6AB020883C2F00C1E093 /* SiteWebProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AB6AAF20883C2F00C1E093 /* SiteWebProvider.swift */; }; @@ -69,6 +73,9 @@ 501D2AEB1F4E92A1000E3FA3 /* WebServiceSimpleFileStorage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebServiceSimpleFileStorage.swift; sourceTree = ""; }; 501D2AED1F4E9BE5000E3FA3 /* SiteWebServiceRequest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SiteWebServiceRequest.swift; sourceTree = ""; }; 501D2AEF1F4EA1EC000E3FA3 /* WebServiceHtmlEngine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebServiceHtmlEngine.swift; sourceTree = ""; }; + 5054625320C065DE00595948 /* WebServiceAlamofireBaseEngine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebServiceAlamofireBaseEngine.swift; sourceTree = ""; }; + 5054625620C066B500595948 /* PThreadMutexLock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PThreadMutexLock.swift; sourceTree = ""; }; + 5054625920C1026800595948 /* WebServiceAlamofireSimpleEngine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebServiceAlamofireSimpleEngine.swift; sourceTree = ""; }; 506CAFCD2084D707008AB016 /* WebServiceTypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebServiceTypes.swift; sourceTree = ""; }; 50A9162420B09C4C00EA2E9D /* WebServiceSwift.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; fileEncoding = 4; path = WebServiceSwift.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 50AB6AAF20883C2F00C1E093 /* SiteWebProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteWebProvider.swift; sourceTree = ""; }; @@ -76,7 +83,10 @@ 50BFAFF7208F4C8A007E8FBD /* WebServiceRequestProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebServiceRequestProvider.swift; sourceTree = ""; }; 50F0804F20AC843B00994710 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 50F4943120565FD1004F1E08 /* WebServiceMockEngine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebServiceMockEngine.swift; sourceTree = ""; }; + 83873141EF5334067DE0C2D6 /* Pods-WebServiceSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WebServiceSwift.release.xcconfig"; path = "Pods/Target Support Files/Pods-WebServiceSwift/Pods-WebServiceSwift.release.xcconfig"; sourceTree = ""; }; 85924404FE98C539DF31A8DB /* Pods-WebServiceExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WebServiceExample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WebServiceExample/Pods-WebServiceExample.debug.xcconfig"; sourceTree = ""; }; + 918173D2DBEB2D8E5D5A88E4 /* Pods-WebServiceSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WebServiceSwift.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WebServiceSwift/Pods-WebServiceSwift.debug.xcconfig"; sourceTree = ""; }; + D6C775317C0A1CC5D1DF5292 /* Pods_WebServiceSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WebServiceSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F4B8A17FA11DD9EA2D2B9A1B /* Pods-WebServiceExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WebServiceExample.release.xcconfig"; path = "Pods/Target Support Files/Pods-WebServiceExample/Pods-WebServiceExample.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -94,6 +104,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1E83A77DD9EC16D322D9B583 /* Pods_WebServiceSwift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -104,6 +115,7 @@ isa = PBXGroup; children = ( 3F1924AD271EBC436C8C75A4 /* Pods_WebServiceExample.framework */, + D6C775317C0A1CC5D1DF5292 /* Pods_WebServiceSwift.framework */, ); name = Frameworks; sourceTree = ""; @@ -156,10 +168,21 @@ 50BFAFF7208F4C8A007E8FBD /* WebServiceRequestProvider.swift */, 501D2AEB1F4E92A1000E3FA3 /* WebServiceSimpleFileStorage.swift */, 50F4943120565FD1004F1E08 /* WebServiceMockEngine.swift */, + 5054625620C066B500595948 /* PThreadMutexLock.swift */, + 5054625220C065B200595948 /* Alamofire */, ); path = Source; sourceTree = ""; }; + 5054625220C065B200595948 /* Alamofire */ = { + isa = PBXGroup; + children = ( + 5054625320C065DE00595948 /* WebServiceAlamofireBaseEngine.swift */, + 5054625920C1026800595948 /* WebServiceAlamofireSimpleEngine.swift */, + ); + path = Alamofire; + sourceTree = ""; + }; 50AB6AB320883F9E00C1E093 /* Support */ = { isa = PBXGroup; children = ( @@ -192,6 +215,8 @@ children = ( 85924404FE98C539DF31A8DB /* Pods-WebServiceExample.debug.xcconfig */, F4B8A17FA11DD9EA2D2B9A1B /* Pods-WebServiceExample.release.xcconfig */, + 918173D2DBEB2D8E5D5A88E4 /* Pods-WebServiceSwift.debug.xcconfig */, + 83873141EF5334067DE0C2D6 /* Pods-WebServiceSwift.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -220,7 +245,6 @@ 501D2ABB1F4E8DD0000E3FA3 /* Resources */, 501D2AE31F4E8DF5000E3FA3 /* Embed Frameworks */, 870D9FAA52C0FBEAAA31B3AF /* [CP] Embed Pods Frameworks */, - 58227AD622723A2585EC043A /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -236,6 +260,7 @@ isa = PBXNativeTarget; buildConfigurationList = 501D2AE01F4E8DF5000E3FA3 /* Build configuration list for PBXNativeTarget "WebServiceSwift" */; buildPhases = ( + 69A47ED8837A94E008DAD2B6 /* [CP] Check Pods Manifest.lock */, 501D2AD21F4E8DF5000E3FA3 /* Sources */, 501D2AD31F4E8DF5000E3FA3 /* Frameworks */, 501D2AD41F4E8DF5000E3FA3 /* Headers */, @@ -330,19 +355,22 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 58227AD622723A2585EC043A /* [CP] Copy Pods Resources */ = { + 69A47ED8837A94E008DAD2B6 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Copy Pods Resources"; + name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-WebServiceSwift-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-WebServiceExample/Pods-WebServiceExample-resources.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 870D9FAA52C0FBEAAA31B3AF /* [CP] Embed Pods Frameworks */ = { @@ -383,10 +411,13 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5054625520C0665000595948 /* WebServiceAlamofireBaseEngine.swift in Sources */, 506CAFCF2084D729008AB016 /* WebServiceTypes.swift in Sources */, 50844338207D244900C757C7 /* WebServiceMockEngine.swift in Sources */, 50BFAFF9208F4C8E007E8FBD /* WebServiceRequestProvider.swift in Sources */, 501D2AFB1F527D05000E3FA3 /* WebService.swift in Sources */, + 5054625820C066FD00595948 /* PThreadMutexLock.swift in Sources */, + 5054625A20C1026800595948 /* WebServiceAlamofireSimpleEngine.swift in Sources */, 501D2AFA1F527D03000E3FA3 /* WebServiceProtocols.swift in Sources */, 501D2AEC1F4E92A1000E3FA3 /* WebServiceSimpleFileStorage.swift in Sources */, ); @@ -567,6 +598,7 @@ }; 501D2AE11F4E8DF5000E3FA3 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 918173D2DBEB2D8E5D5A88E4 /* Pods-WebServiceSwift.debug.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; @@ -592,6 +624,7 @@ }; 501D2AE21F4E8DF5000E3FA3 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 83873141EF5334067DE0C2D6 /* Pods-WebServiceSwift.release.xcconfig */; buildSettings = { CLANG_ENABLE_MODULES = YES; CODE_SIGN_IDENTITY = ""; diff --git a/WebServiceSwift.podspec b/WebServiceSwift.podspec index ca7be43..9afbafa 100644 --- a/WebServiceSwift.podspec +++ b/WebServiceSwift.podspec @@ -12,6 +12,7 @@ Pod::Spec.new do |s| s.homepage = "https://github.com/ProVir/WebServiceSwift" s.license = { :type => "MIT", :file => "LICENSE" } s.author = { "ViR (Vitaliy Korotkiy)" => "admin@provir.ru" } + s.source = { :git => "https://github.com/ProVir/WebServiceSwift.git", :tag => "#{s.version}" } s.swift_version = '4' s.ios.deployment_target = '8.0' @@ -19,8 +20,18 @@ Pod::Spec.new do |s| s.tvos.deployment_target = '9.0' s.watchos.deployment_target = '2.0' - s.source = { :git => "https://github.com/ProVir/WebServiceSwift.git", :tag => "#{s.version}" } + s.default_subspec = 'Core' + + s.subspec 'Core' do |ss| + ss.source_files = 'Source/*.{h,swift}' + ss.public_header_files = 'Source/*.h' + end - s.source_files = 'Source/*.{h,swift}' - s.public_header_files = 'Source/*.h' + s.subspec 'Alamofire' do |ss| + ss.source_files = 'Source/Alamofire/*.swift' + + ss.dependency 'WebServiceSwift/Core' + ss.dependency 'Alamofire' + end + end