diff --git a/Example/Pods/Local Podspecs/SwiftStomp.podspec.json b/Example/Pods/Local Podspecs/SwiftStomp.podspec.json index 68134d8..4dca0c5 100644 --- a/Example/Pods/Local Podspecs/SwiftStomp.podspec.json +++ b/Example/Pods/Local Podspecs/SwiftStomp.podspec.json @@ -1,28 +1,31 @@ { "name": "SwiftStomp", - "version": "0.1.0", + "version": "1.2.0", "summary": "An elegant Stomp client for iOS.", - "description": "SwiftStomp is and elegant, light-weight and easy-to-use STOMP (Simple Text Oriented Messaging Protocol) client for iOS.\nIt's based on Starscream, an amazing Websocket library for swift.", + "description": "SwiftStomp is and elegant, light-weight and easy-to-use STOMP (Simple Text Oriented Messaging Protocol) client for iOS.\nIt's based on URLSessionWebSocketTask.", "homepage": "https://github.com/Romixery/SwiftStomp", "license": { - "type": "MIT License", + "type": "MIT", "file": "LICENSE" }, "authors": { - "Ahmad Daneshvar": "http://iamdaneshvar.com" + "Ahmad Daneshvar": "http://attar.ai" }, "source": { "git": "https://github.com/Romixery/SwiftStomp.git", - "tag": "0.1.0" + "tag": "1.2.0" }, "platforms": { - "ios": "8.0" + "ios": "13.0", + "osx": "10.15", + "tvos": "13.0", + "watchos": "6.0" }, "swift_versions": "5.0", "source_files": "SwiftStomp/Classes/**/*", "dependencies": { - "Starscream": [ - "~> 4.0.0" + "ReachabilitySwift": [ + "~> 5.0.0" ] }, "swift_version": "5.0" diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock index 997a41f..b977261 100644 --- a/Example/Pods/Manifest.lock +++ b/Example/Pods/Manifest.lock @@ -1,23 +1,23 @@ PODS: - - Starscream (4.0.3) - - SwiftStomp (0.1.0): - - Starscream (~> 4.0.0) + - ReachabilitySwift (5.0.0) + - SwiftStomp (1.1.1): + - ReachabilitySwift (~> 5.0.0) DEPENDENCIES: - SwiftStomp (from `../`) SPEC REPOS: trunk: - - Starscream + - ReachabilitySwift EXTERNAL SOURCES: SwiftStomp: :path: "../" SPEC CHECKSUMS: - Starscream: ef06f0961fff0880bca0604416d61141e4faca67 - SwiftStomp: 1386ff635d886e8fd9e328d1bbc80503dda59558 + ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 + SwiftStomp: cfd32c36529b623aa3f16842a8289039f57b6ab2 PODFILE CHECKSUM: 9d80d66f09641e8312023195b967f8cf282b8c6d -COCOAPODS: 1.9.1 +COCOAPODS: 1.14.3 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index d75a565..6b46bbc 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -7,154 +7,149 @@ objects = { /* Begin PBXBuildFile section */ - 0A0E8476402B53B091B91A7DE07E0008 /* Engine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A0925310BE76B051E1B51E7FBB37F35 /* Engine.swift */; }; - 0CC54E4D0945262C1B835B699345B034 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D2727BA14E02E7210DD6B547EA7D394 /* WebSocket.swift */; }; - 1572414BB57E1CAEB0839E30A33979C0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBB895F616DD1C4C7C1587261E4EBE5D /* Foundation.framework */; }; - 15A52A1F9EDD20585A5D89BEDACE6195 /* SwiftStomp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 295E855E8EA5F0CF63FBA7F2E1471A26 /* SwiftStomp-dummy.m */; }; - 190BC16FCBB53F6C6F2C0618B6BE7DDA /* FoundationHTTPServerHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81F95157FC4CC8593A1B1E4607562122 /* FoundationHTTPServerHandler.swift */; }; - 195E17A825CB18759C7D6511DACCB3E9 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFD212064ED1CC47B2560F6E20526B3B /* Server.swift */; }; - 19E712862F3F845060EA7DADEAD9BC59 /* FoundationTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D7E34251E9353A38AC748BB94EDC575 /* FoundationTransport.swift */; }; - 1BCEC1C72A76476B70CE4B032A9D9B32 /* StringHTTPHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16D70531198624C7D8B14FF91C62FF6B /* StringHTTPHandler.swift */; }; - 34A9F9CF9691CA19B5FCFE9E17AE9E00 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBB895F616DD1C4C7C1587261E4EBE5D /* Foundation.framework */; }; - 359D3455A362843977E8E3076B7D8162 /* TCPTransport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56CCA8582A00BBFBC2E9AFFC1C1D53A9 /* TCPTransport.swift */; }; - 36D1530899987EF165D0AFC6D2B9EAF2 /* FrameCollector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C291A02C054326B5C6022EACD814E4 /* FrameCollector.swift */; }; - 37E36C07C168E5737FBA757736AB1263 /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7175E21DED4337E7BBD3EF7424F315F6 /* Data+Extensions.swift */; }; - 3CDC833CF0098C529369B093954AEB26 /* Pods-SwiftStomp_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 442FF4C11BBCB61204B5C6A3C5350EDA /* Pods-SwiftStomp_Example-dummy.m */; }; - 4572F22239A84AC23B262764D429E2EB /* Framer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1454E39E11FD28A611495E03B2015FD4 /* Framer.swift */; }; - 4D322C7978617308B276D6F4902C2335 /* WSEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ED9AF7BDFE0F03CE129D72D85FCA460 /* WSEngine.swift */; }; - 5208660ADE378A7349BD70FDFD7E5A93 /* SwiftStomp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DC6F79753DB862A510CD313F5218D59 /* SwiftStomp.swift */; }; - 703C0586C478A922E21934D3B149A71E /* Starscream-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 21B65F09370A4D9877255EC1C47060A2 /* Starscream-dummy.m */; }; - 793D18E42CC454D1C4225339797DB9EB /* WSCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1918C09D193EF7F62A7C2611F12AC44B /* WSCompression.swift */; }; - 894E47358149672D5810C31E4B64AF0D /* HTTPHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35ED0E33A6DD024AC0E71FEF3EA74D7C /* HTTPHandler.swift */; }; - 946911E4FFC48BF8F84D076D258A1322 /* FoundationSecurity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5831A57C2E79638C447411ED69EB6C42 /* FoundationSecurity.swift */; }; - 99CC2D5DC15DBA9F5A494E76FF940B62 /* Starscream-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ECFB158E08A6502A38761C96CB68975B /* Starscream-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C07413B05F2A3CD997EBCE9D8EE5FD08 /* Compression.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2EAFCD04DEECC2AC6B8727048A80617 /* Compression.swift */; }; - C2809B4763602D15A7384398343AE406 /* Transport.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9C8BC22AA74FEDA9CF44852D28F68A4 /* Transport.swift */; }; - C808D0298CC1CD6C13E283663535B259 /* WebSocketServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A62AC07A9271D8996F97CC35856BA647 /* WebSocketServer.swift */; }; - CCDFE079D2DA1E51162E69A3A28BF23F /* NativeEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56ADCC3B462E7AE2D80872C7A66CA4A7 /* NativeEngine.swift */; }; - D59F959163A35397E8B3A32CEB6BE2B0 /* Pods-SwiftStomp_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F6AB6E19A0AA7517AF36CAA95C38AF3F /* Pods-SwiftStomp_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D90A02DDFD123C1F4007095464FDFAFD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBB895F616DD1C4C7C1587261E4EBE5D /* Foundation.framework */; }; - DA25193E27ABCAC731A9549A566C5FDB /* FoundationHTTPHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF39A541BA78B8472A0F9D4E3504B90 /* FoundationHTTPHandler.swift */; }; - F4D86DAACC44D52F4580AD0721D10459 /* Security.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FC292255BA6A323D7D1C01215CC6591 /* Security.swift */; }; - F65503DD8313D90E1A5A5C694B387D8D /* SwiftStomp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B4BB7C6AB39595DE12D39DB0719D4F52 /* SwiftStomp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FEF28BDE727621F9E227C026677AC1C2 /* Starscream.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3319CBE6BF16B5B2366BDE834B663B5E /* Starscream.framework */; }; + 17DE87344CAD319DE6AA0F7BE1BA10C7 /* ReachabilitySwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FF778BEFC7721E16D5F02EF17376689 /* ReachabilitySwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 210DD290122BB0C7A0E83DC5148D724E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE2B117F7A3CB312FF54BFF9D46B0180 /* Foundation.framework */; }; + 4C6A10FA290E63347D1B47A4AE7F526A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE2B117F7A3CB312FF54BFF9D46B0180 /* Foundation.framework */; }; + 504ACC282BF6F68600741EC7 /* StompRequestFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC262BF6F68600741EC7 /* StompRequestFrame.swift */; }; + 504ACC2B2BF6F6A700741EC7 /* StompResponseFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC292BF6F6A700741EC7 /* StompResponseFrame.swift */; }; + 504ACC2E2BF6F6C400741EC7 /* StompAckMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC2C2BF6F6C400741EC7 /* StompAckMode.swift */; }; + 504ACC312BF6F6DC00741EC7 /* StompCommandHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC2F2BF6F6DC00741EC7 /* StompCommandHeader.swift */; }; + 504ACC342BF6F6F200741EC7 /* StompErrorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC322BF6F6F200741EC7 /* StompErrorType.swift */; }; + 504ACC372BF6F70100741EC7 /* StompDisconnectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC352BF6F70100741EC7 /* StompDisconnectType.swift */; }; + 504ACC3A2BF6F71B00741EC7 /* StompConnectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC382BF6F71B00741EC7 /* StompConnectType.swift */; }; + 504ACC3D2BF6F73000741EC7 /* StompConnectionStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC3B2BF6F73000741EC7 /* StompConnectionStatus.swift */; }; + 504ACC402BF6F74B00741EC7 /* StompLogType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC3E2BF6F74B00741EC7 /* StompLogType.swift */; }; + 504ACC432BF6F77C00741EC7 /* StompUpstreamMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC412BF6F77C00741EC7 /* StompUpstreamMessage.swift */; }; + 504ACC472BF6F94300741EC7 /* StompFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC452BF6F94300741EC7 /* StompFrame.swift */; }; + 504ACC4A2BF6F99F00741EC7 /* StompHeaderBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC482BF6F99F00741EC7 /* StompHeaderBuilder.swift */; }; + 504ACC4D2BF6FC6500741EC7 /* StompUpstreamEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC4B2BF6FC6500741EC7 /* StompUpstreamEvent.swift */; }; + 504ACC512BF6FE8A00741EC7 /* InvalidStompCommandError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC4F2BF6FE8A00741EC7 /* InvalidStompCommandError.swift */; }; + 504ACC542BF6FFA200741EC7 /* StompError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC522BF6FFA200741EC7 /* StompError.swift */; }; + 5433D9B1A7004CEBF4CA2F1FEEBCAB38 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2544C3A1631BACBD2FC964E079CB6787 /* CoreTelephony.framework */; }; + 5C29D180D52BC57EE1674EE7D29F5A81 /* SwiftStomp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DC6F79753DB862A510CD313F5218D59 /* SwiftStomp.swift */; }; + 899ECE89E905625730B7070CC0941F84 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE2B117F7A3CB312FF54BFF9D46B0180 /* Foundation.framework */; }; + 93DE5DC6D98B5DD09860532E35AE7C90 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8600D47A402BFF4D6115152C4674E704 /* SystemConfiguration.framework */; }; + 960DCEE9167C9C9E11FAA0EDAF872B2F /* ReachabilitySwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = EF58B756C1B6F83080EB05354E04317B /* ReachabilitySwift-dummy.m */; }; + AB43B618099D0E0BE5730DE4166CD403 /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1118FC4BF2349E61D5A97571B401A8C /* Reachability.swift */; }; + CCDAA267D476D90993BE641791423BCD /* SwiftStomp-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B4BB7C6AB39595DE12D39DB0719D4F52 /* SwiftStomp-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D417586D6A6F2DCC2B9E14C8020012C2 /* Pods-SwiftStomp_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F6AB6E19A0AA7517AF36CAA95C38AF3F /* Pods-SwiftStomp_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E12150F171CDCBF069DC0470D092AE46 /* SwiftStomp-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 295E855E8EA5F0CF63FBA7F2E1471A26 /* SwiftStomp-dummy.m */; }; + F613E84A68B66A38B1707E1C89B0E112 /* Pods-SwiftStomp_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 442FF4C11BBCB61204B5C6A3C5350EDA /* Pods-SwiftStomp_Example-dummy.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 2F80DE4C858239512F4A086599EB7CCD /* PBXContainerItemProxy */ = { + 51EE37134823D2FB5EC971A8AAC9CE5B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9B78EE4AF6AE03E79D88886319853FF7; - remoteInfo = Starscream; + remoteGlobalIDString = 0B00B2C167CD783351BD1D00BD5AD1F8; + remoteInfo = ReachabilitySwift; }; - 433122046658C52DF0CAF3328DE7BCEC /* PBXContainerItemProxy */ = { + 891C5A5BE9BDC9DD9067DCB4C5BB1379 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 4EF39EA0BF2F2ACCC6A5344BC36BFFA6; remoteInfo = SwiftStomp; }; - DD8E5E55D2F8C9C3F5506BD6DB26033F /* PBXContainerItemProxy */ = { + DD7386A1E463F7489503B3F7745A7E4E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 9B78EE4AF6AE03E79D88886319853FF7; - remoteInfo = Starscream; + remoteGlobalIDString = 0B00B2C167CD783351BD1D00BD5AD1F8; + remoteInfo = ReachabilitySwift; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 010F5C43A348BC3C417C21FA354444E2 /* Starscream-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Starscream-prefix.pch"; sourceTree = ""; }; + 069AA35E898B4C00466D4271509A6343 /* ReachabilitySwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ReachabilitySwift-Info.plist"; sourceTree = ""; }; + 073ACA4DDA4280FAB4C52373FD97AFDF /* ReachabilitySwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ReachabilitySwift.release.xcconfig; sourceTree = ""; }; 089B325A2928099B2F83D9C7F725EF52 /* SwiftStomp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftStomp.debug.xcconfig; sourceTree = ""; }; 0DC6F79753DB862A510CD313F5218D59 /* SwiftStomp.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftStomp.swift; path = SwiftStomp/Classes/SwiftStomp.swift; sourceTree = ""; }; - 1454E39E11FD28A611495E03B2015FD4 /* Framer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Framer.swift; path = Sources/Framer/Framer.swift; sourceTree = ""; }; - 16D70531198624C7D8B14FF91C62FF6B /* StringHTTPHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StringHTTPHandler.swift; path = Sources/Framer/StringHTTPHandler.swift; sourceTree = ""; }; - 1918C09D193EF7F62A7C2611F12AC44B /* WSCompression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WSCompression.swift; path = Sources/Compression/WSCompression.swift; sourceTree = ""; }; - 21B65F09370A4D9877255EC1C47060A2 /* Starscream-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Starscream-dummy.m"; sourceTree = ""; }; + 21B03CA622E690725A6626C088E1D09F /* Reachability.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Reachability.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 2544C3A1631BACBD2FC964E079CB6787 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreTelephony.framework; sourceTree = DEVELOPER_DIR; }; 25EB98BC21B744B34F59F9EFE0BF0468 /* Pods-SwiftStomp_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SwiftStomp_Example.debug.xcconfig"; sourceTree = ""; }; - 2871FB4F18D62FCEBB1B082F84F1E516 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + 2871FB4F18D62FCEBB1B082F84F1E516 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 295E855E8EA5F0CF63FBA7F2E1471A26 /* SwiftStomp-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SwiftStomp-dummy.m"; sourceTree = ""; }; - 2C1CF04602B9D61F89BCC51DEA7939B0 /* Starscream.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Starscream.debug.xcconfig; sourceTree = ""; }; 2E8BC4D1B7D1C550987A28244F55C832 /* SwiftStomp.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SwiftStomp.modulemap; sourceTree = ""; }; - 3319CBE6BF16B5B2366BDE834B663B5E /* Starscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Starscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 35D05560FE89182EC91527E794A9B8F8 /* Pods-SwiftStomp_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-SwiftStomp_Example-acknowledgements.markdown"; sourceTree = ""; }; - 35ED0E33A6DD024AC0E71FEF3EA74D7C /* HTTPHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HTTPHandler.swift; path = Sources/Framer/HTTPHandler.swift; sourceTree = ""; }; - 37C291A02C054326B5C6022EACD814E4 /* FrameCollector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FrameCollector.swift; path = Sources/Framer/FrameCollector.swift; sourceTree = ""; }; - 3AF39A541BA78B8472A0F9D4E3504B90 /* FoundationHTTPHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FoundationHTTPHandler.swift; path = Sources/Framer/FoundationHTTPHandler.swift; sourceTree = ""; }; - 3D7E34251E9353A38AC748BB94EDC575 /* FoundationTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FoundationTransport.swift; path = Sources/Transport/FoundationTransport.swift; sourceTree = ""; }; 4023886470323991EC07D2198E0873A1 /* SwiftStomp-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SwiftStomp-Info.plist"; sourceTree = ""; }; 442FF4C11BBCB61204B5C6A3C5350EDA /* Pods-SwiftStomp_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-SwiftStomp_Example-dummy.m"; sourceTree = ""; }; - 4A0925310BE76B051E1B51E7FBB37F35 /* Engine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Engine.swift; path = Sources/Engine/Engine.swift; sourceTree = ""; }; - 4D2727BA14E02E7210DD6B547EA7D394 /* WebSocket.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebSocket.swift; path = Sources/Starscream/WebSocket.swift; sourceTree = ""; }; - 4FC292255BA6A323D7D1C01215CC6591 /* Security.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Security.swift; path = Sources/Security/Security.swift; sourceTree = ""; }; - 56ADCC3B462E7AE2D80872C7A66CA4A7 /* NativeEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeEngine.swift; path = Sources/Engine/NativeEngine.swift; sourceTree = ""; }; - 56CCA8582A00BBFBC2E9AFFC1C1D53A9 /* TCPTransport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TCPTransport.swift; path = Sources/Transport/TCPTransport.swift; sourceTree = ""; }; - 5831A57C2E79638C447411ED69EB6C42 /* FoundationSecurity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FoundationSecurity.swift; path = Sources/Security/FoundationSecurity.swift; sourceTree = ""; }; + 504ACC262BF6F68600741EC7 /* StompRequestFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompRequestFrame.swift; sourceTree = ""; }; + 504ACC292BF6F6A700741EC7 /* StompResponseFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompResponseFrame.swift; sourceTree = ""; }; + 504ACC2C2BF6F6C400741EC7 /* StompAckMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompAckMode.swift; sourceTree = ""; }; + 504ACC2F2BF6F6DC00741EC7 /* StompCommandHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompCommandHeader.swift; sourceTree = ""; }; + 504ACC322BF6F6F200741EC7 /* StompErrorType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompErrorType.swift; sourceTree = ""; }; + 504ACC352BF6F70100741EC7 /* StompDisconnectType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompDisconnectType.swift; sourceTree = ""; }; + 504ACC382BF6F71B00741EC7 /* StompConnectType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompConnectType.swift; sourceTree = ""; }; + 504ACC3B2BF6F73000741EC7 /* StompConnectionStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompConnectionStatus.swift; sourceTree = ""; }; + 504ACC3E2BF6F74B00741EC7 /* StompLogType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompLogType.swift; sourceTree = ""; }; + 504ACC412BF6F77C00741EC7 /* StompUpstreamMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompUpstreamMessage.swift; sourceTree = ""; }; + 504ACC452BF6F94300741EC7 /* StompFrame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompFrame.swift; sourceTree = ""; }; + 504ACC482BF6F99F00741EC7 /* StompHeaderBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompHeaderBuilder.swift; sourceTree = ""; }; + 504ACC4B2BF6FC6500741EC7 /* StompUpstreamEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompUpstreamEvent.swift; sourceTree = ""; }; + 504ACC4F2BF6FE8A00741EC7 /* InvalidStompCommandError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvalidStompCommandError.swift; sourceTree = ""; }; + 504ACC522BF6FFA200741EC7 /* StompError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StompError.swift; sourceTree = ""; }; + 5196BB866D3583072230D50FF4092BD5 /* ReachabilitySwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ReachabilitySwift.debug.xcconfig; sourceTree = ""; }; 597847BFD11F5460BDD68330284BE081 /* SwiftStomp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftStomp.release.xcconfig; sourceTree = ""; }; - 61ACB5D1CC7ECF4898480B7D5395032E /* Pods_SwiftStomp_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_SwiftStomp_Example.framework; path = "Pods-SwiftStomp_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 7175E21DED4337E7BBD3EF7424F315F6 /* Data+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Extensions.swift"; path = "Sources/DataBytes/Data+Extensions.swift"; sourceTree = ""; }; - 81F95157FC4CC8593A1B1E4607562122 /* FoundationHTTPServerHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FoundationHTTPServerHandler.swift; path = Sources/Framer/FoundationHTTPServerHandler.swift; sourceTree = ""; }; - 85C44A9AB6F12498BFC8233B9D599206 /* Starscream-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Starscream-Info.plist"; sourceTree = ""; }; - 891B2270823847ED23F2ECFC28F935EC /* Starscream.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Starscream.framework; path = Starscream.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8ED9AF7BDFE0F03CE129D72D85FCA460 /* WSEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WSEngine.swift; path = Sources/Engine/WSEngine.swift; sourceTree = ""; }; - 9357D61506695B4EDB5014C06BE56A43 /* Starscream.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Starscream.modulemap; sourceTree = ""; }; - 9A9A62AC78413874A96BF2D27595D67D /* SwiftStomp.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = SwiftStomp.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9B33CA201A48848C93CA662AD188CF64 /* SwiftStomp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SwiftStomp.framework; path = SwiftStomp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - A2EAFCD04DEECC2AC6B8727048A80617 /* Compression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Compression.swift; path = Sources/Compression/Compression.swift; sourceTree = ""; }; + 61ACB5D1CC7ECF4898480B7D5395032E /* Pods_SwiftStomp_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SwiftStomp_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7FF778BEFC7721E16D5F02EF17376689 /* ReachabilitySwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ReachabilitySwift-umbrella.h"; sourceTree = ""; }; + 857AEC11CD839A3399E3B28FCF726DED /* ReachabilitySwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ReachabilitySwift.modulemap; sourceTree = ""; }; + 8600D47A402BFF4D6115152C4674E704 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 8963E12987DC02B1646A6A9035AEDB68 /* ReachabilitySwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ReachabilitySwift-prefix.pch"; sourceTree = ""; }; + 9A9A62AC78413874A96BF2D27595D67D /* SwiftStomp.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = SwiftStomp.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9B33CA201A48848C93CA662AD188CF64 /* SwiftStomp.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftStomp.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; A3CDBF507E43B4A7EA07C8493D5427CE /* Pods-SwiftStomp_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SwiftStomp_Example-acknowledgements.plist"; sourceTree = ""; }; - A62AC07A9271D8996F97CC35856BA647 /* WebSocketServer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WebSocketServer.swift; path = Sources/Server/WebSocketServer.swift; sourceTree = ""; }; B4BB7C6AB39595DE12D39DB0719D4F52 /* SwiftStomp-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftStomp-umbrella.h"; sourceTree = ""; }; - C9C8BC22AA74FEDA9CF44852D28F68A4 /* Transport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Transport.swift; path = Sources/Transport/Transport.swift; sourceTree = ""; }; + D1118FC4BF2349E61D5A97571B401A8C /* Reachability.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reachability.swift; path = Sources/Reachability.swift; sourceTree = ""; }; D2DE393B19A086D57AD5C5A7D386FA12 /* Pods-SwiftStomp_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-SwiftStomp_Example.modulemap"; sourceTree = ""; }; - D41EAA3CC94B927CC458D83F4C356A8F /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; - DBB895F616DD1C4C7C1587261E4EBE5D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - DFD212064ED1CC47B2560F6E20526B3B /* Server.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Server.swift; path = Sources/Server/Server.swift; sourceTree = ""; }; + D41EAA3CC94B927CC458D83F4C356A8F /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; E36F12BCA92DED2F6444AA228F2D4144 /* Pods-SwiftStomp_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-SwiftStomp_Example-frameworks.sh"; sourceTree = ""; }; - E6B8353DB672E6C84ABAF6B044BC47F3 /* Starscream.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Starscream.release.xcconfig; sourceTree = ""; }; E6E917679AC8BD2EBEC67768E0CB1EFD /* Pods-SwiftStomp_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-SwiftStomp_Example.release.xcconfig"; sourceTree = ""; }; E810690EF161B9899D46C991A931FB5A /* SwiftStomp-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SwiftStomp-prefix.pch"; sourceTree = ""; }; E941765AAC7615BF6663FE8F1899242D /* Pods-SwiftStomp_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-SwiftStomp_Example-Info.plist"; sourceTree = ""; }; - ECFB158E08A6502A38761C96CB68975B /* Starscream-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Starscream-umbrella.h"; sourceTree = ""; }; + EE2B117F7A3CB312FF54BFF9D46B0180 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + EF58B756C1B6F83080EB05354E04317B /* ReachabilitySwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ReachabilitySwift-dummy.m"; sourceTree = ""; }; F6AB6E19A0AA7517AF36CAA95C38AF3F /* Pods-SwiftStomp_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-SwiftStomp_Example-umbrella.h"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 3E78A23A66B4A9649E69E8BD23B9A88A /* Frameworks */ = { + 028E996745F8AB32E62F30DD4D6479FB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 34A9F9CF9691CA19B5FCFE9E17AE9E00 /* Foundation.framework in Frameworks */, - FEF28BDE727621F9E227C026677AC1C2 /* Starscream.framework in Frameworks */, + 899ECE89E905625730B7070CC0941F84 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4CCC188EBE5C479D0F07E724B622C03A /* Frameworks */ = { + 1C23E2775A268AF03AB4FB35BFC953FA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1572414BB57E1CAEB0839E30A33979C0 /* Foundation.framework in Frameworks */, + 5433D9B1A7004CEBF4CA2F1FEEBCAB38 /* CoreTelephony.framework in Frameworks */, + 210DD290122BB0C7A0E83DC5148D724E /* Foundation.framework in Frameworks */, + 93DE5DC6D98B5DD09860532E35AE7C90 /* SystemConfiguration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9A626974A4026D3EAD688135DFD3DAE5 /* Frameworks */ = { + 70C174AA2A4F0055C54D9420796F2098 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D90A02DDFD123C1F4007095464FDFAFD /* Foundation.framework in Frameworks */, + 4C6A10FA290E63347D1B47A4AE7F526A /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 00B2FEDCAC8A8BACE0F9A4E951E14F8C /* Pods */ = { + 03C5C200A0787E300053CFA8F53CA094 /* Frameworks */ = { isa = PBXGroup; children = ( - 7629874EBAAE6E64DF87ACB68FB5A08E /* Starscream */, + 25F621761C10451F73C1586FED94CCAC /* iOS */, ); - name = Pods; + name = Frameworks; sourceTree = ""; }; 06CA939E3973953123C8EF44A4AD459A /* Support Files */ = { @@ -172,6 +167,63 @@ path = "Example/Pods/Target Support Files/SwiftStomp"; sourceTree = ""; }; + 25F621761C10451F73C1586FED94CCAC /* iOS */ = { + isa = PBXGroup; + children = ( + 2544C3A1631BACBD2FC964E079CB6787 /* CoreTelephony.framework */, + EE2B117F7A3CB312FF54BFF9D46B0180 /* Foundation.framework */, + 8600D47A402BFF4D6115152C4674E704 /* SystemConfiguration.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 504ACC252BF6F64B00741EC7 /* Enumurations */ = { + isa = PBXGroup; + children = ( + 504ACC262BF6F68600741EC7 /* StompRequestFrame.swift */, + 504ACC292BF6F6A700741EC7 /* StompResponseFrame.swift */, + 504ACC2C2BF6F6C400741EC7 /* StompAckMode.swift */, + 504ACC2F2BF6F6DC00741EC7 /* StompCommandHeader.swift */, + 504ACC322BF6F6F200741EC7 /* StompErrorType.swift */, + 504ACC352BF6F70100741EC7 /* StompDisconnectType.swift */, + 504ACC382BF6F71B00741EC7 /* StompConnectType.swift */, + 504ACC3B2BF6F73000741EC7 /* StompConnectionStatus.swift */, + 504ACC3E2BF6F74B00741EC7 /* StompLogType.swift */, + 504ACC412BF6F77C00741EC7 /* StompUpstreamMessage.swift */, + 504ACC4B2BF6FC6500741EC7 /* StompUpstreamEvent.swift */, + ); + name = Enumurations; + path = SwiftStomp/Classes/Enumurations; + sourceTree = ""; + }; + 504ACC442BF6F91F00741EC7 /* FrameHelpers */ = { + isa = PBXGroup; + children = ( + 504ACC452BF6F94300741EC7 /* StompFrame.swift */, + 504ACC482BF6F99F00741EC7 /* StompHeaderBuilder.swift */, + ); + name = FrameHelpers; + path = SwiftStomp/Classes/FrameHelpers; + sourceTree = ""; + }; + 504ACC4E2BF6FE7000741EC7 /* Errors */ = { + isa = PBXGroup; + children = ( + 504ACC4F2BF6FE8A00741EC7 /* InvalidStompCommandError.swift */, + 504ACC522BF6FFA200741EC7 /* StompError.swift */, + ); + name = Errors; + path = SwiftStomp/Classes/Errors; + sourceTree = ""; + }; + 5D0AA215FB49F5F6E11902E9E88FDB66 /* Pods */ = { + isa = PBXGroup; + children = ( + E6A028CF5F5E4DA047C6F7FCE7A7C354 /* ReachabilitySwift */, + ); + name = Pods; + sourceTree = ""; + }; 750AAB482164C09FA7737C19DB33744D /* Development Pods */ = { isa = PBXGroup; children = ( @@ -180,33 +232,19 @@ name = "Development Pods"; sourceTree = ""; }; - 7629874EBAAE6E64DF87ACB68FB5A08E /* Starscream */ = { + 7EA2352CB1A6DF17A65530B0C31D1B95 /* Support Files */ = { isa = PBXGroup; children = ( - A2EAFCD04DEECC2AC6B8727048A80617 /* Compression.swift */, - 7175E21DED4337E7BBD3EF7424F315F6 /* Data+Extensions.swift */, - 4A0925310BE76B051E1B51E7FBB37F35 /* Engine.swift */, - 3AF39A541BA78B8472A0F9D4E3504B90 /* FoundationHTTPHandler.swift */, - 81F95157FC4CC8593A1B1E4607562122 /* FoundationHTTPServerHandler.swift */, - 5831A57C2E79638C447411ED69EB6C42 /* FoundationSecurity.swift */, - 3D7E34251E9353A38AC748BB94EDC575 /* FoundationTransport.swift */, - 37C291A02C054326B5C6022EACD814E4 /* FrameCollector.swift */, - 1454E39E11FD28A611495E03B2015FD4 /* Framer.swift */, - 35ED0E33A6DD024AC0E71FEF3EA74D7C /* HTTPHandler.swift */, - 56ADCC3B462E7AE2D80872C7A66CA4A7 /* NativeEngine.swift */, - 4FC292255BA6A323D7D1C01215CC6591 /* Security.swift */, - DFD212064ED1CC47B2560F6E20526B3B /* Server.swift */, - 16D70531198624C7D8B14FF91C62FF6B /* StringHTTPHandler.swift */, - 56CCA8582A00BBFBC2E9AFFC1C1D53A9 /* TCPTransport.swift */, - C9C8BC22AA74FEDA9CF44852D28F68A4 /* Transport.swift */, - 4D2727BA14E02E7210DD6B547EA7D394 /* WebSocket.swift */, - A62AC07A9271D8996F97CC35856BA647 /* WebSocketServer.swift */, - 1918C09D193EF7F62A7C2611F12AC44B /* WSCompression.swift */, - 8ED9AF7BDFE0F03CE129D72D85FCA460 /* WSEngine.swift */, - C34F19E6E210C87A192216575C48E771 /* Support Files */, - ); - name = Starscream; - path = Starscream; + 857AEC11CD839A3399E3B28FCF726DED /* ReachabilitySwift.modulemap */, + EF58B756C1B6F83080EB05354E04317B /* ReachabilitySwift-dummy.m */, + 069AA35E898B4C00466D4271509A6343 /* ReachabilitySwift-Info.plist */, + 8963E12987DC02B1646A6A9035AEDB68 /* ReachabilitySwift-prefix.pch */, + 7FF778BEFC7721E16D5F02EF17376689 /* ReachabilitySwift-umbrella.h */, + 5196BB866D3583072230D50FF4092BD5 /* ReachabilitySwift.debug.xcconfig */, + 073ACA4DDA4280FAB4C52373FD97AFDF /* ReachabilitySwift.release.xcconfig */, + ); + name = "Support Files"; + path = "../Target Support Files/ReachabilitySwift"; sourceTree = ""; }; 9693C11D16F17BB37D9F4D9F538820DD /* Targets Support Files */ = { @@ -217,9 +255,22 @@ name = "Targets Support Files"; sourceTree = ""; }; + 9C76B03688C1402213D681772BB3EE3A /* Products */ = { + isa = PBXGroup; + children = ( + 61ACB5D1CC7ECF4898480B7D5395032E /* Pods_SwiftStomp_Example.framework */, + 21B03CA622E690725A6626C088E1D09F /* Reachability.framework */, + 9B33CA201A48848C93CA662AD188CF64 /* SwiftStomp.framework */, + ); + name = Products; + sourceTree = ""; + }; 9E9C985FB12EF434AE8448AC044F7061 /* SwiftStomp */ = { isa = PBXGroup; children = ( + 504ACC4E2BF6FE7000741EC7 /* Errors */, + 504ACC442BF6F91F00741EC7 /* FrameHelpers */, + 504ACC252BF6F64B00741EC7 /* Enumurations */, 0DC6F79753DB862A510CD313F5218D59 /* SwiftStomp.swift */, D34FD6021701BEA9D63045DD0E42B02D /* Pod */, 06CA939E3973953123C8EF44A4AD459A /* Support Files */, @@ -245,38 +296,14 @@ path = "Target Support Files/Pods-SwiftStomp_Example"; sourceTree = ""; }; - C34F19E6E210C87A192216575C48E771 /* Support Files */ = { - isa = PBXGroup; - children = ( - 9357D61506695B4EDB5014C06BE56A43 /* Starscream.modulemap */, - 21B65F09370A4D9877255EC1C47060A2 /* Starscream-dummy.m */, - 85C44A9AB6F12498BFC8233B9D599206 /* Starscream-Info.plist */, - 010F5C43A348BC3C417C21FA354444E2 /* Starscream-prefix.pch */, - ECFB158E08A6502A38761C96CB68975B /* Starscream-umbrella.h */, - 2C1CF04602B9D61F89BCC51DEA7939B0 /* Starscream.debug.xcconfig */, - E6B8353DB672E6C84ABAF6B044BC47F3 /* Starscream.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/Starscream"; - sourceTree = ""; - }; - CD272A03C5BA2A49B245F2735E358B7D /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3319CBE6BF16B5B2366BDE834B663B5E /* Starscream.framework */, - DB2C61061EC170240411C29EF6DD7C9D /* iOS */, - ); - name = Frameworks; - sourceTree = ""; - }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 750AAB482164C09FA7737C19DB33744D /* Development Pods */, - CD272A03C5BA2A49B245F2735E358B7D /* Frameworks */, - 00B2FEDCAC8A8BACE0F9A4E951E14F8C /* Pods */, - F2FB6FAECB5FF832EA9A1979D0C8D1DD /* Products */, + 03C5C200A0787E300053CFA8F53CA094 /* Frameworks */, + 5D0AA215FB49F5F6E11902E9E88FDB66 /* Pods */, + 9C76B03688C1402213D681772BB3EE3A /* Products */, 9693C11D16F17BB37D9F4D9F538820DD /* Targets Support Files */, ); sourceTree = ""; @@ -291,48 +318,39 @@ name = Pod; sourceTree = ""; }; - DB2C61061EC170240411C29EF6DD7C9D /* iOS */ = { + E6A028CF5F5E4DA047C6F7FCE7A7C354 /* ReachabilitySwift */ = { isa = PBXGroup; children = ( - DBB895F616DD1C4C7C1587261E4EBE5D /* Foundation.framework */, + D1118FC4BF2349E61D5A97571B401A8C /* Reachability.swift */, + 7EA2352CB1A6DF17A65530B0C31D1B95 /* Support Files */, ); - name = iOS; - sourceTree = ""; - }; - F2FB6FAECB5FF832EA9A1979D0C8D1DD /* Products */ = { - isa = PBXGroup; - children = ( - 61ACB5D1CC7ECF4898480B7D5395032E /* Pods_SwiftStomp_Example.framework */, - 891B2270823847ED23F2ECFC28F935EC /* Starscream.framework */, - 9B33CA201A48848C93CA662AD188CF64 /* SwiftStomp.framework */, - ); - name = Products; + path = ReachabilitySwift; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 2CC4F945D8649E9D2A0EB1F9461F3D3D /* Headers */ = { + 0603278B4A33D9B81CCDF4BFE94BB306 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - F65503DD8313D90E1A5A5C694B387D8D /* SwiftStomp-umbrella.h in Headers */, + CCDAA267D476D90993BE641791423BCD /* SwiftStomp-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 6391C37A4F84C57BFE51164A5896A78B /* Headers */ = { + 720ACACFF5D75F3D9D4213C5F83E1265 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - D59F959163A35397E8B3A32CEB6BE2B0 /* Pods-SwiftStomp_Example-umbrella.h in Headers */, + D417586D6A6F2DCC2B9E14C8020012C2 /* Pods-SwiftStomp_Example-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8FBCA80FAEACC5AC57CFF6DC4ED4EB1C /* Headers */ = { + A07235E1E88D103EFDEB6510A0BCE7A8 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 99CC2D5DC15DBA9F5A494E76FF940B62 /* Starscream-umbrella.h in Headers */, + 17DE87344CAD319DE6AA0F7BE1BA10C7 /* ReachabilitySwift-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -341,59 +359,59 @@ /* Begin PBXNativeTarget section */ 04CF9B8BDE92EA9A7EAF573E5DB3CC35 /* Pods-SwiftStomp_Example */ = { isa = PBXNativeTarget; - buildConfigurationList = 874A6F2FD79F3A8CF67056F4E3154444 /* Build configuration list for PBXNativeTarget "Pods-SwiftStomp_Example" */; + buildConfigurationList = BD9200DF34BE0CA5849C823108F12F90 /* Build configuration list for PBXNativeTarget "Pods-SwiftStomp_Example" */; buildPhases = ( - 6391C37A4F84C57BFE51164A5896A78B /* Headers */, - 973637B8431A1E5C7A5CE57C9B8438CD /* Sources */, - 9A626974A4026D3EAD688135DFD3DAE5 /* Frameworks */, - 9916D6176A513919E567FD25802F4C5B /* Resources */, + 720ACACFF5D75F3D9D4213C5F83E1265 /* Headers */, + 924BB02F9F558B96527CEB29E95F28F3 /* Sources */, + 028E996745F8AB32E62F30DD4D6479FB /* Frameworks */, + 143488D11D92E499308312A456BFBF42 /* Resources */, ); buildRules = ( ); dependencies = ( - 1F565FF4C0615551B91CAFE8028A344B /* PBXTargetDependency */, - D5A47E0157254A3C143C524100016EE9 /* PBXTargetDependency */, + 4C1BFED7AD7F852BE23C1A01A12335AB /* PBXTargetDependency */, + A24F7C42D0560F6EB7CA338F738E1CD0 /* PBXTargetDependency */, ); name = "Pods-SwiftStomp_Example"; - productName = "Pods-SwiftStomp_Example"; + productName = Pods_SwiftStomp_Example; productReference = 61ACB5D1CC7ECF4898480B7D5395032E /* Pods_SwiftStomp_Example.framework */; productType = "com.apple.product-type.framework"; }; - 4EF39EA0BF2F2ACCC6A5344BC36BFFA6 /* SwiftStomp */ = { + 0B00B2C167CD783351BD1D00BD5AD1F8 /* ReachabilitySwift */ = { isa = PBXNativeTarget; - buildConfigurationList = E952FBCDA9108F78DA14DA344F710514 /* Build configuration list for PBXNativeTarget "SwiftStomp" */; + buildConfigurationList = 14DE1166A8B9C02D036523FB495E1984 /* Build configuration list for PBXNativeTarget "ReachabilitySwift" */; buildPhases = ( - 2CC4F945D8649E9D2A0EB1F9461F3D3D /* Headers */, - 6D87D609C56DB01B9D8906264BF1D6BE /* Sources */, - 3E78A23A66B4A9649E69E8BD23B9A88A /* Frameworks */, - 74DF1AFD86C145FE02D33B36E10175EC /* Resources */, + A07235E1E88D103EFDEB6510A0BCE7A8 /* Headers */, + 000885395D0D686A060DD76E35D874C2 /* Sources */, + 1C23E2775A268AF03AB4FB35BFC953FA /* Frameworks */, + 332B7A37F1A79B4B578E4145341A0E1C /* Resources */, ); buildRules = ( ); dependencies = ( - F11F703456B61CE3D17B1E803B278F2D /* PBXTargetDependency */, ); - name = SwiftStomp; - productName = SwiftStomp; - productReference = 9B33CA201A48848C93CA662AD188CF64 /* SwiftStomp.framework */; + name = ReachabilitySwift; + productName = Reachability; + productReference = 21B03CA622E690725A6626C088E1D09F /* Reachability.framework */; productType = "com.apple.product-type.framework"; }; - 9B78EE4AF6AE03E79D88886319853FF7 /* Starscream */ = { + 4EF39EA0BF2F2ACCC6A5344BC36BFFA6 /* SwiftStomp */ = { isa = PBXNativeTarget; - buildConfigurationList = 559ECA96064FF8D4E520C661A9B10569 /* Build configuration list for PBXNativeTarget "Starscream" */; + buildConfigurationList = 25234EFA8D45FB7C29BEE67C2534FB38 /* Build configuration list for PBXNativeTarget "SwiftStomp" */; buildPhases = ( - 8FBCA80FAEACC5AC57CFF6DC4ED4EB1C /* Headers */, - E7E251548CC3ABEE63D68F3918C56EC9 /* Sources */, - 4CCC188EBE5C479D0F07E724B622C03A /* Frameworks */, - 5724CA8FBD0D73F2A54ABBE5AA5241A2 /* Resources */, + 0603278B4A33D9B81CCDF4BFE94BB306 /* Headers */, + 5558FBA7095223167CB4F985CEE1931B /* Sources */, + 70C174AA2A4F0055C54D9420796F2098 /* Frameworks */, + 0AA939F52A01404E8C4C0821C1314E23 /* Resources */, ); buildRules = ( ); dependencies = ( + 230A11E6E31A61614DCBEEB78E2A9971 /* PBXTargetDependency */, ); - name = Starscream; - productName = Starscream; - productReference = 891B2270823847ED23F2ECFC28F935EC /* Starscream.framework */; + name = SwiftStomp; + productName = SwiftStomp; + productReference = 9B33CA201A48848C93CA662AD188CF64 /* SwiftStomp.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -402,45 +420,50 @@ BFDFE7DC352907FC980B868725387E98 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1100; - LastUpgradeCheck = 1100; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + TargetAttributes = { + 04CF9B8BDE92EA9A7EAF573E5DB3CC35 = { + LastSwiftMigration = 1540; + }; + }; }; buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - en, Base, + en, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = F2FB6FAECB5FF832EA9A1979D0C8D1DD /* Products */; + productRefGroup = 9C76B03688C1402213D681772BB3EE3A /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 04CF9B8BDE92EA9A7EAF573E5DB3CC35 /* Pods-SwiftStomp_Example */, - 9B78EE4AF6AE03E79D88886319853FF7 /* Starscream */, + 0B00B2C167CD783351BD1D00BD5AD1F8 /* ReachabilitySwift */, 4EF39EA0BF2F2ACCC6A5344BC36BFFA6 /* SwiftStomp */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 5724CA8FBD0D73F2A54ABBE5AA5241A2 /* Resources */ = { + 0AA939F52A01404E8C4C0821C1314E23 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 74DF1AFD86C145FE02D33B36E10175EC /* Resources */ = { + 143488D11D92E499308312A456BFBF42 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 9916D6176A513919E567FD25802F4C5B /* Resources */ = { + 332B7A37F1A79B4B578E4145341A0E1C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -450,209 +473,76 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 6D87D609C56DB01B9D8906264BF1D6BE /* Sources */ = { + 000885395D0D686A060DD76E35D874C2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 15A52A1F9EDD20585A5D89BEDACE6195 /* SwiftStomp-dummy.m in Sources */, - 5208660ADE378A7349BD70FDFD7E5A93 /* SwiftStomp.swift in Sources */, + AB43B618099D0E0BE5730DE4166CD403 /* Reachability.swift in Sources */, + 960DCEE9167C9C9E11FAA0EDAF872B2F /* ReachabilitySwift-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 973637B8431A1E5C7A5CE57C9B8438CD /* Sources */ = { + 5558FBA7095223167CB4F985CEE1931B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3CDC833CF0098C529369B093954AEB26 /* Pods-SwiftStomp_Example-dummy.m in Sources */, + 504ACC3A2BF6F71B00741EC7 /* StompConnectType.swift in Sources */, + 504ACC4D2BF6FC6500741EC7 /* StompUpstreamEvent.swift in Sources */, + 504ACC312BF6F6DC00741EC7 /* StompCommandHeader.swift in Sources */, + 504ACC2E2BF6F6C400741EC7 /* StompAckMode.swift in Sources */, + 504ACC402BF6F74B00741EC7 /* StompLogType.swift in Sources */, + 504ACC2B2BF6F6A700741EC7 /* StompResponseFrame.swift in Sources */, + 504ACC372BF6F70100741EC7 /* StompDisconnectType.swift in Sources */, + 504ACC432BF6F77C00741EC7 /* StompUpstreamMessage.swift in Sources */, + 504ACC3D2BF6F73000741EC7 /* StompConnectionStatus.swift in Sources */, + 504ACC4A2BF6F99F00741EC7 /* StompHeaderBuilder.swift in Sources */, + 504ACC542BF6FFA200741EC7 /* StompError.swift in Sources */, + 504ACC282BF6F68600741EC7 /* StompRequestFrame.swift in Sources */, + 5C29D180D52BC57EE1674EE7D29F5A81 /* SwiftStomp.swift in Sources */, + 504ACC512BF6FE8A00741EC7 /* InvalidStompCommandError.swift in Sources */, + E12150F171CDCBF069DC0470D092AE46 /* SwiftStomp-dummy.m in Sources */, + 504ACC472BF6F94300741EC7 /* StompFrame.swift in Sources */, + 504ACC342BF6F6F200741EC7 /* StompErrorType.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - E7E251548CC3ABEE63D68F3918C56EC9 /* Sources */ = { + 924BB02F9F558B96527CEB29E95F28F3 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C07413B05F2A3CD997EBCE9D8EE5FD08 /* Compression.swift in Sources */, - 37E36C07C168E5737FBA757736AB1263 /* Data+Extensions.swift in Sources */, - 0A0E8476402B53B091B91A7DE07E0008 /* Engine.swift in Sources */, - DA25193E27ABCAC731A9549A566C5FDB /* FoundationHTTPHandler.swift in Sources */, - 190BC16FCBB53F6C6F2C0618B6BE7DDA /* FoundationHTTPServerHandler.swift in Sources */, - 946911E4FFC48BF8F84D076D258A1322 /* FoundationSecurity.swift in Sources */, - 19E712862F3F845060EA7DADEAD9BC59 /* FoundationTransport.swift in Sources */, - 36D1530899987EF165D0AFC6D2B9EAF2 /* FrameCollector.swift in Sources */, - 4572F22239A84AC23B262764D429E2EB /* Framer.swift in Sources */, - 894E47358149672D5810C31E4B64AF0D /* HTTPHandler.swift in Sources */, - CCDFE079D2DA1E51162E69A3A28BF23F /* NativeEngine.swift in Sources */, - F4D86DAACC44D52F4580AD0721D10459 /* Security.swift in Sources */, - 195E17A825CB18759C7D6511DACCB3E9 /* Server.swift in Sources */, - 703C0586C478A922E21934D3B149A71E /* Starscream-dummy.m in Sources */, - 1BCEC1C72A76476B70CE4B032A9D9B32 /* StringHTTPHandler.swift in Sources */, - 359D3455A362843977E8E3076B7D8162 /* TCPTransport.swift in Sources */, - C2809B4763602D15A7384398343AE406 /* Transport.swift in Sources */, - 0CC54E4D0945262C1B835B699345B034 /* WebSocket.swift in Sources */, - C808D0298CC1CD6C13E283663535B259 /* WebSocketServer.swift in Sources */, - 793D18E42CC454D1C4225339797DB9EB /* WSCompression.swift in Sources */, - 4D322C7978617308B276D6F4902C2335 /* WSEngine.swift in Sources */, + F613E84A68B66A38B1707E1C89B0E112 /* Pods-SwiftStomp_Example-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 1F565FF4C0615551B91CAFE8028A344B /* PBXTargetDependency */ = { + 230A11E6E31A61614DCBEEB78E2A9971 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Starscream; - target = 9B78EE4AF6AE03E79D88886319853FF7 /* Starscream */; - targetProxy = DD8E5E55D2F8C9C3F5506BD6DB26033F /* PBXContainerItemProxy */; + name = ReachabilitySwift; + target = 0B00B2C167CD783351BD1D00BD5AD1F8 /* ReachabilitySwift */; + targetProxy = 51EE37134823D2FB5EC971A8AAC9CE5B /* PBXContainerItemProxy */; }; - D5A47E0157254A3C143C524100016EE9 /* PBXTargetDependency */ = { + 4C1BFED7AD7F852BE23C1A01A12335AB /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SwiftStomp; - target = 4EF39EA0BF2F2ACCC6A5344BC36BFFA6 /* SwiftStomp */; - targetProxy = 433122046658C52DF0CAF3328DE7BCEC /* PBXContainerItemProxy */; + name = ReachabilitySwift; + target = 0B00B2C167CD783351BD1D00BD5AD1F8 /* ReachabilitySwift */; + targetProxy = DD7386A1E463F7489503B3F7745A7E4E /* PBXContainerItemProxy */; }; - F11F703456B61CE3D17B1E803B278F2D /* PBXTargetDependency */ = { + A24F7C42D0560F6EB7CA338F738E1CD0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Starscream; - target = 9B78EE4AF6AE03E79D88886319853FF7 /* Starscream */; - targetProxy = 2F80DE4C858239512F4A086599EB7CCD /* PBXContainerItemProxy */; + name = SwiftStomp; + target = 4EF39EA0BF2F2ACCC6A5344BC36BFFA6 /* SwiftStomp */; + targetProxy = 891C5A5BE9BDC9DD9067DCB4C5BB1379 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 329603EBA6B92E26AD2678D489C21954 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E6E917679AC8BD2EBEC67768E0CB1EFD /* Pods-SwiftStomp_Example.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 39A3CADA6791DFC312C29FAC44E4A57B /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 597847BFD11F5460BDD68330284BE081 /* SwiftStomp.release.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/SwiftStomp/SwiftStomp-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/SwiftStomp/SwiftStomp-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/SwiftStomp/SwiftStomp.modulemap"; - PRODUCT_MODULE_NAME = SwiftStomp; - PRODUCT_NAME = SwiftStomp; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 543E5B7484D28D953F4A4E193786CC61 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2C1CF04602B9D61F89BCC51DEA7939B0 /* Starscream.debug.xcconfig */; - buildSettings = { - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Starscream/Starscream-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Starscream/Starscream-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Starscream/Starscream.modulemap"; - PRODUCT_MODULE_NAME = Starscream; - PRODUCT_NAME = Starscream; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - A23AEC41602C23317C8D4A720DAB6B3A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 25EB98BC21B744B34F59F9EFE0BF0468 /* Pods-SwiftStomp_Example.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - B0087CB4594321EF41619F3181FE120E /* Release */ = { + 119D25BC8590F02A997CE3B28DA2EFA5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -675,6 +565,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -682,13 +573,16 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -697,23 +591,24 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - MTL_ENABLE_DEBUG_INFO = NO; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; - name = Release; + name = Debug; }; - B6AE2643621E9E8617A009966908510E /* Release */ = { + 594DAF4AD219C4368A9896A31B87F629 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E6B8353DB672E6C84ABAF6B044BC47F3 /* Starscream.release.xcconfig */; + baseConfigurationReference = 073ACA4DDA4280FAB4C52373FD97AFDF /* ReachabilitySwift.release.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = ""; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -722,14 +617,14 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Starscream/Starscream-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Starscream/Starscream-Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/ReachabilitySwift/ReachabilitySwift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ReachabilitySwift/ReachabilitySwift-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Starscream/Starscream.modulemap"; - PRODUCT_MODULE_NAME = Starscream; - PRODUCT_NAME = Starscream; + MODULEMAP_FILE = "Target Support Files/ReachabilitySwift/ReachabilitySwift.modulemap"; + PRODUCT_MODULE_NAME = Reachability; + PRODUCT_NAME = Reachability; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -741,10 +636,11 @@ }; name = Release; }; - B8BCBD0110C2658BB5DAADB9B7D97B92 /* Debug */ = { + 6F4225877C794ABEB78776F47754104E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -767,6 +663,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -774,16 +671,13 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", + "POD_CONFIGURATION_RELEASE=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -792,24 +686,54 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; + MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; + name = Release; + }; + 7284954E8C29A79EEB9BBBE76977A1BB /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 5196BB866D3583072230D50FF4092BD5 /* ReachabilitySwift.debug.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/ReachabilitySwift/ReachabilitySwift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ReachabilitySwift/ReachabilitySwift-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/ReachabilitySwift/ReachabilitySwift.modulemap"; + PRODUCT_MODULE_NAME = Reachability; + PRODUCT_NAME = Reachability; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; name = Debug; }; - F64E95E46D4B541D4A53ADB7570D850D /* Debug */ = { + 96E474B72483C05776FEB1FCB197FA7E /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 089B325A2928099B2F83D9C7F725EF52 /* SwiftStomp.debug.xcconfig */; buildSettings = { - CODE_SIGN_IDENTITY = ""; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; @@ -821,7 +745,7 @@ GCC_PREFIX_HEADER = "Target Support Files/SwiftStomp/SwiftStomp-prefix.pch"; INFOPLIST_FILE = "Target Support Files/SwiftStomp/SwiftStomp-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/SwiftStomp/SwiftStomp.modulemap"; PRODUCT_MODULE_NAME = SwiftStomp; @@ -836,41 +760,148 @@ }; name = Debug; }; + BB1FDF914C5856F55DF876051CDFA2D4 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 25EB98BC21B744B34F59F9EFE0BF0468 /* Pods-SwiftStomp_Example.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + E4EFBE918932B845A39DCB7E8F78CC8E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E6E917679AC8BD2EBEC67768E0CB1EFD /* Pods-SwiftStomp_Example.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + EFA2234B0368EC4337A504A46EC220A8 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 597847BFD11F5460BDD68330284BE081 /* SwiftStomp.release.xcconfig */; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/SwiftStomp/SwiftStomp-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SwiftStomp/SwiftStomp-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SwiftStomp/SwiftStomp.modulemap"; + PRODUCT_MODULE_NAME = SwiftStomp; + PRODUCT_NAME = SwiftStomp; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + 14DE1166A8B9C02D036523FB495E1984 /* Build configuration list for PBXNativeTarget "ReachabilitySwift" */ = { isa = XCConfigurationList; buildConfigurations = ( - B8BCBD0110C2658BB5DAADB9B7D97B92 /* Debug */, - B0087CB4594321EF41619F3181FE120E /* Release */, + 7284954E8C29A79EEB9BBBE76977A1BB /* Debug */, + 594DAF4AD219C4368A9896A31B87F629 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 559ECA96064FF8D4E520C661A9B10569 /* Build configuration list for PBXNativeTarget "Starscream" */ = { + 25234EFA8D45FB7C29BEE67C2534FB38 /* Build configuration list for PBXNativeTarget "SwiftStomp" */ = { isa = XCConfigurationList; buildConfigurations = ( - 543E5B7484D28D953F4A4E193786CC61 /* Debug */, - B6AE2643621E9E8617A009966908510E /* Release */, + 96E474B72483C05776FEB1FCB197FA7E /* Debug */, + EFA2234B0368EC4337A504A46EC220A8 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 874A6F2FD79F3A8CF67056F4E3154444 /* Build configuration list for PBXNativeTarget "Pods-SwiftStomp_Example" */ = { + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - A23AEC41602C23317C8D4A720DAB6B3A /* Debug */, - 329603EBA6B92E26AD2678D489C21954 /* Release */, + 119D25BC8590F02A997CE3B28DA2EFA5 /* Debug */, + 6F4225877C794ABEB78776F47754104E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E952FBCDA9108F78DA14DA344F710514 /* Build configuration list for PBXNativeTarget "SwiftStomp" */ = { + BD9200DF34BE0CA5849C823108F12F90 /* Build configuration list for PBXNativeTarget "Pods-SwiftStomp_Example" */ = { isa = XCConfigurationList; buildConfigurations = ( - F64E95E46D4B541D4A53ADB7570D850D /* Debug */, - 39A3CADA6791DFC312C29FAC44E4A57B /* Release */, + BB1FDF914C5856F55DF876051CDFA2D4 /* Debug */, + E4EFBE918932B845A39DCB7E8F78CC8E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-Info.plist b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-Info.plist index 2243fe6..19cf209 100644 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-Info.plist +++ b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-Info.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - en + ${PODS_DEVELOPMENT_LANGUAGE} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-acknowledgements.markdown index df565c0..29cc149 100644 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-acknowledgements.markdown +++ b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-acknowledgements.markdown @@ -1,184 +1,28 @@ # Acknowledgements This application makes use of the following third party libraries: -## Starscream +## ReachabilitySwift - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Copyright (c) 2016 Ashley Mills - Copyright (c) 2014-2016 Dalton Cherry. - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. ## SwiftStomp diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-acknowledgements.plist index a58d188..48f9134 100644 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-acknowledgements.plist +++ b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-acknowledgements.plist @@ -14,186 +14,30 @@ FooterText - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ + Copyright (c) 2016 Ashley Mills - Copyright (c) 2014-2016 Dalton Cherry. - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + License - Apache License, Version 2.0 + MIT Title - Starscream + ReachabilitySwift Type PSGroupSpecifier @@ -220,7 +64,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. License - MIT License + MIT Title SwiftStomp Type diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-frameworks.sh b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-frameworks.sh index 612573d..32b2926 100755 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-frameworks.sh +++ b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-frameworks.sh @@ -18,10 +18,9 @@ echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +SWIFT_STDLIB_PATH="${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" +BCSYMBOLMAP_DIR="BCSymbolMaps" -# Used as a return value for each invocation of `strip_invalid_archs` function. -STRIP_BINARY_RETVAL=0 # This protects against multiple targets copying the same framework dependency at the same time. The solution # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html @@ -42,7 +41,17 @@ install_framework() if [ -L "${source}" ]; then echo "Symlinked..." - source="$(readlink "${source}")" + source="$(readlink -f "${source}")" + fi + + if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then + # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied + find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do + echo "Installing $f" + install_bcsymbolmap "$f" "$destination" + rm "$f" + done + rmdir "${source}/${BCSYMBOLMAP_DIR}" fi # Use filter instead of exclude so missing patterns don't throw errors. @@ -80,7 +89,6 @@ install_framework() done fi } - # Copies and strips a vendored dSYM install_dsym() { local source="$1" @@ -95,44 +103,24 @@ install_dsym() { binary_name="$(ls "$source/Contents/Resources/DWARF")" binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" - # Strip invalid architectures so "fat" simulator / device frameworks work on device + # Strip invalid architectures from the dSYM. if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then strip_invalid_archs "$binary" "$warn_missing_arch" fi - - if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + if [[ $STRIP_BINARY_RETVAL == 0 ]]; then # Move the stripped file into its final destination. echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" else # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + mkdir -p "${DWARF_DSYM_FOLDER_PATH}" touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" fi fi } -# Copies the bcsymbolmap files of a vendored framework -install_bcsymbolmap() { - local bcsymbolmap_path="$1" - local destination="${BUILT_PRODUCTS_DIR}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identity - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" - - if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - code_sign_cmd="$code_sign_cmd &" - fi - echo "$code_sign_cmd" - eval "$code_sign_cmd" - fi -} +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 # Strip invalid architectures strip_invalid_archs() { @@ -147,7 +135,7 @@ strip_invalid_archs() { if [[ "$warn_missing_arch" == "true" ]]; then echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." fi - STRIP_BINARY_RETVAL=0 + STRIP_BINARY_RETVAL=1 return fi stripped="" @@ -161,47 +149,38 @@ strip_invalid_archs() { if [[ "$stripped" ]]; then echo "Stripped $binary of architectures:$stripped" fi - STRIP_BINARY_RETVAL=1 + STRIP_BINARY_RETVAL=0 } -install_artifact() { - artifact="$1" - base="$(basename "$artifact")" - case $base in - *.framework) - install_framework "$artifact" - ;; - *.dSYM) - # Suppress arch warnings since XCFrameworks will include many dSYM files - install_dsym "$artifact" "false" - ;; - *.bcsymbolmap) - install_bcsymbolmap "$artifact" - ;; - *) - echo "error: Unrecognized artifact "$artifact"" - ;; - esac +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" } -copy_artifacts() { - file_list="$1" - while read artifact; do - install_artifact "$artifact" - done <$file_list -} +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" -ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt" -if [ -r "${ARTIFACT_LIST_FILE}" ]; then - copy_artifacts "${ARTIFACT_LIST_FILE}" -fi + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} if [[ "$CONFIGURATION" == "Debug" ]]; then - install_framework "${BUILT_PRODUCTS_DIR}/Starscream/Starscream.framework" + install_framework "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework" install_framework "${BUILT_PRODUCTS_DIR}/SwiftStomp/SwiftStomp.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "${BUILT_PRODUCTS_DIR}/Starscream/Starscream.framework" + install_framework "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework" install_framework "${BUILT_PRODUCTS_DIR}/SwiftStomp/SwiftStomp.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.debug.xcconfig index 93dba4e..0fa9d3a 100644 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.debug.xcconfig +++ b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.debug.xcconfig @@ -1,12 +1,15 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Starscream" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp" +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Starscream/Starscream.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp/SwiftStomp.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "Starscream" -framework "SwiftStomp" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp/SwiftStomp.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "CoreTelephony" -framework "Reachability" -framework "SwiftStomp" -framework "SystemConfiguration" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.release.xcconfig index 93dba4e..0fa9d3a 100644 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.release.xcconfig +++ b/Example/Pods/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example.release.xcconfig @@ -1,12 +1,15 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Starscream" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp" +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Starscream/Starscream.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp/SwiftStomp.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "Starscream" -framework "SwiftStomp" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift/Reachability.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp/SwiftStomp.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "CoreTelephony" -framework "Reachability" -framework "SwiftStomp" -framework "SystemConfiguration" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. PODS_ROOT = ${SRCROOT}/Pods +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-Info.plist b/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-Info.plist deleted file mode 100644 index 2243fe6..0000000 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-acknowledgements.markdown deleted file mode 100644 index 102af75..0000000 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-acknowledgements.markdown +++ /dev/null @@ -1,3 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: -Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-acknowledgements.plist deleted file mode 100644 index 7acbad1..0000000 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-acknowledgements.plist +++ /dev/null @@ -1,29 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - https://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-dummy.m b/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-dummy.m deleted file mode 100644 index 28eb877..0000000 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_SwiftStomp_Tests : NSObject -@end -@implementation PodsDummy_Pods_SwiftStomp_Tests -@end diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-umbrella.h b/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-umbrella.h deleted file mode 100644 index 001fad6..0000000 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double Pods_SwiftStomp_TestsVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_SwiftStomp_TestsVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests.debug.xcconfig deleted file mode 100644 index 97cc06c..0000000 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests.debug.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp/SwiftStomp.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "SwiftStomp" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests.modulemap b/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests.modulemap deleted file mode 100644 index 2c21792..0000000 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_SwiftStomp_Tests { - umbrella header "Pods-SwiftStomp_Tests-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests.release.xcconfig deleted file mode 100644 index 97cc06c..0000000 --- a/Example/Pods/Target Support Files/Pods-SwiftStomp_Tests/Pods-SwiftStomp_Tests.release.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp/SwiftStomp.framework/Headers" -OTHER_LDFLAGS = $(inherited) -framework "SwiftStomp" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp-Info.plist b/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp-Info.plist index 161a9d3..de6ebe8 100644 --- a/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp-Info.plist +++ b/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp-Info.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - en + ${PODS_DEVELOPMENT_LANGUAGE} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.1.0 + 1.1.1 CFBundleSignature ???? CFBundleVersion diff --git a/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp.debug.xcconfig b/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp.debug.xcconfig index f4876db..3a4e11e 100644 --- a/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp.debug.xcconfig +++ b/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp.debug.xcconfig @@ -1,11 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Starscream" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "CoreTelephony" -framework "Reachability" -framework "SystemConfiguration" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp.release.xcconfig b/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp.release.xcconfig index f4876db..3a4e11e 100644 --- a/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp.release.xcconfig +++ b/Example/Pods/Target Support Files/SwiftStomp/SwiftStomp.release.xcconfig @@ -1,11 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftStomp -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Starscream" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "CoreTelephony" -framework "Reachability" -framework "SystemConfiguration" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} PODS_ROOT = ${SRCROOT} PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/SwiftStomp.xcodeproj/project.pbxproj b/Example/SwiftStomp.xcodeproj/project.pbxproj index 81c0d4e..0dd2c40 100644 --- a/Example/SwiftStomp.xcodeproj/project.pbxproj +++ b/Example/SwiftStomp.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 3CA70AC419EBA31BEABD1566 /* Pods_SwiftStomp_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDEC8093327282DE87539508 /* Pods_SwiftStomp_Example.framework */; }; + 504ACC572BF70E4300741EC7 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC562BF70E4300741EC7 /* ContentView.swift */; }; + 504ACC592BF7922200741EC7 /* ContentViewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504ACC582BF7922200741EC7 /* ContentViewViewModel.swift */; }; 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; @@ -28,6 +30,8 @@ /* Begin PBXFileReference section */ 1AACAE8D55EAD993BDAB0EB4 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; + 504ACC562BF70E4300741EC7 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 504ACC582BF7922200741EC7 /* ContentViewViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentViewViewModel.swift; sourceTree = ""; }; 607FACD01AFB9204008FA782 /* SwiftStomp_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftStomp_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -64,6 +68,15 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 504ACC552BF70E3200741EC7 /* SwiftUI */ = { + isa = PBXGroup; + children = ( + 504ACC562BF70E4300741EC7 /* ContentView.swift */, + 504ACC582BF7922200741EC7 /* ContentViewViewModel.swift */, + ); + name = SwiftUI; + sourceTree = ""; + }; 607FACC71AFB9204008FA782 = { isa = PBXGroup; children = ( @@ -88,6 +101,7 @@ 607FACD21AFB9204008FA782 /* Example for SwiftStomp */ = { isa = PBXGroup; children = ( + 504ACC552BF70E3200741EC7 /* SwiftUI */, 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 607FACD71AFB9204008FA782 /* ViewController.swift */, 607FACD91AFB9204008FA782 /* Main.storyboard */, @@ -284,13 +298,11 @@ inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-SwiftStomp_Example/Pods-SwiftStomp_Example-frameworks.sh", "${BUILT_PRODUCTS_DIR}/ReachabilitySwift/Reachability.framework", - "${BUILT_PRODUCTS_DIR}/Starscream/Starscream.framework", "${BUILT_PRODUCTS_DIR}/SwiftStomp/SwiftStomp.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Starscream.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftStomp.framework", ); runOnlyForDeploymentPostprocessing = 0; @@ -307,6 +319,8 @@ files = ( 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, + 504ACC572BF70E4300741EC7 /* ContentView.swift in Sources */, + 504ACC592BF7922200741EC7 /* ContentViewViewModel.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -454,7 +468,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = 232779VTR2; INFOPLIST_FILE = SwiftStomp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; @@ -471,7 +485,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = 232779VTR2; INFOPLIST_FILE = SwiftStomp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; @@ -493,6 +507,7 @@ "$(inherited)", ); INFOPLIST_FILE = Tests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -510,6 +525,7 @@ "$(inherited)", ); INFOPLIST_FILE = Tests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 17.5; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/Example/SwiftStomp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/SwiftStomp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/SwiftStomp.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/SwiftStomp/Base.lproj/Main.storyboard b/Example/SwiftStomp/Base.lproj/Main.storyboard index 4c7e56c..e332069 100644 --- a/Example/SwiftStomp/Base.lproj/Main.storyboard +++ b/Example/SwiftStomp/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - - + + @@ -20,11 +20,11 @@ - + - - - - + - - + + - + + + + + + + + + + + + + + + + + + + + + + @@ -99,6 +137,7 @@ + @@ -107,4 +146,24 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Example/SwiftStomp/ContentView.swift b/Example/SwiftStomp/ContentView.swift new file mode 100644 index 0000000..78aeca1 --- /dev/null +++ b/Example/SwiftStomp/ContentView.swift @@ -0,0 +1,144 @@ +// +// ContentView.swift +// SwiftStomp_Example +// +// Created by Ahmad Daneshvar on 5/17/24. +// Copyright © 2024 CocoaPods. All rights reserved. +// + +import SwiftUI + +struct ContentView: View { + + @State private var viewModel = ViewModel() + + private var messageBinding: Binding { + Binding { viewModel.viewState.message } + set: { newValue in + Task { await viewModel.updateMessage(text: newValue) } + } + } + + private var destinationBinding: Binding { + Binding { viewModel.viewState.destination } + set: { newValue in + Task { await viewModel.updateDestination(text: newValue) } + } + } + + var body: some View { + VStack { + connectionButton + + destinationTextView + + messageTextView + + sendButton + + logView + } + .scenePadding() + } + + + private var connectionButton: some View { + let isConnected = viewModel.viewState.isConnected + let title = isConnected ? "Disconnect" : "Connect" + let color = isConnected ? Color.red : Color.green + + + return Button { + Task { + if isConnected{ + await viewModel.disconnect() + } else { + await viewModel.connect() + } + } + } label: { + Text(title) + .frame(maxWidth: .infinity) + } + .buttonStyle(.borderedProminent) + .tint(color) + } + + private var destinationTextView: some View { + VStack { + HStack { + Text("Destination:") + Spacer() + } + Rectangle() + .foregroundStyle(.white) + .overlay { + RoundedRectangle(cornerRadius: 7) + .stroke(lineWidth: 0.5) + .foregroundStyle(.gray) + } + .overlay { + TextField("", text: destinationBinding) + .padding(12) + .foregroundStyle(.gray) + } + .frame(height: 50) + } + .padding(.top, 20) + } + + private var messageTextView: some View { + VStack { + HStack { + Text("Message:") + Spacer() + } + Rectangle() + .foregroundStyle(.white) + .overlay { + RoundedRectangle(cornerRadius: 7) + .stroke(lineWidth: 0.5) + } + .overlay { + TextEditor(text: messageBinding) + .frame(maxWidth: .infinity) + .foregroundStyle(.black) + .clipShape(.rect(cornerRadius: 7)) + } + .frame(height: 100) + } + } + + private var sendButton: some View { + let isConnected = viewModel.viewState.isConnected + + return Button { + viewModel.sendMessage() + } label: { + Text("Send") + .frame(maxWidth: .infinity) + } + .buttonStyle(.borderedProminent) + .tint(.blue) + .disabled(!isConnected) + } + + private var logView: some View { + VStack { + HStack { + Text("Logs") + Spacer() + } + List(Array(viewModel.viewState.logs.enumerated()), id: \.offset) { item in + Text(item.element) + .font(.system(size: 9, weight: .regular, design: .monospaced)) + } + .clipShape(.rect(cornerRadius: 7.0)) + } + .padding(.top, 16) + } +} + +#Preview { + ContentView() +} diff --git a/Example/SwiftStomp/ContentViewViewModel.swift b/Example/SwiftStomp/ContentViewViewModel.swift new file mode 100644 index 0000000..d9b5cf3 --- /dev/null +++ b/Example/SwiftStomp/ContentViewViewModel.swift @@ -0,0 +1,121 @@ +// +// ContentViewViewModel.swift +// SwiftStomp_Example +// +// Created by Ahmad Daneshvar on 5/17/24. +// Copyright © 2024 CocoaPods. All rights reserved. +// + +import SwiftUI +import Observation +import SwiftStomp +import Combine + +extension ContentView { + @Observable class ViewModel { + static let connectionURL = "ws://localhost:8080/gs-guide-websocket" + static let subscriptionTopic = "/topic/greetings" + + private(set) var viewState: ViewState = .default + + private var swiftStomp = SwiftStomp(host: URL(string: connectionURL)!) + private var subscriptions = [AnyCancellable]() + private var messageIndex = 0 + + init() { + configureSwiftStomp() + subscribeToUpstreams() + } + + @MainActor + func connect() { + if !swiftStomp.isConnected{ + swiftStomp.connect() + } + } + + @MainActor + func disconnect() { + if swiftStomp.isConnected{ + swiftStomp.disconnect() + } + } + + @MainActor + func updateMessage(text: String) { + viewState.message = text + } + + @MainActor + func updateDestination(text: String) { + viewState.destination = text + } + + func sendMessage() { + messageIndex += 1 + swiftStomp.send(body: viewState.message, to: viewState.destination, receiptId: "msg-\(messageIndex)", headers: [:]) + } + + private func configureSwiftStomp() { + self.swiftStomp.enableLogging = true + self.swiftStomp.autoReconnect = true + + self.swiftStomp.enableAutoPing() + } + + private func subscribeToUpstreams() { + swiftStomp.eventsUpstream + .receive(on: RunLoop.main) + .sink { [weak self] event in + guard let self else { return } + + switch event { + case let .connected(type): + if type == .toStomp { + swiftStomp.subscribe(to: ViewModel.subscriptionTopic) + } + viewState.isConnected = true + case .disconnected(_): + viewState.isConnected = false + case let .error(error): + print("Error: \(error)") + } + } + .store(in: &subscriptions) + + swiftStomp.messagesUpstream + .receive(on: RunLoop.main) + .sink { [weak self] message in + guard let self else { return } + + switch message { + case let .text(message, messageId, destination, _): + viewState.logs += ["\(Date().formatted()) [id: \(messageId), at: \(destination)]: \(message)\n"] + case let .data(data, messageId, destination, _): + viewState.logs += ["Data message with id `\(messageId)` and binary length `\(data.count)` received at destination `\(destination)`"] + } + } + .store(in: &subscriptions) + + swiftStomp.receiptUpstream + .sink { receiptId in + print("SwiftStop: Receipt received: \(receiptId)") + } + .store(in: &subscriptions) + } + } + + struct ViewState: Equatable { + var isConnected: Bool + var destination: String + var message: String + var logs: [String] + + static let `default` = ViewState( + isConnected: false, + destination: "", + message: "", + logs: [] + ) + } +} diff --git a/Example/SwiftStomp/ViewController.swift b/Example/SwiftStomp/ViewController.swift index f190991..d5dd188 100644 --- a/Example/SwiftStomp/ViewController.swift +++ b/Example/SwiftStomp/ViewController.swift @@ -7,6 +7,7 @@ // import UIKit +import SwiftUI import SwiftStomp class ViewController: UIViewController { @@ -14,7 +15,7 @@ class ViewController: UIViewController { /// Outlets @IBOutlet weak var destinationTextField: UITextField! @IBOutlet weak var messageTextView: UITextView! - + @IBOutlet weak var logView: UITextView! /// Client private var swiftStomp : SwiftStomp! @@ -28,7 +29,7 @@ class ViewController: UIViewController { } private func initStomp(){ - let url = URL(string: "ws://192.168.1.6:8081/socket")! + let url = URL(string: "ws://localhost:8080/gs-guide-websocket")! self.swiftStomp = SwiftStomp(host: url, headers: ["Authorization" : "Bearer 5c09614a-22dc-4ccd-89c1-5c78338f45e9"]) self.swiftStomp.enableLogging = true @@ -83,6 +84,11 @@ class ViewController: UIViewController { self.view.endEditing(true) } + @IBAction func triggerSwiftUIVersion(_ sender: Any) { + let swiftUIVC = UIHostingController(rootView: ContentView()) + present(swiftUIVC, animated: true) + } + } extension ViewController : SwiftStompDelegate{ @@ -94,9 +100,7 @@ extension ViewController : SwiftStompDelegate{ print("Connected to stomp") //** Subscribe to topics or queues just after connect to the stomp! - swiftStomp.subscribe(to: "/topic/greeting") - swiftStomp.subscribe(to: "/topic/greeting2") - + swiftStomp.subscribe(to: "/topic/greetings") } } @@ -112,6 +116,7 @@ extension ViewController : SwiftStompDelegate{ if let message = message as? String{ print("Message with id `\(messageId)` received at destination `\(destination)`:\n\(message)") + logView.text += "\(Date().formatted()) [id: \(messageId), at: \(destination)]: \(message)\n" } else if let message = message as? Data{ print("Data message with id `\(messageId)` and binary length `\(message.count)` received at destination `\(destination)`") } diff --git a/Package.swift b/Package.swift index cbd48e4..cf6f13c 100644 --- a/Package.swift +++ b/Package.swift @@ -1,25 +1,27 @@ -// swift-tools-version:5.0 +// swift-tools-version:5.3 import PackageDescription let package = Package( name: "SwiftStomp", platforms: [ - .iOS(.v10) + .iOS(.v13), + .macOS(.v10_15), + .watchOS(.v6), + .tvOS(.v13) ], products: [ .library(name: "SwiftStomp", targets: ["SwiftStomp"]) ], dependencies: [ - .package(url: "https://github.com/daltoniam/Starscream.git", .exact("4.0.6")), .package(url: "https://github.com/ashleymills/Reachability.swift", .upToNextMajor(from: "5.0.0")) ], targets: [ .target( name: "SwiftStomp", - dependencies: ["Starscream", - "Reachability"], + dependencies: [ + .product(name: "Reachability", package: "Reachability.swift"), + ], path: "SwiftStomp" ) ] ) - diff --git a/README.md b/README.md index e21c1e9..38ee102 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,42 @@ # SwiftStomp -## An elegent Stomp client for swift, Base on [Starscream](https://github.com/daltoniam/Starscream) websocket library. +## An elegent Stomp client for swift, based on iOS `URLSessionWebSocketTask`. [![Version](https://img.shields.io/cocoapods/v/SwiftStomp.svg?style=flat)](https://cocoapods.org/pods/SwiftStomp) [![License](https://img.shields.io/cocoapods/l/SwiftStomp.svg?style=flat)](https://cocoapods.org/pods/SwiftStomp) [![Platform](https://img.shields.io/cocoapods/p/SwiftStomp.svg?style=flat)](https://cocoapods.org/pods/SwiftStomp) -![SwiftStomp](https://raw.githubusercontent.com/Romixery/SwiftStomp/assets/Example/SwiftStomp/Assets/SS-Logo.jpg) +|SwiftStomp| +|---------| +|| +|| + +# TOC +- [SwiftStomp](#swiftstomp) + - [An elegent Stomp client for swift, based on iOS `URLSessionWebSocketTask`.](#an-elegent-stomp-client-for-swift-based-on-ios-urlsessionwebsockettask) +- [TOC](#toc) + - [Fetures](#fetures) + - [Usage](#usage) + - [Setup](#setup) + - [Delegate](#delegate) + - [Upstreams](#upstreams) + - [Connect](#connect) + - [Subscription](#subscription) + - [Send Message](#send-message) + - [Connection Status check](#connection-status-check) + - [Manual Pinging](#manual-pinging) + - [Auto Pinging](#auto-pinging) + - [Test Environment](#test-environment) + - [Example](#example) + - [Requirements](#requirements) + - [Installation](#installation) + - [CocoaPods](#cocoapods) + - [Swift Package Manager](#swift-package-manager) + - [Author](#author) + - [Contributors](#contributors) + - [License](#license) + ## Fetures - Easy to setup, Very light-weight @@ -16,6 +45,7 @@ - Send and receive `Data` and `Text` - Auto reconnect - Logging +- Reactive programming ready. ## Usage @@ -45,6 +75,48 @@ func onReceipt(swiftStomp : SwiftStomp, receiptId : String) func onError(swiftStomp : SwiftStomp, briefDescription : String, fullDescription : String?, receiptId : String?, type : StompErrorType) ``` +### Upstreams +In the case that you are more comfort to use `Combine` publishers, instead of delegate, SwiftStomp can report all `event`s, `message`s and `receiptId`s through upstreams. This functionality shines, especially, when you want to use SwiftStomp in the SwiftUI projects. Please check the example project, to see how we can use upstreams, in SwiftUI projects. + +```swift +// ** Subscribe to events: [Connect/Disconnect/Errors] +swiftStomp.eventsUpstream + .receive(on: RunLoop.main) + .sink { event in + + switch event { + case let .connected(type): + print("Connected with type: \(type)") + case .disconnected(_): + print("Disconnected with type: \(type)") + case let .error(error): + print("Error: \(error)") + } + } + .store(in: &subscriptions) + +// ** Subscribe to messages: [Text/Data] +swiftStomp.messagesUpstream + .receive(on: RunLoop.main) + .sink { message in + + switch message { + case let .text(message, messageId, destination, _): + print("\(Date().formatted()) [id: \(messageId), at: \(destination)]: \(message)\n") + case let .data(data, messageId, destination, _): + print("Data message with id `\(messageId)` and binary length `\(data.count)` received at destination `\(destination)`") + } + } + .store(in: &subscriptions) + +// ** Subscribe to receipts: [Receipt IDs] +swiftStomp.receiptUpstream + .sink { receiptId in + print("SwiftStop: Receipt received: \(receiptId)") + } + .store(in: &subscriptions) +``` + ### Connect Full `Connect` signature: ```Swift @@ -137,6 +209,10 @@ From Xcode 11, you can use [Swift Package Manager](https://swift.org/package-man Ahmad Daneshvar, romixery@gmail.com +## Contributors +Very special thanks to: +@stuartcamerondeakin, @hunble, @aszter + ## License SwiftStomp is available under the MIT license. See the LICENSE file for more info. diff --git a/SwiftStomp.podspec b/SwiftStomp.podspec index 3ee95f9..19394f1 100644 --- a/SwiftStomp.podspec +++ b/SwiftStomp.podspec @@ -8,23 +8,24 @@ Pod::Spec.new do |s| s.name = 'SwiftStomp' - s.version = '1.1.1' + s.version = '1.2.0' s.summary = 'An elegant Stomp client for iOS.' s.description = <<-DESC SwiftStomp is and elegant, light-weight and easy-to-use STOMP (Simple Text Oriented Messaging Protocol) client for iOS. - It's based on Starscream, an amazing Websocket library for swift. + It's based on `URLSessionWebSocketTask`. DESC s.homepage = 'https://github.com/Romixery/SwiftStomp' s.license = { :type => 'MIT', :file => 'LICENSE' } s.author = { 'Romixery' => 'topcoder.romixery@gmail.com' } s.source = { :git => 'https://github.com/Romixery/SwiftStomp.git', :tag => s.version.to_s } - s.author = {'Ahmad Daneshvar' => 'http://iamdaneshvar.com'} + s.author = {'Ahmad Daneshvar' => 'http://attar.ai'} s.source = { :git => 'https://github.com/Romixery/SwiftStomp.git', :tag => "#{s.version}"} - s.ios.deployment_target = '10.0' - s.osx.deployment_target = "10.12" - s.tvos.deployment_target = "10.0" + s.ios.deployment_target = '13.0' + s.osx.deployment_target = "10.15" + s.tvos.deployment_target = "13.0" + s.watchos.deployment_target = "6.0" s.swift_version = '5.0' s.source_files = 'SwiftStomp/Classes/**/*' @@ -34,6 +35,5 @@ Pod::Spec.new do |s| # } # s.public_header_files = 'Pod/Classes/**/*.h' - s.dependency 'Starscream', '~> 4.0.4' s.dependency 'ReachabilitySwift', '~> 5.0.0' end diff --git a/SwiftStomp/Classes/Enumurations/StompAckMode.swift b/SwiftStomp/Classes/Enumurations/StompAckMode.swift new file mode 100644 index 0000000..832ceee --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompAckMode.swift @@ -0,0 +1,13 @@ +// +// StompAckMode.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public enum StompAckMode : String{ + case clientIndividual = "client-individual" + case client = "client" + case auto = "auto" +} + diff --git a/SwiftStomp/Classes/Enumurations/StompCommandHeader.swift b/SwiftStomp/Classes/Enumurations/StompCommandHeader.swift new file mode 100644 index 0000000..7ea104d --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompCommandHeader.swift @@ -0,0 +1,25 @@ +// +// StompCommandHeader.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public enum StompCommonHeader : String{ + case id = "id" + case host = "host" + case receipt = "receipt" + case session = "session" + case receiptId = "receipt-id" + case messageId = "message-id" + case destination = "destination" + case contentLength = "content-length" + case contentType = "content-type" + case ack = "ack" + case transaction = "transaction" + case subscription = "subscription" + case disconnected = "disconnected" + case heartBeat = "heart-beat" + case acceptVersion = "accept-version" + case message = "message" +} diff --git a/SwiftStomp/Classes/Enumurations/StompConnectType.swift b/SwiftStomp/Classes/Enumurations/StompConnectType.swift new file mode 100644 index 0000000..a623b71 --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompConnectType.swift @@ -0,0 +1,12 @@ +// +// StompConnectType.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public enum StompConnectType{ + case toSocketEndpoint + case toStomp +} + diff --git a/SwiftStomp/Classes/Enumurations/StompConnectionStatus.swift b/SwiftStomp/Classes/Enumurations/StompConnectionStatus.swift new file mode 100644 index 0000000..55df01f --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompConnectionStatus.swift @@ -0,0 +1,13 @@ +// +// StompConnectionStatus.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public enum StompConnectionStatus{ + case connecting + case socketDisconnected + case socketConnected + case fullyConnected +} diff --git a/SwiftStomp/Classes/Enumurations/StompDisconnectType.swift b/SwiftStomp/Classes/Enumurations/StompDisconnectType.swift new file mode 100644 index 0000000..ff7da8c --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompDisconnectType.swift @@ -0,0 +1,12 @@ +// +// StompDisconnectType.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public enum StompDisconnectType{ + case fromSocket + case fromStomp +} + diff --git a/SwiftStomp/Classes/Enumurations/StompErrorType.swift b/SwiftStomp/Classes/Enumurations/StompErrorType.swift new file mode 100644 index 0000000..28b9ba6 --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompErrorType.swift @@ -0,0 +1,11 @@ +// +// StompErrorType.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public enum StompErrorType{ + case fromSocket + case fromStomp +} diff --git a/SwiftStomp/Classes/Enumurations/StompLogType.swift b/SwiftStomp/Classes/Enumurations/StompLogType.swift new file mode 100644 index 0000000..7e1896c --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompLogType.swift @@ -0,0 +1,12 @@ +// +// StompLogType.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +internal enum StompLogType : String{ + case info = "INFO" + case socketError = "SOCKET ERROR" + case stompError = "STOMP ERROR" +} diff --git a/SwiftStomp/Classes/Enumurations/StompRequestFrame.swift b/SwiftStomp/Classes/Enumurations/StompRequestFrame.swift new file mode 100644 index 0000000..e7dd21a --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompRequestFrame.swift @@ -0,0 +1,19 @@ +// +// StompRequestFrame.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public enum StompRequestFrame : String { + case connect = "CONNECT" + case send = "SEND" + case subscribe = "SUBSCRIBE" + case unsubscribe = "UNSUBSCRIBE" + case begin = "BEGIN" + case commit = "COMMIT" + case abort = "ABORT" + case ack = "ACK" + case nack = "NACK" + case disconnect = "DISCONNECT" +} diff --git a/SwiftStomp/Classes/Enumurations/StompResponseFrame.swift b/SwiftStomp/Classes/Enumurations/StompResponseFrame.swift new file mode 100644 index 0000000..7ce183d --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompResponseFrame.swift @@ -0,0 +1,14 @@ +// +// StompResponseFrame.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public enum StompResponseFrame : String{ + case connected = "CONNECTED" + case message = "MESSAGE" + case receipt = "RECEIPT" + case error = "ERROR" +} + diff --git a/SwiftStomp/Classes/Enumurations/StompUpstreamEvent.swift b/SwiftStomp/Classes/Enumurations/StompUpstreamEvent.swift new file mode 100644 index 0000000..0a32827 --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompUpstreamEvent.swift @@ -0,0 +1,12 @@ +// +// StompUpstreamEvent.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public enum StompUpstreamEvent { + case connected(type: StompConnectType) + case disconnected(type: StompDisconnectType) + case error(error: StompError) +} diff --git a/SwiftStomp/Classes/Enumurations/StompUpstreamMessage.swift b/SwiftStomp/Classes/Enumurations/StompUpstreamMessage.swift new file mode 100644 index 0000000..2406248 --- /dev/null +++ b/SwiftStomp/Classes/Enumurations/StompUpstreamMessage.swift @@ -0,0 +1,11 @@ +// +// StompUpstreamMessage.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public enum StompUpstreamMessage { + case text(message : String, messageId : String, destination : String, headers : [String : String]) + case data(data: Data, messageId : String, destination : String, headers : [String : String]) +} diff --git a/SwiftStomp/Classes/Errors/InvalidStompCommandError.swift b/SwiftStomp/Classes/Errors/InvalidStompCommandError.swift new file mode 100644 index 0000000..9c8bef8 --- /dev/null +++ b/SwiftStomp/Classes/Errors/InvalidStompCommandError.swift @@ -0,0 +1,14 @@ +// +// InvalidStompCommandError.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public class InvalidStompCommandError : Error{ + + var localizedDescription: String { + return "Invalid STOMP command" + } +} + diff --git a/SwiftStomp/Classes/Errors/StompError.swift b/SwiftStomp/Classes/Errors/StompError.swift new file mode 100644 index 0000000..ea7a740 --- /dev/null +++ b/SwiftStomp/Classes/Errors/StompError.swift @@ -0,0 +1,30 @@ +// +// StompError.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +public struct StompError: Error { + public let localizedDescription: String + public let receiptId: String? + public let type: StompErrorType + + init(type: StompErrorType, receiptId: String?, localizedDescription: String) { + self.localizedDescription = localizedDescription + self.receiptId = receiptId + self.type = type + } + + init(error: Error, type: StompErrorType) { + self.localizedDescription = error.localizedDescription + self.receiptId = nil + self.type = type + } +} + +extension StompError: CustomStringConvertible { + public var description: String { + "StompError(\(type)) [receiptId: \(String(describing: receiptId))]: \(localizedDescription)" + } +} diff --git a/SwiftStomp/Classes/FrameHelpers/StompFrame.swift b/SwiftStomp/Classes/FrameHelpers/StompFrame.swift new file mode 100644 index 0000000..f204d8a --- /dev/null +++ b/SwiftStomp/Classes/FrameHelpers/StompFrame.swift @@ -0,0 +1,132 @@ +// +// StompFrame.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +import Foundation + +internal struct StompFrame where T.RawValue == String { + var name: T! + var headers = [String: String]() + var body: Any = "" + + init(name: T, headers: [String: String] = [:]) { + self.name = name + self.headers = headers + } + + init(name: T, headers: [String: String] = [:], encodableBody: X, jsonDateEncodingStrategy: JSONEncoder.DateEncodingStrategy = .iso8601) { + self.init(name: name, headers: headers) + + let jsonEncoder = JSONEncoder() + jsonEncoder.dateEncodingStrategy = jsonDateEncodingStrategy + + if let jsonData = try? jsonEncoder.encode(encodableBody), + let jsonString = String(data: jsonData, encoding: .utf8) + { + self.body = jsonString + self.headers[StompCommonHeader.contentType.rawValue] = "application/json;charset=UTF-8" + } + } + + init(name: T, headers: [String: String] = [:], stringBody: String) { + self.init(name: name, headers: headers) + + self.body = stringBody + if self.headers[StompCommonHeader.contentType.rawValue] == nil { + self.headers[StompCommonHeader.contentType.rawValue] = "text/plain" + } + } + + init(name: T, headers: [String: String] = [:], dataBody: Data) { + self.init(name: name, headers: headers) + + self.body = dataBody + } + + init(withSerializedString frame: String) throws { + try deserialize(frame: frame) + } + + func serialize() -> String { + var frame = name.rawValue + "\n" + + // ** Headers + for (hKey, hVal) in headers { + frame += "\(hKey):\(hVal)\n" + } + + // ** Body + if let stringBody = body as? String, !stringBody.isEmpty { + frame += "\n\(stringBody)" + } else if let dataBody = body as? Data, !dataBody.isEmpty { + let dataAsBase64 = dataBody.base64EncodedString() + frame += "\n\(dataAsBase64)" + } else { + frame += "\n" + } + + // ** Add NULL char + frame += NULL_CHAR + + return frame + } + + mutating func deserialize(frame: String) throws { + var lines = frame.components(separatedBy: "\n") + + // ** Remove first if was empty string + if let firstLine = lines.first, firstLine.isEmpty { + lines.removeFirst() + } + + // ** Parse Command + if let command = StompRequestFrame(rawValue: lines.first ?? "") { + name = (command as! T) + } else if let command = StompResponseFrame(rawValue: lines.first ?? "") { + name = (command as! T) + } else { + throw InvalidStompCommandError() + } + + // ** Remove Command + lines.removeFirst() + + // ** Parse Headers + while let line = lines.first, !line.isEmpty { + let headerParts = line.components(separatedBy: ":") + + if headerParts.count != 2 { + break + } + + headers[headerParts[0].trimmingCharacters(in: .whitespacesAndNewlines)] = headerParts[1].trimmingCharacters(in: .whitespacesAndNewlines) + + lines.removeFirst() + } + + // ** Remove the blank line between the headers and body + if let firstLine = lines.first, firstLine.isEmpty { + lines.removeFirst() + } + + // ** Parse body + var body = lines.joined(separator: "\n") + + if body.hasSuffix("\0") { + body = body.replacingOccurrences(of: "\0", with: "") + } + + if let data = Data(base64Encoded: body) { + self.body = data + } else { + self.body = body + } + } + + func getCommonHeader(_ header: StompCommonHeader) -> String? { + return headers[header.rawValue] + } +} diff --git a/SwiftStomp/Classes/FrameHelpers/StompHeaderBuilder.swift b/SwiftStomp/Classes/FrameHelpers/StompHeaderBuilder.swift new file mode 100644 index 0000000..4b53888 --- /dev/null +++ b/SwiftStomp/Classes/FrameHelpers/StompHeaderBuilder.swift @@ -0,0 +1,30 @@ +// +// StompHeaderBuilder.swift +// Pods +// +// Created by Ahmad Daneshvar on 5/16/24. +// + +import Foundation + +public class StompHeaderBuilder{ + private var headers = [String : String]() + + static func add(key : StompCommonHeader, value : Any) -> StompHeaderBuilder{ + return StompHeaderBuilder(key: key.rawValue, value: value) + } + + private init(key : String, value : Any){ + self.headers[key] = "\(value)" + } + + func add(key : StompCommonHeader, value : Any) -> StompHeaderBuilder{ + self.headers[key.rawValue] = "\(value)" + + return self + } + + var get : [String : String]{ + return self.headers + } +} diff --git a/SwiftStomp/Classes/SwiftStomp.swift b/SwiftStomp/Classes/SwiftStomp.swift index 764810c..3cb9aa5 100644 --- a/SwiftStomp/Classes/SwiftStomp.swift +++ b/SwiftStomp/Classes/SwiftStomp.swift @@ -7,107 +7,54 @@ // import Foundation -import Starscream +import OSLog import Reachability +import Combine -fileprivate let NULL_CHAR = String(format: "%C", arguments: [0x00]) - -// MARK: - Enums -public enum StompRequestFrame : String { - case connect = "CONNECT" - case send = "SEND" - case subscribe = "SUBSCRIBE" - case unsubscribe = "UNSUBSCRIBE" - case begin = "BEGIN" - case commit = "COMMIT" - case abort = "ABORT" - case ack = "ACK" - case nack = "NACK" - case disconnect = "DISCONNECT" -} - -public enum StompResponseFrame : String{ - case connected = "CONNECTED" - case message = "MESSAGE" - case receipt = "RECEIPT" - case error = "ERROR" -} - - -public enum StompAckMode : String{ - case clientIndividual = "client-individual" - case client = "client" - case auto = "auto" -} - -public enum StompCommonHeader : String{ - case id = "id" - case host = "host" - case receipt = "receipt" - case session = "session" - case receiptId = "receipt-id" - case messageId = "message-id" - case destination = "destination" - case contentLength = "content-length" - case contentType = "content-type" - case ack = "ack" - case transaction = "transaction" - case subscription = "subscription" - case disconnected = "disconnected" - case heartBeat = "heart-beat" - case acceptVersion = "accept-version" - case message = "message" -} - -public enum StompErrorType{ - case fromSocket - case fromStomp -} - -public enum StompDisconnectType{ - case fromSocket - case fromStomp -} - -public enum StompConnectType{ - case toSocketEndpoint - case toStomp -} +let NULL_CHAR = "\u{00}" -public enum StompConnectionStatus{ - case connecting - case socketDisconnected - case socketConnected - case fullyConnected -} - -fileprivate enum StompLogType : String{ - case info = "INFO" - case socketError = "SOCKET ERROR" - case stompError = "STOMP ERROR" -} // MARK: - SwiftStomp -public class SwiftStomp{ - +public class SwiftStomp: NSObject { + fileprivate var host : URL fileprivate var httpConnectionHeaders : [String : String]? fileprivate var stompConnectionHeaders : [String : String]? - fileprivate var socket : WebSocket! + + fileprivate var urlSession: URLSession? + fileprivate var webSocketTask: URLSessionWebSocketTask? + fileprivate var acceptVersion = "1.1,1.2" fileprivate var status : StompConnectionStatus = .socketDisconnected fileprivate var reconnectScheduler : Timer? fileprivate var reconnectTryCount = 0 - fileprivate var reachability : Reachability! + fileprivate var reachability : Reachability? fileprivate var hostIsReachabile = true - + /// Auto ping peroperties fileprivate var pingTimer : Timer? fileprivate var pingInterval: TimeInterval = 10 //< 10 Seconds fileprivate var autoPingEnabled = false + + public weak var delegate: SwiftStompDelegate? + + /// Streams + fileprivate var _eventsUpstream = PassthroughSubject() + fileprivate var _messagesUpstream = PassthroughSubject() + fileprivate var _receiptsUpstream = PassthroughSubject() + + public var eventsUpstream: AnyPublisher { + _eventsUpstream.eraseToAnyPublisher() + } + + public var messagesUpstream: AnyPublisher { + _messagesUpstream.eraseToAnyPublisher() + } + + public var receiptUpstream: AnyPublisher { + _receiptsUpstream.eraseToAnyPublisher() + } - /// It's not a weak delegate - please make sure you avoid retain cycles! - public var delegate : SwiftStompDelegate? // WARNING - It's not a weak delegate! public var enableLogging = false public var isConnected : Bool { return self.status == .fullyConnected @@ -115,29 +62,50 @@ public class SwiftStomp{ public var connectionStatus : StompConnectionStatus{ return self.status } - public var callbacksThread : DispatchQueue? + + // Private storage for the callbacksThread, not directly accessible outside of this class + private var _callbacksThread: DispatchQueue? + + // Public computed property + public var callbacksThread: DispatchQueue { + // Getter returns _callbacksThread if it's not nil, otherwise returns DispatchQueue.main + get { + return _callbacksThread ?? DispatchQueue.main + } + // Setter allows external code to set _callbacksThread + set { + _callbacksThread = newValue + } + } + public var autoReconnect = false - + public init (host : URL, headers : [String : String]? = nil, httpConnectionHeaders : [String : String]? = nil){ self.host = host - - self.stompConnectionHeaders = headers self.httpConnectionHeaders = httpConnectionHeaders - /// Configure reachability + super.init() + self.urlSession = URLSession(configuration: .default, delegate: self, delegateQueue: nil) self.initReachability() } - + + deinit { + disconnect(force: true) + } + private func initReachability(){ - - reachability = try! Reachability(queueQoS: .utility, targetQueue: DispatchQueue(label: "swiftStomp.reachability"), notificationQueue: .global()) - reachability.whenReachable = { [weak self] _ in - self?.stompLog(type: .info, message: "Network IS reachable") - self?.hostIsReachabile = true - } - reachability.whenUnreachable = { [weak self] _ in - self?.stompLog(type: .info, message: "Network IS NOT reachable") - self?.hostIsReachabile = false + if let reachability = try? Reachability(queueQoS: .utility, targetQueue: DispatchQueue(label: "swiftStomp.reachability"), notificationQueue: .global()) { + reachability.whenReachable = { [weak self] _ in + self?.stompLog(type: .info, message: "Network IS reachable") + self?.hostIsReachabile = true + } + reachability.whenUnreachable = { [weak self] _ in + self?.stompLog(type: .info, message: "Network IS NOT reachable") + self?.hostIsReachabile = false + } + self.reachability = reachability + } else { + self.stompLog(type: .info, message: "Unable to create Reachability") } } } @@ -145,7 +113,9 @@ public class SwiftStomp{ /// Public Operating functions public extension SwiftStomp{ func connect(timeout : TimeInterval = 5, acceptVersion : String = "1.1,1.2", autoReconnect : Bool = false){ - + + self.stompLog(type: .info, message: "Connecting... autoReconnect: \(autoReconnect)") + self.autoReconnect = autoReconnect //** If socket is connected now, just needs to connect to the Stomp @@ -153,12 +123,12 @@ public extension SwiftStomp{ self.stompConnect() return } - + var urlRequest = URLRequest(url: self.host) - + //** Accept Version self.acceptVersion = acceptVersion - + //** Time interval urlRequest.timeoutInterval = timeout @@ -168,77 +138,73 @@ public extension SwiftStomp{ } } - //** Connect - self.socket = WebSocket(request: urlRequest) - - if let callbackQueue = self.callbacksThread{ - self.socket.callbackQueue = callbackQueue - } - + self.webSocketTask = urlSession?.webSocketTask(with: urlRequest) + self.webSocketTask?.resume() + + listen() + self.status = .connecting - - self.socket.delegate = self - self.socket.connect() } - + func disconnect(force : Bool = false){ - + + self.autoReconnect = false self.disableAutoPing() self.invalidateConnector() - + if !force{ //< Send disconnect first over STOMP self.stompDisconnect() } else { //< Disconnect socket directly! (Not recommended until you have to do it!) - self.socket.forceDisconnect() + handleDisconnect() } } - + func subscribe(to destination : String, mode : StompAckMode = .auto, headers : [String : String]? = nil){ var headersToSend = StompHeaderBuilder .add(key: .destination, value: destination) .add(key: .id, value: destination) .add(key: .ack, value: mode.rawValue) .get - + //** Append extra headers headers?.forEach({ hEntry in headersToSend[hEntry.key] = hEntry.value }) - + self.sendFrame(frame: StompFrame(name: .subscribe, headers: headersToSend)) } - + func unsubscribe(from destination : String, mode : StompAckMode = .auto, headers : [String : String]? = nil){ var headersToSend = StompHeaderBuilder .add(key: .id, value: destination) .get - + //** Append extra headers headers?.forEach({ hEntry in headersToSend[hEntry.key] = hEntry.value }) - + self.sendFrame(frame: StompFrame(name: .unsubscribe, headers: headersToSend)) } - + func send(body : String, to : String, receiptId : String? = nil, headers : [String : String]? = nil){ let headers = prepareHeadersForSend(to: to, receiptId: receiptId, headers: headers) - + self.sendFrame(frame: StompFrame(name: .send, headers: headers, stringBody: body)) } - + func send(body : Data, to : String, receiptId : String? = nil, headers : [String : String]? = nil){ let headers = prepareHeadersForSend(to: to, receiptId: receiptId, headers: headers) - + self.sendFrame(frame: StompFrame(name: .send, headers: headers, dataBody: body)) } - + func send (body : T, to : String, receiptId : String? = nil, headers : [String : String]? = nil, jsonDateEncodingStrategy : JSONEncoder.DateEncodingStrategy = .iso8601){ let headers = prepareHeadersForSend(to: to, receiptId: receiptId, headers: headers) - + self.sendFrame(frame: StompFrame(name: .send, headers: headers, encodableBody: body, jsonDateEncodingStrategy: jsonDateEncodingStrategy)) } - + func ack(messageId : String, transaction : String? = nil){ let headerBuilder = StompHeaderBuilder .add(key: .id, value: messageId) @@ -246,12 +212,12 @@ public extension SwiftStomp{ if let transaction = transaction{ _ = headerBuilder.add(key: .transaction, value: transaction) } - + let headers = headerBuilder.get - + self.sendFrame(frame: StompFrame(name: .ack, headers: headers)) } - + func nack(messageId : String, transaction : String? = nil){ let headerBuilder = StompHeaderBuilder .add(key: .id, value: messageId) @@ -259,235 +225,297 @@ public extension SwiftStomp{ if let transaction = transaction{ _ = headerBuilder.add(key: .transaction, value: transaction) } - + let headers = headerBuilder.get - + self.sendFrame(frame: StompFrame(name: .nack, headers: headers)) } - + func begin(transactionName : String){ let headers = StompHeaderBuilder .add(key: .transaction, value: transactionName) .get - + self.sendFrame(frame: StompFrame(name: .begin, headers: headers)) } - + func commit(transactionName : String){ let headers = StompHeaderBuilder .add(key: .transaction, value: transactionName) .get - + self.sendFrame(frame: StompFrame(name: .commit, headers: headers)) } - + func abort(transactionName : String){ let headers = StompHeaderBuilder .add(key: .transaction, value: transactionName) .get - + self.sendFrame(frame: StompFrame(name: .abort, headers: headers)) } - - + + /// Send ping command to keep connection alive /// - Parameters: /// - data: Date to send over Web socket /// - completion: Completion block func ping(data: Data = Data(), completion: (() -> Void)? = nil) { - + //** Check socket status - if self.status != .fullyConnected && self.status != .socketConnected{ + guard let webSocketTask, self.status == .fullyConnected || self.status == .socketConnected else { self.stompLog(type: .info, message: "Stomp: Unable to send `ping`. Socket is not connected!") return } - - self.socket.write(ping: data, completion: completion) - + + webSocketTask.sendPing() { _ in + completion?() + } + self.stompLog(type: .info, message: "Stomp: Ping sent!") - + //** Reset ping timer self.resetPingTimer() } - - + + /// Enable auto ping command to ensure connection will keep alive and prevent connection to stay idle /// - Notice: Please be care if you used `disconnect`, you have to re-enable the timer again. /// - Parameter pingInterval: Ping command send interval func enableAutoPing(pingInterval: TimeInterval = 10){ self.pingInterval = pingInterval self.autoPingEnabled = true - + //** Reset ping timer self.resetPingTimer() } - - + + /// Disable auto ping function func disableAutoPing(){ self.autoPingEnabled = false self.pingTimer?.invalidate() } - + } /// Helper functions fileprivate extension SwiftStomp{ func stompLog(type : StompLogType, message : String){ - if !self.enableLogging { return } + guard enableLogging else { return } + let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - print("\(formatter.string(from: Date())) SwiftStomp [\(type.rawValue)]:\t \(message)") + let timestamp = formatter.string(from: Date()) + os_log(type == .info ? .info : .error, "%s SwiftStomp [%s]: %s", timestamp, type.rawValue, message) } - + func prepareHeadersForSend(to : String, receiptId : String? = nil, headers : [String : String]? = nil) -> [String : String]{ - + let headerBuilder = StompHeaderBuilder .add(key: .destination, value: to) - + if let receiptId = receiptId{ _ = headerBuilder.add(key: .receipt, value: receiptId) } - + var headersToSend = headerBuilder.get - + //** Append user headers if let headers = headers{ for (hKey, hVal) in headers{ headersToSend[hKey] = hVal } } - + return headersToSend } - + func scheduleConnector(){ + self.stompLog(type: .info, message: "Scheduling connector") + if let scheduler = self.reconnectScheduler, scheduler.isValid{ scheduler.invalidate() + reconnectScheduler = nil } - try? self.reachability.startNotifier() + try? self.reachability?.startNotifier() - self.reconnectScheduler = Timer.scheduledTimer(withTimeInterval: 3, repeats: true, block: { [weak self] (timer) in - guard let self = self else { - return - } - if !self.hostIsReachabile{ - self.stompLog(type: .info, message: "Network is not reachable. Ignore connecting!") - return - } + DispatchQueue.main.async { [weak self] in + self?.reconnectScheduler = Timer.scheduledTimer(withTimeInterval: 3, repeats: true){ [weak self] timer in + guard let self = self else { + return + } - self.connect(autoReconnect: self.autoReconnect) - }) + self.stompLog(type: .info, message: "Reconnect scheduler running") + + if !self.hostIsReachabile{ + self.stompLog(type: .info, message: "Network is not reachable. Ignore connecting!") + return + } + + self.connect(autoReconnect: self.autoReconnect) + } + } } - + func invalidateConnector(){ + self.stompLog(type: .info, message: "Invalidating connector") + if let connector = self.reconnectScheduler, connector.isValid{ connector.invalidate() } - self.reachability.stopNotifier() + self.reachability?.stopNotifier() } - + } /// Back-Operating functions fileprivate extension SwiftStomp{ func stompConnect(){ - + //** Add headers var headers = StompHeaderBuilder .add(key: .acceptVersion, value: self.acceptVersion) .get - + //** Append connection headers if let stompConnectionHeaders = self.stompConnectionHeaders{ for (hKey, hVal) in stompConnectionHeaders{ headers[hKey] = hVal } } - - - + + + self.sendFrame(frame: StompFrame(name: .connect, headers: headers)) } - + func stompDisconnect(){ //** Add headers let headers = StompHeaderBuilder .add(key: .receipt, value: "disconnect/safe") .get - + self.sendFrame(frame: StompFrame(name: .disconnect, headers: headers)) } - + func processReceivedSocketText(text : String){ var frame : StompFrame //** Deserialize frame do{ frame = try StompFrame(withSerializedString: text) - }catch let ex{ - stompLog(type: .stompError, message: "Process frame error: \(ex.localizedDescription)") + }catch { + stompLog(type: .stompError, message: "Process frame error: \(error.localizedDescription)") return } - + //** Dispatch STOMP frame switch frame.name { case .message: stompLog(type: .info, message: "Stomp: Message received: \(String(describing: frame.body))") - + let messageId = frame.getCommonHeader(.messageId) ?? "" let destination = frame.getCommonHeader(.destination) ?? "" - - self.delegate?.onMessageReceived(swiftStomp: self, message: frame.body, messageId: messageId, destination: destination, headers: frame.headers) - + + callbacksThread.async { [weak self] in + guard let self else { return } + self.delegate?.onMessageReceived(swiftStomp: self, message: frame.body, messageId: messageId, destination: destination, headers: frame.headers) + + // ** Broadcast through upstream + if let stringBody = frame.body as? String { + self._messagesUpstream.send( + .text( + message: stringBody, + messageId: messageId, + destination: destination, + headers: frame.headers + ) + ) + } else if let dataBody = frame.body as? Data { + self._messagesUpstream.send( + .data( + data: dataBody, + messageId: messageId, + destination: destination, + headers: frame.headers + ) + ) + } + } + case .receipt: guard let receiptId = frame.getCommonHeader(.receiptId) else { stompLog(type: .stompError, message: "Receipt message received without `receipt-id` header: \(text)") return } - - + + stompLog(type: .info, message: "Receipt received: \(receiptId)") - - self.delegate?.onReceipt(swiftStomp: self, receiptId: receiptId) - + + callbacksThread.async { [weak self] in + guard let self else { return } + self.delegate?.onReceipt(swiftStomp: self, receiptId: receiptId) + self._receiptsUpstream.send(receiptId) + } + if receiptId == "disconnect/safe"{ self.status = .socketConnected - - self.delegate?.onDisconnect(swiftStomp: self, disconnectType: .fromStomp) - self.socket.disconnect() + + callbacksThread.async { [weak self] in + guard let self else { return } + self.delegate?.onDisconnect(swiftStomp: self, disconnectType: .fromStomp) + self._eventsUpstream.send(.disconnected(type: .fromStomp)) + } + + self.webSocketTask?.cancel(with: .goingAway, reason: nil) + self.webSocketTask = nil } case .error: self.status = .socketConnected - + guard let briefDescription = frame.getCommonHeader(.message) else { stompLog(type: .stompError, message: "Stomp error frame received without `message` header: \(text)") return } - + let fullDescription = frame.body as? String let receiptId = frame.getCommonHeader(.receiptId) - + stompLog(type: .stompError, message: briefDescription) - - self.delegate?.onError(swiftStomp: self, briefDescription: briefDescription, fullDescription: fullDescription, receiptId: receiptId, type: .fromStomp) + + callbacksThread.async { [weak self] in + guard let self else { return } + self.delegate?.onError(swiftStomp: self, briefDescription: briefDescription, fullDescription: fullDescription, receiptId: receiptId, type: .fromStomp) + self._eventsUpstream.send(.error(error: .init(type: .fromStomp, receiptId: receiptId, localizedDescription: briefDescription))) + } + case .connected: self.status = .fullyConnected - + stompLog(type: .info, message: "Stomp: Connected") - - self.delegate?.onConnect(swiftStomp: self, connectType: .toStomp) + + callbacksThread.async { [weak self] in + guard let self else { return } + self.delegate?.onConnect(swiftStomp: self, connectType: .toStomp) + self._eventsUpstream.send(.connected(type: .toStomp)) + } default: stompLog(type: .info, message: "Stomp: Un-Processable content: \(text)") } } - + func sendFrame(frame : StompFrame, completion : (() -> ())? = nil){ + guard let webSocketTask else { + stompLog(type: .info, message: "Unable to send frame \(frame.name.rawValue): WebSocket is not connected!") + return + } + switch self.status { case .socketConnected: if frame.name != .connect{ @@ -500,289 +528,155 @@ fileprivate extension SwiftStomp{ default: break } - + let rawFrameToSend = frame.serialize() - + stompLog(type: .info, message: "Stomp: Sending...\n\(rawFrameToSend)\n") - - self.socket.write(string: rawFrameToSend, completion: completion) - + + webSocketTask.send(.string(rawFrameToSend)) { error in + if let error = error { + self.stompLog(type: .stompError, message: "Error sending frame: \(error)") + } + + completion?() + } + //** Reset ping timer self.resetPingTimer() } - + func resetPingTimer(){ if !autoPingEnabled{ return } - - //** Invalidate if timer is valid - if let t = self.pingTimer, t.isValid{ - t.invalidate() + + DispatchQueue.main.async { [weak self] in + guard let self else { return } + + //** Invalidate if timer is valid + if let t = self.pingTimer, t.isValid{ + t.invalidate() + } + + //** Schedule the ping timer + self.pingTimer = Timer.scheduledTimer(withTimeInterval: self.pingInterval, repeats: true) { [weak self] _ in + self?.ping() + } } - - //** Schedule the ping timer - self.pingTimer = Timer.scheduledTimer(withTimeInterval: self.pingInterval, repeats: true, block: { [weak self] _ in - self?.ping() - }) } } /// Web socket delegate -extension SwiftStomp : WebSocketDelegate{ - public func didReceive(event: WebSocketEvent, client: WebSocketClient) { - switch event { - case .connected(let headers): - self.status = .socketConnected - - self.invalidateConnector() - - stompLog(type: .info, message: "Scoket: connected: \(headers)") - - self.delegate?.onConnect(swiftStomp: self, connectType: .toSocketEndpoint) - - self.stompConnect() - case .disconnected(let reason, let code): - - stompLog(type: .info, message: "Socket: Disconnected: \(reason) with code: \(code)") - - self.delegate?.onDisconnect(swiftStomp: self, disconnectType: .fromSocket) - - //** Disable auto ping - self.disableAutoPing() - - case .text(let string): - stompLog(type: .info, message: "Socket: Received text") - - self.processReceivedSocketText(text: string) - case .binary(let data): - stompLog(type: .info, message: "Socket: Received data: \(data.count)") - case .ping(let data): - stompLog(type: .info, message: "Socket: Ping data with length \(String(describing: data?.count))") - - case .pong(let data): - stompLog(type: .info, message: "Socket: Pong data with length \(String(describing: data?.count))") - - case .viabilityChanged(let viability): - stompLog(type: .info, message: "Socket: Viability changed: \(viability)") - self.delegate?.onSocketEvent(eventName: "viabilityChangedTo\(viability)", description: "Socket viability changed") - - case .reconnectSuggested(let suggested): - stompLog(type: .info, message: "Socket: Reconnect suggested: \(suggested)") - - self.delegate?.onSocketEvent(eventName: "reconnectSuggested", description: "Socket Reconnect suggested") - - if suggested{ - self.connect() - } - case .cancelled: - self.status = .socketDisconnected - - stompLog(type: .info, message: "Socket: Cancelled") - - self.delegate?.onSocketEvent(eventName: "cancelled", description: "Socket cancelled") - - if self.autoReconnect{ - self.scheduleConnector() - } - case .error(let error): - self.status = .socketDisconnected - - stompLog(type: .socketError, message: "Socket: Error: \(error.debugDescription)") - self.delegate?.onError(swiftStomp: self, briefDescription: "Socket Error", fullDescription: error?.localizedDescription, receiptId: nil, type: .fromSocket) - - if self.autoReconnect{ - self.scheduleConnector() - } - case .peerClosed: - self.status = .socketDisconnected - - stompLog(type: .info, message: "Socket: Peer closed") - - self.delegate?.onSocketEvent(eventName: "peerClosed", description: "Socket Closed by Peer") - - if self.autoReconnect{ - self.scheduleConnector() +extension SwiftStomp { + private func listen() { + self.stompLog(type: .info, message: "Listening.") + webSocketTask?.receive { [weak self] result in + switch result { + case .failure(let error): + self?.stompLog(type: .socketError, message: "Socket listen: Error: \(error)") + + self?.callbacksThread.async { [weak self] in + guard let self else { return } + self.delegate?.onError(swiftStomp: self, briefDescription: "Stomp Error", fullDescription: error.localizedDescription, receiptId: nil, type: .fromStomp) + } + + case .success(let message): + switch message { + case .string(let text): + self?.stompLog(type: .info, message: "Socket: Received text") + self?.processReceivedSocketText(text: text) + + case .data(let data): + self?.stompLog(type: .info, message: "Socket: Received data: \(data.count)") + + default: + break + } + + // Keep listening + self?.listen() } - @unknown default: - stompLog(type: .info, message: "Socket: Unexpected event kind: \(String(describing: event))") } } - } -// MARK: - SwiftStomp delegate -public protocol SwiftStompDelegate{ - - func onConnect(swiftStomp : SwiftStomp, connectType : StompConnectType) - - func onDisconnect(swiftStomp : SwiftStomp, disconnectType : StompDisconnectType) - - func onMessageReceived(swiftStomp : SwiftStomp, message : Any?, messageId : String, destination : String, headers : [String : String]) - - func onReceipt(swiftStomp : SwiftStomp, receiptId : String) - - func onError(swiftStomp : SwiftStomp, briefDescription : String, fullDescription : String?, receiptId : String?, type : StompErrorType) - - func onSocketEvent(eventName : String, description : String) -} +extension SwiftStomp: URLSessionWebSocketDelegate { -// MARK: - Stomp Frame Class -fileprivate class StompFrame where T.RawValue == String{ - var name : T! - var headers = [String : String]() - var body : Any? - - init (name : T, headers : [String : String] = [:]){ - self.name = name - self.headers = headers - } - - convenience init (name : T, headers : [String : String] = [:], encodableBody : X, jsonDateEncodingStrategy : JSONEncoder.DateEncodingStrategy = .iso8601){ - self.init(name: name, headers: headers) - - let jsonEncoder = JSONEncoder() - jsonEncoder.dateEncodingStrategy = jsonDateEncodingStrategy - - if let jsonData = try? jsonEncoder.encode(encodableBody){ - self.body = String(data: jsonData, encoding: .utf8) - self.headers[StompCommonHeader.contentType.rawValue] = "application/json;charset=UTF-8" + public func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didOpenWithProtocol protocol: String?) { + let p = `protocol` ?? "" + + self.status = .socketConnected + self.invalidateConnector() + + stompLog(type: .info, message: "Socket: connected, protocol: \(p)") + + callbacksThread.async { [weak self] in + guard let self else { return } + self.delegate?.onConnect(swiftStomp: self, connectType: .toSocketEndpoint) + self._eventsUpstream.send(.connected(type: .toSocketEndpoint)) } + + self.stompConnect() } - - convenience init(name : T, headers : [String : String] = [:], stringBody : String){ - self.init(name: name, headers: headers) - - self.body = stringBody - if self.headers[StompCommonHeader.contentType.rawValue] == nil{ - self.headers[StompCommonHeader.contentType.rawValue] = "text/plain" + + public func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didCloseWith closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?) { + var r = "" + if let d = reason { + r = String(data: d, encoding: .utf8) ?? "" } - - - - } - - convenience init(name : T, headers : [String : String] = [:], dataBody : Data){ - self.init(name: name, headers: headers) - - self.body = dataBody - } - - init(withSerializedString frame : String) throws{ - try deserialize(frame: frame) + + stompLog(type: .info, message: "Socket: Disconnected: \(r) with code: \(closeCode.rawValue)") + + handleDisconnect() } - - func serialize() -> String{ - var frame = name.rawValue + "\n" - - //** Headers - for (hKey, hVal) in headers{ - frame += "\(hKey):\(hVal)\n" + + public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) { + guard let error else { + return } - //** Body - if body != nil{ - if let stringBody = body as? String{ - frame += "\n\(stringBody)" - } else if let dataBody = body as? Data{ - let dataAsBase64 = dataBody.base64EncodedString() - frame += "\n\(dataAsBase64)" - } - } else { - frame += "\n" + stompLog(type: .socketError, message: "Socket: Error: \(error.localizedDescription)") + + handleDisconnect() + + callbacksThread.async { [weak self] in + guard let self else { return } + self.delegate?.onError(swiftStomp: self, briefDescription: "Socket Error", fullDescription: error.localizedDescription, receiptId: nil, type: .fromSocket) + self._eventsUpstream.send(.error(error: .init(error: error, type: .fromSocket))) } - - //** Add NULL char - frame += NULL_CHAR - - return frame } - - func deserialize(frame : String) throws{ - var lines = frame.components(separatedBy: "\n") - - //** Remove first if was empty string - if let firstLine = lines.first, firstLine.isEmpty { - lines.removeFirst() - } - - //** Parse Command - if let command = StompRequestFrame(rawValue: lines.first ?? ""){ - self.name = (command as! T) - } else if let command = StompResponseFrame(rawValue: lines.first ?? ""){ - self.name = (command as! T) - } else { - throw InvalidStompCommandError() - } - - //** Remove Command - lines.removeFirst() - - //** Parse Headers - while let line = lines.first, !line.isEmpty { - let headerParts = line.components(separatedBy: ":") - - if headerParts.count != 2{ - break - } - - self.headers[headerParts[0].trimmingCharacters(in: .whitespacesAndNewlines)] = headerParts[1].trimmingCharacters(in: .whitespacesAndNewlines) - - lines.removeFirst() - } - //** Remove the blank line between the headers and body - if let firstLine = lines.first, firstLine.isEmpty { - lines.removeFirst() - } + private func handleDisconnect() { + pingTimer?.invalidate() + self.invalidateConnector() - //** Parse body - var body = lines.joined(separator: "\n") - - if body.hasSuffix("\0"){ - body = body.replacingOccurrences(of: "\0", with: "") + self.webSocketTask?.cancel(with: .goingAway, reason: nil) + self.webSocketTask = nil + + self.status = .socketDisconnected + + callbacksThread.async { [weak self] in + guard let self else { return } + self.delegate?.onDisconnect(swiftStomp: self, disconnectType: .fromSocket) + self._eventsUpstream.send(.disconnected(type: .fromSocket)) } - - if let data = Data(base64Encoded: body){ - self.body = data - } else { - self.body = body + + if self.autoReconnect{ + self.scheduleConnector() } } - - func getCommonHeader(_ header : StompCommonHeader) -> String?{ - return self.headers[header.rawValue] - } } -// MARK: - Header builder -public class StompHeaderBuilder{ - private var headers = [String : String]() - - static func add(key : StompCommonHeader, value : Any) -> StompHeaderBuilder{ - return StompHeaderBuilder(key: key.rawValue, value: value) - } - - private init(key : String, value : Any){ - self.headers[key] = "\(value)" - } - - func add(key : StompCommonHeader, value : Any) -> StompHeaderBuilder{ - self.headers[key.rawValue] = "\(value)" - - return self - } - - var get : [String : String]{ - return self.headers - } -} +// MARK: - SwiftStomp delegate +public protocol SwiftStompDelegate: AnyObject{ -// MARK: - Errors -public class InvalidStompCommandError : Error{ - - var localizedDescription: String { - return "Invalid STOMP command" - } -} + func onConnect(swiftStomp : SwiftStomp, connectType : StompConnectType) + + func onDisconnect(swiftStomp : SwiftStomp, disconnectType : StompDisconnectType) + + func onMessageReceived(swiftStomp : SwiftStomp, message : Any?, messageId : String, destination : String, headers : [String : String]) + + func onReceipt(swiftStomp : SwiftStomp, receiptId : String) + func onError(swiftStomp : SwiftStomp, briefDescription : String, fullDescription : String?, receiptId : String?, type : StompErrorType) +}