diff --git a/BoostRemote.xcodeproj/project.pbxproj b/BoostRemote.xcodeproj/project.pbxproj index dc42101..2708b4d 100644 --- a/BoostRemote.xcodeproj/project.pbxproj +++ b/BoostRemote.xcodeproj/project.pbxproj @@ -3,10 +3,14 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ + C4B587A92F7860080093A4E8 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4B587A82F7860080093A4E8 /* SceneDelegate.swift */; }; + C4CB52E92DD8F5AB00339F90 /* BoostBLEKit in Frameworks */ = {isa = PBXBuildFile; productRef = C4CB52E82DD8F5AB00339F90 /* BoostBLEKit */; }; + C4CB52EC2DD8FB2500339F90 /* ReSwift in Frameworks */ = {isa = PBXBuildFile; productRef = C4CB52EB2DD8FB2500339F90 /* ReSwift */; }; + C4CB52EF2DD8FC2000339F90 /* ReactiveSwift in Frameworks */ = {isa = PBXBuildFile; productRef = C4CB52EE2DD8FC2000339F90 /* ReactiveSwift */; }; CB0BF7E51F8BD873004CCD4F /* VerticalSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0BF7E41F8BD873004CCD4F /* VerticalSlider.swift */; }; CB0BF7E71F8BDD30004CCD4F /* StickView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0BF7E61F8BDD30004CCD4F /* StickView.swift */; }; CB2276C5236C292A008C1307 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2276C4236C292A008C1307 /* UIColor+Extension.swift */; }; @@ -25,12 +29,6 @@ CB7390C9201AB89900EAE3A7 /* UIImage+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB7390C8201AB89900EAE3A7 /* UIImage+Extension.swift */; }; CB84A382201BA3D300C02CD8 /* JoystickView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB84A381201BA3D300C02CD8 /* JoystickView.swift */; }; CB8C7EB4201FEF6500274A09 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB8C7EB3201FEF6500274A09 /* SettingsViewController.swift */; }; - CB9541D725660BCD00E34129 /* BoostBLEKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB95419125660B8F00E34129 /* BoostBLEKit.framework */; }; - CB9541D825660BCD00E34129 /* BoostBLEKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CB95419125660B8F00E34129 /* BoostBLEKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - CB9541D925660BCD00E34129 /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB9541C825660BAE00E34129 /* ReactiveSwift.framework */; }; - CB9541DA25660BCD00E34129 /* ReactiveSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CB9541C825660BAE00E34129 /* ReactiveSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - CB9541DB25660BCD00E34129 /* ReSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB9541A225660B9C00E34129 /* ReSwift.framework */; }; - CB9541DC25660BCD00E34129 /* ReSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = CB9541A225660B9C00E34129 /* ReSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; CBC72DFA201AC35C00ABE096 /* Controller.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC72DF9201AC35C00ABE096 /* Controller.swift */; }; CBD94E841F391B3F0037ED71 /* State.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD94E831F391B3F0037ED71 /* State.swift */; }; CBD94E861F391D7F0037ED71 /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD94E851F391D7F0037ED71 /* Action.swift */; }; @@ -40,128 +38,6 @@ CBF9D2F61F3CDAC700B97E11 /* Data+HexString.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBF9D2F51F3CDAC700B97E11 /* Data+HexString.swift */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - CB95419025660B8F00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB95418B25660B8F00E34129 /* BoostBLEKit.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = "BoostBLEKit::BoostBLEKit::Product"; - remoteInfo = BoostBLEKit; - }; - CB95419225660B8F00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB95418B25660B8F00E34129 /* BoostBLEKit.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = "BoostBLEKit::BoostBLEKitTests::Product"; - remoteInfo = BoostBLEKitTests; - }; - CB9541A125660B9C00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB95419625660B9C00E34129 /* ReSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 625E66831C1FF97E0027C288; - remoteInfo = "ReSwift-iOS"; - }; - CB9541A325660B9C00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB95419625660B9C00E34129 /* ReSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 625E669A1C1FFA3C0027C288; - remoteInfo = "ReSwift-iOSTests"; - }; - CB9541A525660B9C00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB95419625660B9C00E34129 /* ReSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 25DBCF7B1C30C4AA00D63A58; - remoteInfo = "ReSwift-macOS"; - }; - CB9541A725660B9C00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB95419625660B9C00E34129 /* ReSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 25DBCF871C30C4DB00D63A58; - remoteInfo = "ReSwift-macOSTests"; - }; - CB9541A925660B9C00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB95419625660B9C00E34129 /* ReSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 25DBCF4E1C30C18D00D63A58; - remoteInfo = "ReSwift-tvOS"; - }; - CB9541AB25660B9C00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB95419625660B9C00E34129 /* ReSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 25DBCF641C30C1AC00D63A58; - remoteInfo = "ReSwift-tvOSTests"; - }; - CB9541AD25660B9C00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB95419625660B9C00E34129 /* ReSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 25DBCF371C30BF2B00D63A58; - remoteInfo = "ReSwift-watchOS"; - }; - CB9541AF25660B9C00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB95419625660B9C00E34129 /* ReSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3F13C0E81E7B3E4000D8442C; - remoteInfo = SwiftLintIntegration; - }; - CB9541C325660BAE00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB9541B925660BAE00E34129 /* ReactiveSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D04725EA19E49ED7006002AA; - remoteInfo = "ReactiveSwift-macOS"; - }; - CB9541C525660BAE00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB9541B925660BAE00E34129 /* ReactiveSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D04725F519E49ED7006002AA; - remoteInfo = "ReactiveSwift-macOSTests"; - }; - CB9541C725660BAE00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB9541B925660BAE00E34129 /* ReactiveSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D047260C19E49F82006002AA; - remoteInfo = "ReactiveSwift-iOS"; - }; - CB9541C925660BAE00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB9541B925660BAE00E34129 /* ReactiveSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = D047261619E49F82006002AA; - remoteInfo = "ReactiveSwift-iOSTests"; - }; - CB9541CB25660BAE00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB9541B925660BAE00E34129 /* ReactiveSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = A9B315541B3940610001CB9C; - remoteInfo = "ReactiveSwift-watchOS"; - }; - CB9541CD25660BAE00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB9541B925660BAE00E34129 /* ReactiveSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 57A4D2411BA13D7A00F7D4B1; - remoteInfo = "ReactiveSwift-tvOS"; - }; - CB9541CF25660BAE00E34129 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = CB9541B925660BAE00E34129 /* ReactiveSwift.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 7DFBED031CDB8C9500EE435B; - remoteInfo = "ReactiveSwift-tvOSTests"; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ CB3BE8CB1F2FF3AC000561F7 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; @@ -169,9 +45,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - CB9541DC25660BCD00E34129 /* ReSwift.framework in Embed Frameworks */, - CB9541D825660BCD00E34129 /* BoostBLEKit.framework in Embed Frameworks */, - CB9541DA25660BCD00E34129 /* ReactiveSwift.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -179,6 +52,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + C4B587A82F7860080093A4E8 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; CB0BF7E41F8BD873004CCD4F /* VerticalSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticalSlider.swift; sourceTree = ""; }; CB0BF7E61F8BDD30004CCD4F /* StickView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StickView.swift; sourceTree = ""; }; CB2276C4236C292A008C1307 /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; @@ -200,9 +74,6 @@ CB7390C8201AB89900EAE3A7 /* UIImage+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Extension.swift"; sourceTree = ""; }; CB84A381201BA3D300C02CD8 /* JoystickView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoystickView.swift; sourceTree = ""; }; CB8C7EB3201FEF6500274A09 /* SettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; - CB95418B25660B8F00E34129 /* BoostBLEKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = BoostBLEKit.xcodeproj; path = Carthage/Checkouts/BoostBLEKit/BoostBLEKit.xcodeproj; sourceTree = ""; }; - CB95419625660B9C00E34129 /* ReSwift.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReSwift.xcodeproj; path = Carthage/Checkouts/ReSwift/ReSwift.xcodeproj; sourceTree = ""; }; - CB9541B925660BAE00E34129 /* ReactiveSwift.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactiveSwift.xcodeproj; path = Carthage/Checkouts/ReactiveSwift/ReactiveSwift.xcodeproj; sourceTree = ""; }; CBC72DF9201AC35C00ABE096 /* Controller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Controller.swift; sourceTree = ""; }; CBD94E831F391B3F0037ED71 /* State.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = State.swift; sourceTree = ""; }; CBD94E851F391D7F0037ED71 /* Action.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Action.swift; sourceTree = ""; }; @@ -220,9 +91,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - CB9541DB25660BCD00E34129 /* ReSwift.framework in Frameworks */, - CB9541D725660BCD00E34129 /* BoostBLEKit.framework in Frameworks */, - CB9541D925660BCD00E34129 /* ReactiveSwift.framework in Frameworks */, + C4CB52E92DD8F5AB00339F90 /* BoostBLEKit in Frameworks */, + C4CB52EF2DD8FC2000339F90 /* ReactiveSwift in Frameworks */, + C4CB52EC2DD8FB2500339F90 /* ReSwift in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -234,7 +105,6 @@ children = ( CB3BE8AF1F2FF2F4000561F7 /* BoostRemote */, CB3BE8AE1F2FF2F4000561F7 /* Products */, - CB95418A25660B7800E34129 /* Carthage */, ); sourceTree = ""; }; @@ -250,6 +120,7 @@ isa = PBXGroup; children = ( CB3BE8B01F2FF2F4000561F7 /* AppDelegate.swift */, + C4B587A82F7860080093A4E8 /* SceneDelegate.swift */, CB3BE8B41F2FF2F4000561F7 /* Main.storyboard */, CB8C7EB3201FEF6500274A09 /* SettingsViewController.swift */, CB3BE8B21F2FF2F4000561F7 /* ControllerViewController.swift */, @@ -276,54 +147,6 @@ path = BoostRemote; sourceTree = ""; }; - CB95418A25660B7800E34129 /* Carthage */ = { - isa = PBXGroup; - children = ( - CB95418B25660B8F00E34129 /* BoostBLEKit.xcodeproj */, - CB9541B925660BAE00E34129 /* ReactiveSwift.xcodeproj */, - CB95419625660B9C00E34129 /* ReSwift.xcodeproj */, - ); - name = Carthage; - sourceTree = ""; - }; - CB95418C25660B8F00E34129 /* Products */ = { - isa = PBXGroup; - children = ( - CB95419125660B8F00E34129 /* BoostBLEKit.framework */, - CB95419325660B8F00E34129 /* BoostBLEKitTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - CB95419725660B9C00E34129 /* Products */ = { - isa = PBXGroup; - children = ( - CB9541A225660B9C00E34129 /* ReSwift.framework */, - CB9541A425660B9C00E34129 /* ReSwift-iOSTests.xctest */, - CB9541A625660B9C00E34129 /* ReSwift.framework */, - CB9541A825660B9C00E34129 /* ReSwift-macOSTests.xctest */, - CB9541AA25660B9C00E34129 /* ReSwift.framework */, - CB9541AC25660B9C00E34129 /* ReSwift-tvOSTests.xctest */, - CB9541AE25660B9C00E34129 /* ReSwift.framework */, - CB9541B025660B9C00E34129 /* SwiftLintIntegration.xctest */, - ); - name = Products; - sourceTree = ""; - }; - CB9541BA25660BAE00E34129 /* Products */ = { - isa = PBXGroup; - children = ( - CB9541C425660BAE00E34129 /* ReactiveSwift.framework */, - CB9541C625660BAE00E34129 /* ReactiveSwiftTests.xctest */, - CB9541C825660BAE00E34129 /* ReactiveSwift.framework */, - CB9541CA25660BAE00E34129 /* ReactiveSwiftTests.xctest */, - CB9541CC25660BAE00E34129 /* ReactiveSwift.framework */, - CB9541CE25660BAE00E34129 /* ReactiveSwift.framework */, - CB9541D025660BAE00E34129 /* ReactiveSwiftTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; CBF9D2D81F3CB63300B97E11 /* Redux */ = { isa = PBXGroup; children = ( @@ -353,6 +176,9 @@ ); name = BoostRemote; packageProductDependencies = ( + C4CB52E82DD8F5AB00339F90 /* BoostBLEKit */, + C4CB52EB2DD8FB2500339F90 /* ReSwift */, + C4CB52EE2DD8FC2000339F90 /* ReactiveSwift */, ); productName = BoostRemote; productReference = CB3BE8AD1F2FF2F4000561F7 /* BoostRemote.app */; @@ -364,13 +190,13 @@ CB3BE8A51F2FF2F4000561F7 /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 1220; + LastUpgradeCheck = 1630; ORGANIZATIONNAME = bricklife.com; TargetAttributes = { CB3BE8AC1F2FF2F4000561F7 = { CreatedOnToolsVersion = 8.3.3; - DevelopmentTeam = UV6TAX3ANB; LastSwiftMigration = 1020; ProvisioningStyle = Automatic; }; @@ -388,23 +214,12 @@ ); mainGroup = CB3BE8A41F2FF2F4000561F7; packageReferences = ( + C4CB52E72DD8F5AB00339F90 /* XCRemoteSwiftPackageReference "BoostBLEKit" */, + C4CB52EA2DD8FB2500339F90 /* XCRemoteSwiftPackageReference "ReSwift" */, + C4CB52ED2DD8FC2000339F90 /* XCRemoteSwiftPackageReference "ReactiveSwift" */, ); productRefGroup = CB3BE8AE1F2FF2F4000561F7 /* Products */; projectDirPath = ""; - projectReferences = ( - { - ProductGroup = CB95418C25660B8F00E34129 /* Products */; - ProjectRef = CB95418B25660B8F00E34129 /* BoostBLEKit.xcodeproj */; - }, - { - ProductGroup = CB9541BA25660BAE00E34129 /* Products */; - ProjectRef = CB9541B925660BAE00E34129 /* ReactiveSwift.xcodeproj */; - }, - { - ProductGroup = CB95419725660B9C00E34129 /* Products */; - ProjectRef = CB95419625660B9C00E34129 /* ReSwift.xcodeproj */; - }, - ); projectRoot = ""; targets = ( CB3BE8AC1F2FF2F4000561F7 /* BoostRemote */, @@ -412,128 +227,6 @@ }; /* End PBXProject section */ -/* Begin PBXReferenceProxy section */ - CB95419125660B8F00E34129 /* BoostBLEKit.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = BoostBLEKit.framework; - remoteRef = CB95419025660B8F00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB95419325660B8F00E34129 /* BoostBLEKitTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = BoostBLEKitTests.xctest; - remoteRef = CB95419225660B8F00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541A225660B9C00E34129 /* ReSwift.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ReSwift.framework; - remoteRef = CB9541A125660B9C00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541A425660B9C00E34129 /* ReSwift-iOSTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ReSwift-iOSTests.xctest"; - remoteRef = CB9541A325660B9C00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541A625660B9C00E34129 /* ReSwift.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ReSwift.framework; - remoteRef = CB9541A525660B9C00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541A825660B9C00E34129 /* ReSwift-macOSTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ReSwift-macOSTests.xctest"; - remoteRef = CB9541A725660B9C00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541AA25660B9C00E34129 /* ReSwift.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ReSwift.framework; - remoteRef = CB9541A925660B9C00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541AC25660B9C00E34129 /* ReSwift-tvOSTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = "ReSwift-tvOSTests.xctest"; - remoteRef = CB9541AB25660B9C00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541AE25660B9C00E34129 /* ReSwift.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ReSwift.framework; - remoteRef = CB9541AD25660B9C00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541B025660B9C00E34129 /* SwiftLintIntegration.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = SwiftLintIntegration.xctest; - remoteRef = CB9541AF25660B9C00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541C425660BAE00E34129 /* ReactiveSwift.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ReactiveSwift.framework; - remoteRef = CB9541C325660BAE00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541C625660BAE00E34129 /* ReactiveSwiftTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = ReactiveSwiftTests.xctest; - remoteRef = CB9541C525660BAE00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541C825660BAE00E34129 /* ReactiveSwift.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ReactiveSwift.framework; - remoteRef = CB9541C725660BAE00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541CA25660BAE00E34129 /* ReactiveSwiftTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = ReactiveSwiftTests.xctest; - remoteRef = CB9541C925660BAE00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541CC25660BAE00E34129 /* ReactiveSwift.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ReactiveSwift.framework; - remoteRef = CB9541CB25660BAE00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541CE25660BAE00E34129 /* ReactiveSwift.framework */ = { - isa = PBXReferenceProxy; - fileType = wrapper.framework; - path = ReactiveSwift.framework; - remoteRef = CB9541CD25660BAE00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - CB9541D025660BAE00E34129 /* ReactiveSwiftTests.xctest */ = { - isa = PBXReferenceProxy; - fileType = wrapper.cfbundle; - path = ReactiveSwiftTests.xctest; - remoteRef = CB9541CF25660BAE00E34129 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - /* Begin PBXResourcesBuildPhase section */ CB3BE8AB1F2FF2F4000561F7 /* Resources */ = { isa = PBXResourcesBuildPhase; @@ -570,6 +263,7 @@ CB70D813201A82D500EAB1D6 /* FeedbackGenerator.swift in Sources */, CBF9D2F61F3CDAC700B97E11 /* Data+HexString.swift in Sources */, CB44B8531F73C11400D0D250 /* Store.swift in Sources */, + C4B587A92F7860080093A4E8 /* SceneDelegate.swift in Sources */, CBD94E881F391E2E0037ED71 /* Reducer.swift in Sources */, CB84A382201BA3D300C02CD8 /* JoystickView.swift in Sources */, CBD94E841F391B3F0037ED71 /* State.swift in Sources */, @@ -654,8 +348,10 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 8G7W6WCEM9; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -670,7 +366,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -716,8 +412,10 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 8G7W6WCEM9; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -726,10 +424,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -739,12 +438,14 @@ CB3BE8C01F2FF2F4000561F7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 32; - DEVELOPMENT_TEAM = UV6TAX3ANB; INFOPLIST_FILE = BoostRemote/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MARKETING_VERSION = 1.9.3; PRODUCT_BUNDLE_IDENTIFIER = "com.bricklife.ios.boost-remote"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -755,12 +456,14 @@ CB3BE8C11F2FF2F4000561F7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 32; - DEVELOPMENT_TEAM = UV6TAX3ANB; INFOPLIST_FILE = BoostRemote/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.6; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MARKETING_VERSION = 1.9.3; PRODUCT_BUNDLE_IDENTIFIER = "com.bricklife.ios.boost-remote"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -790,6 +493,51 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + C4CB52E72DD8F5AB00339F90 /* XCRemoteSwiftPackageReference "BoostBLEKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/bricklife/BoostBLEKit"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.5.0; + }; + }; + C4CB52EA2DD8FB2500339F90 /* XCRemoteSwiftPackageReference "ReSwift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/ReSwift/ReSwift.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 6.1.1; + }; + }; + C4CB52ED2DD8FC2000339F90 /* XCRemoteSwiftPackageReference "ReactiveSwift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/ReactiveCocoa/ReactiveSwift.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 7.2.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + C4CB52E82DD8F5AB00339F90 /* BoostBLEKit */ = { + isa = XCSwiftPackageProductDependency; + package = C4CB52E72DD8F5AB00339F90 /* XCRemoteSwiftPackageReference "BoostBLEKit" */; + productName = BoostBLEKit; + }; + C4CB52EB2DD8FB2500339F90 /* ReSwift */ = { + isa = XCSwiftPackageProductDependency; + package = C4CB52EA2DD8FB2500339F90 /* XCRemoteSwiftPackageReference "ReSwift" */; + productName = ReSwift; + }; + C4CB52EE2DD8FC2000339F90 /* ReactiveSwift */ = { + isa = XCSwiftPackageProductDependency; + package = C4CB52ED2DD8FC2000339F90 /* XCRemoteSwiftPackageReference "ReactiveSwift" */; + productName = ReactiveSwift; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = CB3BE8A51F2FF2F4000561F7 /* Project object */; } diff --git a/BoostRemote.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/BoostRemote.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..68b97a3 --- /dev/null +++ b/BoostRemote.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,33 @@ +{ + "originHash" : "d2eee35226cbaab39458ca9ae41a6aec0331ace399f1173bf8b3d458c48f4e22", + "pins" : [ + { + "identity" : "boostblekit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/bricklife/BoostBLEKit", + "state" : { + "revision" : "04f0cb8284adbf972e19b93def9b23a1d98692be", + "version" : "3.5.0" + } + }, + { + "identity" : "reactiveswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReactiveCocoa/ReactiveSwift.git", + "state" : { + "revision" : "c5eecb5374ac342e22d46abd333e4c8c698c93cc", + "version" : "7.2.0" + } + }, + { + "identity" : "reswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/ReSwift/ReSwift.git", + "state" : { + "revision" : "cb5c3c02f652420ef413dea41e13ac5a76b6c0fd", + "version" : "6.1.1" + } + } + ], + "version" : 3 +} diff --git a/BoostRemote/Action.swift b/BoostRemote/Action.swift index d22ab61..87335d6 100644 --- a/BoostRemote/Action.swift +++ b/BoostRemote/Action.swift @@ -30,6 +30,7 @@ enum SettingsAction: Action { case step(SettingsState.Step) case mode(SettingsState.Mode) case direction(BoostBLEKit.Port, Bool) + case switchLeftRight(Bool) } struct ActionCenter { diff --git a/BoostRemote/AppDelegate.swift b/BoostRemote/AppDelegate.swift index 950327c..9ce65d0 100644 --- a/BoostRemote/AppDelegate.swift +++ b/BoostRemote/AppDelegate.swift @@ -11,14 +11,9 @@ import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { MoveHubManager.shared.start() - window?.tintColor = .tint - return true } diff --git a/BoostRemote/Base.lproj/Main.storyboard b/BoostRemote/Base.lproj/Main.storyboard index 9339f41..7f94a40 100644 --- a/BoostRemote/Base.lproj/Main.storyboard +++ b/BoostRemote/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - - + + - + @@ -13,11 +13,11 @@ - + - + - + - + - + @@ -58,7 +58,7 @@ + @@ -83,7 +84,6 @@ - @@ -101,21 +101,21 @@ - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -166,7 +199,7 @@ diff --git a/BoostRemote/ControllerViewController.swift b/BoostRemote/ControllerViewController.swift index 8f2f30c..4f1789d 100644 --- a/BoostRemote/ControllerViewController.swift +++ b/BoostRemote/ControllerViewController.swift @@ -70,16 +70,17 @@ class ControllerViewController: UIViewController { } private func setupSticks() { + for controller in controllers { for (port, signal) in controller.signals { signal .withLatest(from: settingsState.signal.map { $0.step }) .map { (value: Double, step: Double) in Int8(round(value * step) * 100 / step) } .skipRepeats() - .withLatest(from: settingsState.signal.map { $0.directions[port] ?? true }) + .withLatest(from: settingsState.signal.map { $0.directions[port, default: true] }) .map { (power: Int8, direction: Bool) in direction ? power : -power } .observeValues { [weak self] (value) in - self?.sendStartPowerCommand(port: port, power: value) + self?.sendCommand(port: port, power: value) } } } @@ -89,7 +90,18 @@ class ControllerViewController: UIViewController { self?.twinSticksView.isHidden = state.mode != .twinsticks } } - + + private func sendCommand(port: BoostBLEKit.Port, power: Int8) { + let switchedLR = settingsState.value.switchedLR + let commandPort: BoostBLEKit.Port + if switchedLR && [.A, .B].contains(port) { + commandPort = (port == .A) ? .B : .A + } else { + commandPort = port + } + self.sendStartPowerCommand(port: commandPort, power: power) + } + private var timers: [BoostBLEKit.Port: Timer] = [:] private var waitingCommands: [BoostBLEKit.Port: Command] = [:] diff --git a/BoostRemote/Info.plist b/BoostRemote/Info.plist index fb4766f..a97a2b7 100644 --- a/BoostRemote/Info.plist +++ b/BoostRemote/Info.plist @@ -53,5 +53,24 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + diff --git a/BoostRemote/MoveHubManager.swift b/BoostRemote/MoveHubManager.swift index 98fe77e..faed0cd 100644 --- a/BoostRemote/MoveHubManager.swift +++ b/BoostRemote/MoveHubManager.swift @@ -15,8 +15,8 @@ class MoveHubManager: NSObject { static let shared = MoveHubManager() - private var centralManager: CBCentralManager! - + private var centralManager: CBCentralManager? + private var peripheral: CBPeripheral? private var characteristic: CBCharacteristic? @@ -32,18 +32,21 @@ class MoveHubManager: NSObject { } func startScan() { + guard let centralManager else { return } if centralManager.state == .poweredOn { centralManager.scanForPeripherals(withServices: [MoveHubService.serviceUuid], options: nil) } } func stopScan() { + guard let centralManager else { return } centralManager.stopScan() } func connect(peripheral: CBPeripheral, advertisementData: [String : Any]) -> Bool { + guard let centralManager else { return false } guard self.peripheral == nil else { return false } - + guard let manufacturerData = advertisementData["kCBAdvDataManufacturerData"] as? Data else { return false } guard let hubType = HubType(manufacturerData: manufacturerData) else { return false } diff --git a/BoostRemote/Reducer.swift b/BoostRemote/Reducer.swift index 11e5c8f..6c17bbe 100644 --- a/BoostRemote/Reducer.swift +++ b/BoostRemote/Reducer.swift @@ -72,6 +72,8 @@ struct Reducer { state.step = step case .mode(let mode): state.mode = mode + case .switchLeftRight(let switchedLR): + state.switchedLR = switchedLR case .direction(let port, let direction): state.directions[port] = direction } diff --git a/BoostRemote/SceneDelegate.swift b/BoostRemote/SceneDelegate.swift new file mode 100644 index 0000000..7c2b3a2 --- /dev/null +++ b/BoostRemote/SceneDelegate.swift @@ -0,0 +1,55 @@ +// SceneDelegate.swift +// +// Created by Bob Wakefield on 3/28/26. +// for BoostRemote +// +// Using Swift 6.0 +// Running on macOS 26.3 +// +// Copyright © 2026 bricklife.com. All rights reserved. +// + +import UIKit + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. + // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. + // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + guard let _ = (scene as? UIWindowScene) else { return } + } + + func sceneDidDisconnect(_ scene: UIScene) { + // Called as the scene is being released by the system. + // This occurs shortly after the scene enters the background, or when its session is discarded. + // Release any resources associated with this scene that can be re-created the next time the scene connects. + // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). + } + + func sceneDidBecomeActive(_ scene: UIScene) { + // Called when the scene has moved from an inactive state to an active state. + // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. + } + + func sceneWillResignActive(_ scene: UIScene) { + // Called when the scene will move from an active state to an inactive state. + // This may occur due to temporary interruptions (ex. an incoming phone call). + } + + func sceneWillEnterForeground(_ scene: UIScene) { + // Called as the scene transitions from the background to the foreground. + // Use this method to undo the changes made on entering the background. + } + + func sceneDidEnterBackground(_ scene: UIScene) { + // Called as the scene transitions from the foreground to the background. + // Use this method to save data, release shared resources, and store enough scene-specific state information + // to restore the scene back to its current state. + } +} + diff --git a/BoostRemote/SettingsViewController.swift b/BoostRemote/SettingsViewController.swift index 336613d..792bd6b 100644 --- a/BoostRemote/SettingsViewController.swift +++ b/BoostRemote/SettingsViewController.swift @@ -18,7 +18,9 @@ class SettingsViewController: UITableViewController { @IBOutlet private weak var portBSegmentedControl: UISegmentedControl! @IBOutlet private weak var portCSegmentedControl: UISegmentedControl! @IBOutlet private weak var portDSegmentedControl: UISegmentedControl! - + + @IBOutlet private weak var switchABSegmentControl: UISegmentedControl! + @IBOutlet private weak var step1Cell: UITableViewCell! @IBOutlet private weak var step2Cell: UITableViewCell! @IBOutlet private weak var step5Cell: UITableViewCell! @@ -64,7 +66,11 @@ class SettingsViewController: UITableViewController { tableView.deselectRow(at: indexPath, animated: true) } - + + @IBAction func switchLeftRight(_ sender: UISegmentedControl) { + StoreCenter.store.dispatch(SettingsAction.switchLeftRight(sender.selectedSegmentIndex != 0)) + } + @IBAction func directionChanged(_ sender: UISegmentedControl) { let direction = sender.selectedSegmentIndex == 1 switch sender { @@ -89,7 +95,8 @@ extension SettingsViewController: StoreSubscriber { joystickModeCell.accessoryType = (settings.mode == .joystick) ? .checkmark : .none twinsticksModeCell.accessoryType = (settings.mode == .twinsticks) ? .checkmark : .none - + switchABSegmentControl.selectedSegmentIndex = settings.switchedLR ? 1 : 0 + step1Cell.accessoryType = (settings.step == 1) ? .checkmark : .none step2Cell.accessoryType = (settings.step == 2) ? .checkmark : .none step5Cell.accessoryType = (settings.step == 5) ? .checkmark : .none @@ -99,7 +106,7 @@ extension SettingsViewController: StoreSubscriber { portBSegmentedControl.selectedSegmentIndex = (settings.directions[.B] ?? true) ? 1 : 0 portCSegmentedControl.selectedSegmentIndex = (settings.directions[.C] ?? true) ? 1 : 0 portDSegmentedControl.selectedSegmentIndex = (settings.directions[.D] ?? true) ? 1 : 0 - + settingsState = settings } } diff --git a/BoostRemote/State.swift b/BoostRemote/State.swift index f7601b0..3404801 100644 --- a/BoostRemote/State.swift +++ b/BoostRemote/State.swift @@ -50,10 +50,12 @@ struct SettingsState { } } var directions: [BoostBLEKit.Port: Bool] + var switchedLR: Bool init() { self.mode = .joystick self.step = 5 self.directions = [.A: true, .B: true, .C: true, .D: true] + self.switchedLR = false } } diff --git a/BoostRemote/Store.swift b/BoostRemote/Store.swift index bd292fc..de1aed1 100644 --- a/BoostRemote/Store.swift +++ b/BoostRemote/Store.swift @@ -37,6 +37,8 @@ struct StoreCenter { settingsState.mode = mode } + settingsState.switchedLR = UserDefaults.standard.bool(forKey: "switchedLR") + if let step = UserDefaults.standard.object(forKey: "step") as? SettingsState.Step { settingsState.step = step } @@ -55,6 +57,7 @@ struct StoreCenter { func save(state: State) { UserDefaults.standard.set(state.settingsState.mode.rawValue, forKey: "mode") + UserDefaults.standard.set(state.settingsState.switchedLR, forKey: "switchedLR") UserDefaults.standard.set(state.settingsState.step, forKey: "step") for (port, direction) in state.settingsState.directions { let key = "direction-\(port)" diff --git a/Cartfile b/Cartfile deleted file mode 100644 index 9b2b6ba..0000000 --- a/Cartfile +++ /dev/null @@ -1,3 +0,0 @@ -github "bricklife/BoostBLEKit" -github "ReactiveCocoa/ReactiveSwift" -github "ReSwift/ReSwift" diff --git a/Cartfile.resolved b/Cartfile.resolved deleted file mode 100644 index 4a69d83..0000000 --- a/Cartfile.resolved +++ /dev/null @@ -1,3 +0,0 @@ -github "ReSwift/ReSwift" "6.1.0" -github "ReactiveCocoa/ReactiveSwift" "6.7.0" -github "bricklife/BoostBLEKit" "3.5.0" diff --git a/Carthage/Checkouts/BoostBLEKit b/Carthage/Checkouts/BoostBLEKit deleted file mode 160000 index 04f0cb8..0000000 --- a/Carthage/Checkouts/BoostBLEKit +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 04f0cb8284adbf972e19b93def9b23a1d98692be diff --git a/Carthage/Checkouts/ReSwift b/Carthage/Checkouts/ReSwift deleted file mode 160000 index 96146a2..0000000 --- a/Carthage/Checkouts/ReSwift +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 96146a29f394ae4c79be025fcec194e5b0d9c3b6 diff --git a/Carthage/Checkouts/ReactiveSwift b/Carthage/Checkouts/ReactiveSwift deleted file mode 160000 index c43bae3..0000000 --- a/Carthage/Checkouts/ReactiveSwift +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c43bae3dac73fdd3cb906bd5a1914686ca71ed3c