snapshot current state before gitea sync
8
.claude/settings.local.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Bash(xcodegen generate:*)",
|
||||||
|
"Bash(xcodebuild build:*)"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import XCTest
|
|
||||||
@testable import CoopRunning
|
|
||||||
|
|
||||||
final class CoopRunningTests: XCTestCase {
|
|
||||||
func testLibraryLoads() {
|
|
||||||
let library = LocalTrack.loadLibrary()
|
|
||||||
XCTAssertNotNil(library)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
# CoopRunning Sync (MVP)
|
# Run+ Sync (MVP)
|
||||||
|
|
||||||
This is a minimal SwiftUI + MultipeerConnectivity prototype to sync **local MP3 playback** across iPhones. One device hosts and controls playback; peers join, receive the track file, and then sync playback.
|
This is a minimal SwiftUI + MultipeerConnectivity prototype to sync **local MP3 playback** across iPhones. One device hosts and controls playback; peers join, receive the track file, and then sync playback.
|
||||||
|
|
||||||
## Setup (Xcode)
|
## Setup (Xcode)
|
||||||
1. Create a new iOS App project in Xcode (SwiftUI, iOS 17+ or latest).
|
1. Create a new iOS App project in Xcode (SwiftUI, iOS 17+ or latest).
|
||||||
2. Replace the generated Swift files with the files in `CoopRunning/`.
|
2. Replace the generated Swift files with the files in `RunPlus/`.
|
||||||
3. Add these keys to your app's `Info.plist`:
|
3. Add these keys to your app's `Info.plist`:
|
||||||
- `NSLocalNetworkUsageDescription` = "Sync audio with nearby runners"
|
- `NSLocalNetworkUsageDescription` = "Sync audio with nearby runners"
|
||||||
- `NSBonjourServices` (Array) with `_cooprun-sync._tcp`
|
- `NSBonjourServices` (Array) with `_runplus-sync._tcp`
|
||||||
- `NSBluetoothAlwaysUsageDescription` = "Find nearby runners"
|
- `NSBluetoothAlwaysUsageDescription` = "Find nearby runners"
|
||||||
|
|
||||||
## How It Works
|
## How It Works
|
||||||
|
|||||||
@@ -7,150 +7,150 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
1C5A896A43530D81174546BA /* CoopRunningTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7972CAD1B5B5FB6F3CBB4DC /* CoopRunningTests.swift */; };
|
156C160DF778F27C79A17FE5 /* RunPlusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04BCDAE10A279FB302BB43BB /* RunPlusTests.swift */; };
|
||||||
2DDFF6B9DA48824AB7E348F4 /* SessionMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 989EE81E50A74AADB156B2F1 /* SessionMessage.swift */; };
|
2F3EACD00BDE74F3B8E910EA /* LocalTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C121924B17207A853051208 /* LocalTrack.swift */; };
|
||||||
4CC684E41D1241CE42FD7348 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0C06EA24EED7898D3555276 /* ContentView.swift */; };
|
6045F7A89ED35EFF6E1492BC /* SessionMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61EAEDFD4F6880835E95D55B /* SessionMessage.swift */; };
|
||||||
5A81A364169B5FCD120F61FC /* PeerSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02763B5D5452C1CC1B93FD2B /* PeerSession.swift */; };
|
6115B8D560B77DC3A4D41F20 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FC6EEC5ABFC1AF6F5E370955 /* Assets.xcassets */; };
|
||||||
7D7B85F058BAFB619CCCE687 /* SyncClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E882038912A0EC724092D5C /* SyncClock.swift */; };
|
A599EACFD1739CD8B6B74BD6 /* AppModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B51D24578D9AFC6F460328F /* AppModel.swift */; };
|
||||||
8CB2509F6A60D8C785CD8F5F /* CoopRunningApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF044E360A40EA66C3AFE6AB /* CoopRunningApp.swift */; };
|
BE5EFEFBD637CB82A50B2233 /* AudioPlayerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB42CA625F6C53318B48146F /* AudioPlayerController.swift */; };
|
||||||
A0AA73D0AF4BDA2998897899 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 62CACEE84EEBE1E90C04433F /* LaunchScreen.storyboard */; };
|
C0C75478F495F054AD95F704 /* PeerSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F60C22FCD67282CDE8022C1 /* PeerSession.swift */; };
|
||||||
A7E26605A0C2D722889DC978 /* AudioPlayerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3135CEE034E1997695E141E /* AudioPlayerController.swift */; };
|
DD588F2D6B2FEBC85ED5A55E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 548B11CCD7661F41B1B40FC6 /* ContentView.swift */; };
|
||||||
BE79C4ECF76C74CA638B5E71 /* AppModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE69B1849CC70C66B4408E8D /* AppModel.swift */; };
|
E918E7220DF266B8507D14F2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1BF55753772F8B16D9D3C771 /* LaunchScreen.storyboard */; };
|
||||||
D3F24682D211B5C8C703480A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0570D4F6BB0BB408E8A9A864 /* Assets.xcassets */; };
|
EE997CA26C6822FF70E7EC50 /* SyncClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 225E3A199DA434E89F5184DB /* SyncClock.swift */; };
|
||||||
FBAD30B2745B7850ADC0BD10 /* LocalTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82B84A69F8BDB61FB49066A1 /* LocalTrack.swift */; };
|
F5BE435072E6FEE8D2C1E14D /* RunPlusApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8102076B5C48A26C6B1DDC68 /* RunPlusApp.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
D6C6FD151E41BF7E8F592C82 /* PBXContainerItemProxy */ = {
|
3B17CA897B21DAE8997359BB /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = 45108C7370BA21AEC5D4E16A /* Project object */;
|
containerPortal = B994AC409B01DDDD340C5845 /* Project object */;
|
||||||
proxyType = 1;
|
proxyType = 1;
|
||||||
remoteGlobalIDString = 6D8086D1FAEE224EF0BE91DB;
|
remoteGlobalIDString = 5C2F99C6F3AFB5DA6199A4A1;
|
||||||
remoteInfo = CoopRunning;
|
remoteInfo = RunPlus;
|
||||||
};
|
};
|
||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
02763B5D5452C1CC1B93FD2B /* PeerSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerSession.swift; sourceTree = "<group>"; };
|
04BCDAE10A279FB302BB43BB /* RunPlusTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunPlusTests.swift; sourceTree = "<group>"; };
|
||||||
0570D4F6BB0BB408E8A9A864 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
1BF55753772F8B16D9D3C771 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
0E882038912A0EC724092D5C /* SyncClock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncClock.swift; sourceTree = "<group>"; };
|
225E3A199DA434E89F5184DB /* SyncClock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncClock.swift; sourceTree = "<group>"; };
|
||||||
62CACEE84EEBE1E90C04433F /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; };
|
548B11CCD7661F41B1B40FC6 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||||
642EFFBEF3D3144895D7F64A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
5F60C22FCD67282CDE8022C1 /* PeerSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeerSession.swift; sourceTree = "<group>"; };
|
||||||
82B84A69F8BDB61FB49066A1 /* LocalTrack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalTrack.swift; sourceTree = "<group>"; };
|
61EAEDFD4F6880835E95D55B /* SessionMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionMessage.swift; sourceTree = "<group>"; };
|
||||||
955DE601980D43FC20175212 /* CoopRunningTests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = CoopRunningTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
6B51D24578D9AFC6F460328F /* AppModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppModel.swift; sourceTree = "<group>"; };
|
||||||
989EE81E50A74AADB156B2F1 /* SessionMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionMessage.swift; sourceTree = "<group>"; };
|
76A1F7156ED86F810D6BC595 /* RunPlusTests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = RunPlusTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
A0C06EA24EED7898D3555276 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
7C121924B17207A853051208 /* LocalTrack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalTrack.swift; sourceTree = "<group>"; };
|
||||||
B7972CAD1B5B5FB6F3CBB4DC /* CoopRunningTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoopRunningTests.swift; sourceTree = "<group>"; };
|
8102076B5C48A26C6B1DDC68 /* RunPlusApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunPlusApp.swift; sourceTree = "<group>"; };
|
||||||
BE69B1849CC70C66B4408E8D /* AppModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppModel.swift; sourceTree = "<group>"; };
|
D5367D3BD526DC39625C926B /* RunPlus.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = RunPlus.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
E3135CEE034E1997695E141E /* AudioPlayerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioPlayerController.swift; sourceTree = "<group>"; };
|
FB42CA625F6C53318B48146F /* AudioPlayerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioPlayerController.swift; sourceTree = "<group>"; };
|
||||||
ED1954343D7F24F4CE237989 /* CoopRunning.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = CoopRunning.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
FC6EEC5ABFC1AF6F5E370955 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
FF044E360A40EA66C3AFE6AB /* CoopRunningApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoopRunningApp.swift; sourceTree = "<group>"; };
|
FEF92C3E8A9DE5401F78BC82 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
0BCFD2D05DA713EECDE3A555 /* CoopRunning */ = {
|
28F7A30277F0012AB3487E15 /* Products */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
BE69B1849CC70C66B4408E8D /* AppModel.swift */,
|
D5367D3BD526DC39625C926B /* RunPlus.app */,
|
||||||
0570D4F6BB0BB408E8A9A864 /* Assets.xcassets */,
|
76A1F7156ED86F810D6BC595 /* RunPlusTests.xctest */,
|
||||||
E3135CEE034E1997695E141E /* AudioPlayerController.swift */,
|
|
||||||
A0C06EA24EED7898D3555276 /* ContentView.swift */,
|
|
||||||
FF044E360A40EA66C3AFE6AB /* CoopRunningApp.swift */,
|
|
||||||
642EFFBEF3D3144895D7F64A /* Info.plist */,
|
|
||||||
62CACEE84EEBE1E90C04433F /* LaunchScreen.storyboard */,
|
|
||||||
82B84A69F8BDB61FB49066A1 /* LocalTrack.swift */,
|
|
||||||
02763B5D5452C1CC1B93FD2B /* PeerSession.swift */,
|
|
||||||
989EE81E50A74AADB156B2F1 /* SessionMessage.swift */,
|
|
||||||
0E882038912A0EC724092D5C /* SyncClock.swift */,
|
|
||||||
);
|
|
||||||
path = CoopRunning;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
6F5BDF622927472CD32D0CD8 = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
0BCFD2D05DA713EECDE3A555 /* CoopRunning */,
|
|
||||||
927D95C70CE5ED7ADB2C3F20 /* CoopRunningTests */,
|
|
||||||
CBC491D93FB088E0E6148B1A /* Products */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
927D95C70CE5ED7ADB2C3F20 /* CoopRunningTests */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
B7972CAD1B5B5FB6F3CBB4DC /* CoopRunningTests.swift */,
|
|
||||||
);
|
|
||||||
path = CoopRunningTests;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
CBC491D93FB088E0E6148B1A /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
ED1954343D7F24F4CE237989 /* CoopRunning.app */,
|
|
||||||
955DE601980D43FC20175212 /* CoopRunningTests.xctest */,
|
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
6F346E56B2A585AA296F164F /* RunPlus */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
6B51D24578D9AFC6F460328F /* AppModel.swift */,
|
||||||
|
FC6EEC5ABFC1AF6F5E370955 /* Assets.xcassets */,
|
||||||
|
FB42CA625F6C53318B48146F /* AudioPlayerController.swift */,
|
||||||
|
548B11CCD7661F41B1B40FC6 /* ContentView.swift */,
|
||||||
|
FEF92C3E8A9DE5401F78BC82 /* Info.plist */,
|
||||||
|
1BF55753772F8B16D9D3C771 /* LaunchScreen.storyboard */,
|
||||||
|
7C121924B17207A853051208 /* LocalTrack.swift */,
|
||||||
|
5F60C22FCD67282CDE8022C1 /* PeerSession.swift */,
|
||||||
|
8102076B5C48A26C6B1DDC68 /* RunPlusApp.swift */,
|
||||||
|
61EAEDFD4F6880835E95D55B /* SessionMessage.swift */,
|
||||||
|
225E3A199DA434E89F5184DB /* SyncClock.swift */,
|
||||||
|
);
|
||||||
|
path = RunPlus;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
7A2EECCE69D919AAD7ECDDAB = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
6F346E56B2A585AA296F164F /* RunPlus */,
|
||||||
|
BCCE23592AD997519492634F /* RunPlusTests */,
|
||||||
|
28F7A30277F0012AB3487E15 /* Products */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
BCCE23592AD997519492634F /* RunPlusTests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
04BCDAE10A279FB302BB43BB /* RunPlusTests.swift */,
|
||||||
|
);
|
||||||
|
path = RunPlusTests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
6D8086D1FAEE224EF0BE91DB /* CoopRunning */ = {
|
5C2F99C6F3AFB5DA6199A4A1 /* RunPlus */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 5E860FBA956CBCBD03474441 /* Build configuration list for PBXNativeTarget "CoopRunning" */;
|
buildConfigurationList = FE58DB119F93CB8FCB3C5149 /* Build configuration list for PBXNativeTarget "RunPlus" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
D35AAFE1ED99AD91623FC374 /* Sources */,
|
BAAFDC05404E8AF42DA6E627 /* Sources */,
|
||||||
04C5D543DEB4F3CC401E7D42 /* Resources */,
|
886AB81AC1EDA136A589C3B8 /* Resources */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
);
|
);
|
||||||
name = CoopRunning;
|
name = RunPlus;
|
||||||
packageProductDependencies = (
|
packageProductDependencies = (
|
||||||
);
|
);
|
||||||
productName = CoopRunning;
|
productName = RunPlus;
|
||||||
productReference = ED1954343D7F24F4CE237989 /* CoopRunning.app */;
|
productReference = D5367D3BD526DC39625C926B /* RunPlus.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
};
|
};
|
||||||
7176FDC3954B3226DB5DEE48 /* CoopRunningTests */ = {
|
F407DEF9415CB11EF9A62BDD /* RunPlusTests */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 2322A6CDF4FC2AE59DD780B1 /* Build configuration list for PBXNativeTarget "CoopRunningTests" */;
|
buildConfigurationList = 19B80B19E7591F6011762D0C /* Build configuration list for PBXNativeTarget "RunPlusTests" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
A54C28822F541CFCD33553AE /* Sources */,
|
EC0BC2D44C8A66ADAF3023C5 /* Sources */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
6D8868D6D8F73E641CA58B0F /* PBXTargetDependency */,
|
1C54C143DF90D15B0BF852E1 /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = CoopRunningTests;
|
name = RunPlusTests;
|
||||||
packageProductDependencies = (
|
packageProductDependencies = (
|
||||||
);
|
);
|
||||||
productName = CoopRunningTests;
|
productName = RunPlusTests;
|
||||||
productReference = 955DE601980D43FC20175212 /* CoopRunningTests.xctest */;
|
productReference = 76A1F7156ED86F810D6BC595 /* RunPlusTests.xctest */;
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
};
|
};
|
||||||
/* End PBXNativeTarget section */
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
/* Begin PBXProject section */
|
||||||
45108C7370BA21AEC5D4E16A /* Project object */ = {
|
B994AC409B01DDDD340C5845 /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
BuildIndependentTargetsInParallel = YES;
|
BuildIndependentTargetsInParallel = YES;
|
||||||
LastUpgradeCheck = 1430;
|
LastUpgradeCheck = 1430;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
6D8086D1FAEE224EF0BE91DB = {
|
5C2F99C6F3AFB5DA6199A4A1 = {
|
||||||
DevelopmentTeam = NG5W75WE8U;
|
DevelopmentTeam = NG5W75WE8U;
|
||||||
ProvisioningStyle = Automatic;
|
ProvisioningStyle = Automatic;
|
||||||
};
|
};
|
||||||
7176FDC3954B3226DB5DEE48 = {
|
F407DEF9415CB11EF9A62BDD = {
|
||||||
DevelopmentTeam = NG5W75WE8U;
|
DevelopmentTeam = NG5W75WE8U;
|
||||||
ProvisioningStyle = Automatic;
|
ProvisioningStyle = Automatic;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
buildConfigurationList = 3BCFE323CCC2757AAFD6F452 /* Build configuration list for PBXProject "CoopRunning" */;
|
buildConfigurationList = CAC938FDE280688F31DE0CE4 /* Build configuration list for PBXProject "RunPlus" */;
|
||||||
compatibilityVersion = "Xcode 14.0";
|
compatibilityVersion = "Xcode 14.0";
|
||||||
developmentRegion = en;
|
developmentRegion = en;
|
||||||
hasScannedForEncodings = 0;
|
hasScannedForEncodings = 0;
|
||||||
@@ -158,66 +158,85 @@
|
|||||||
Base,
|
Base,
|
||||||
en,
|
en,
|
||||||
);
|
);
|
||||||
mainGroup = 6F5BDF622927472CD32D0CD8;
|
mainGroup = 7A2EECCE69D919AAD7ECDDAB;
|
||||||
minimizedProjectReferenceProxies = 1;
|
minimizedProjectReferenceProxies = 1;
|
||||||
preferredProjectObjectVersion = 77;
|
preferredProjectObjectVersion = 77;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
6D8086D1FAEE224EF0BE91DB /* CoopRunning */,
|
5C2F99C6F3AFB5DA6199A4A1 /* RunPlus */,
|
||||||
7176FDC3954B3226DB5DEE48 /* CoopRunningTests */,
|
F407DEF9415CB11EF9A62BDD /* RunPlusTests */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
04C5D543DEB4F3CC401E7D42 /* Resources */ = {
|
886AB81AC1EDA136A589C3B8 /* Resources */ = {
|
||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
D3F24682D211B5C8C703480A /* Assets.xcassets in Resources */,
|
6115B8D560B77DC3A4D41F20 /* Assets.xcassets in Resources */,
|
||||||
A0AA73D0AF4BDA2998897899 /* LaunchScreen.storyboard in Resources */,
|
E918E7220DF266B8507D14F2 /* LaunchScreen.storyboard in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
A54C28822F541CFCD33553AE /* Sources */ = {
|
BAAFDC05404E8AF42DA6E627 /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
1C5A896A43530D81174546BA /* CoopRunningTests.swift in Sources */,
|
A599EACFD1739CD8B6B74BD6 /* AppModel.swift in Sources */,
|
||||||
|
BE5EFEFBD637CB82A50B2233 /* AudioPlayerController.swift in Sources */,
|
||||||
|
DD588F2D6B2FEBC85ED5A55E /* ContentView.swift in Sources */,
|
||||||
|
2F3EACD00BDE74F3B8E910EA /* LocalTrack.swift in Sources */,
|
||||||
|
C0C75478F495F054AD95F704 /* PeerSession.swift in Sources */,
|
||||||
|
F5BE435072E6FEE8D2C1E14D /* RunPlusApp.swift in Sources */,
|
||||||
|
6045F7A89ED35EFF6E1492BC /* SessionMessage.swift in Sources */,
|
||||||
|
EE997CA26C6822FF70E7EC50 /* SyncClock.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
D35AAFE1ED99AD91623FC374 /* Sources */ = {
|
EC0BC2D44C8A66ADAF3023C5 /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
BE79C4ECF76C74CA638B5E71 /* AppModel.swift in Sources */,
|
156C160DF778F27C79A17FE5 /* RunPlusTests.swift in Sources */,
|
||||||
A7E26605A0C2D722889DC978 /* AudioPlayerController.swift in Sources */,
|
|
||||||
4CC684E41D1241CE42FD7348 /* ContentView.swift in Sources */,
|
|
||||||
8CB2509F6A60D8C785CD8F5F /* CoopRunningApp.swift in Sources */,
|
|
||||||
FBAD30B2745B7850ADC0BD10 /* LocalTrack.swift in Sources */,
|
|
||||||
5A81A364169B5FCD120F61FC /* PeerSession.swift in Sources */,
|
|
||||||
2DDFF6B9DA48824AB7E348F4 /* SessionMessage.swift in Sources */,
|
|
||||||
7D7B85F058BAFB619CCCE687 /* SyncClock.swift in Sources */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXSourcesBuildPhase section */
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
/* Begin PBXTargetDependency section */
|
||||||
6D8868D6D8F73E641CA58B0F /* PBXTargetDependency */ = {
|
1C54C143DF90D15B0BF852E1 /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
target = 6D8086D1FAEE224EF0BE91DB /* CoopRunning */;
|
target = 5C2F99C6F3AFB5DA6199A4A1 /* RunPlus */;
|
||||||
targetProxy = D6C6FD151E41BF7E8F592C82 /* PBXContainerItemProxy */;
|
targetProxy = 3B17CA897B21DAE8997359BB /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
/* End PBXTargetDependency section */
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
2A934AD016F05C8A94BF4DA8 /* Debug */ = {
|
025387CAFEC9F8982D05EAB3 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
|
INFOPLIST_FILE = RunPlus/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
);
|
||||||
|
LOCALIZED_STRING_SWIFT_SYMBOLS = YES;
|
||||||
|
PRODUCT_NAME = RunPlus;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
|
SWIFT_STRING_CATALOGS = YES;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
029D8ED443D4276C1F9AF969 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
@@ -231,22 +250,22 @@
|
|||||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
SWIFT_STRING_CATALOGS = YES;
|
SWIFT_STRING_CATALOGS = YES;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CoopRunning.app/CoopRunning";
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RunPlus.app/RunPlus";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Release;
|
||||||
};
|
};
|
||||||
5FDDE7CAF9D800EFEF79CEAB /* Release */ = {
|
7498E61B3963591BED3C7A48 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
INFOPLIST_FILE = CoopRunning/Info.plist;
|
INFOPLIST_FILE = RunPlus/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
LOCALIZED_STRING_SWIFT_SYMBOLS = YES;
|
LOCALIZED_STRING_SWIFT_SYMBOLS = YES;
|
||||||
PRODUCT_NAME = CoopRunning;
|
PRODUCT_NAME = RunPlus;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
SWIFT_STRING_CATALOGS = YES;
|
SWIFT_STRING_CATALOGS = YES;
|
||||||
@@ -254,44 +273,7 @@
|
|||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
84DDC04A355E486EE89AC7F8 /* Release */ = {
|
7A3BDC985CAD548B3291FD0F /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
"@loader_path/Frameworks",
|
|
||||||
);
|
|
||||||
LOCALIZED_STRING_SWIFT_SYMBOLS = YES;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
|
||||||
SWIFT_STRING_CATALOGS = YES;
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CoopRunning.app/CoopRunning";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
B10B4E0B66978D394F8DD3C9 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
|
||||||
INFOPLIST_FILE = CoopRunning/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
);
|
|
||||||
LOCALIZED_STRING_SWIFT_SYMBOLS = YES;
|
|
||||||
PRODUCT_NAME = CoopRunning;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
|
||||||
SWIFT_STRING_CATALOGS = YES;
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
DE756993C972E7F7EDB4067D /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
@@ -351,14 +333,14 @@
|
|||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
GENERATE_INFOPLIST_FILE = NO;
|
GENERATE_INFOPLIST_FILE = NO;
|
||||||
INFOPLIST_FILE = CoopRunning/Info.plist;
|
INFOPLIST_FILE = RunPlus/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
|
||||||
LOCALIZED_STRING_SWIFT_SYMBOLS = YES;
|
LOCALIZED_STRING_SWIFT_SYMBOLS = YES;
|
||||||
MARKETING_VERSION = 0.1.0;
|
MARKETING_VERSION = 0.1.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = de.felixfoertsch.cooprunning;
|
PRODUCT_BUNDLE_IDENTIFIER = de.felixfoertsch.runplus;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
@@ -371,7 +353,25 @@
|
|||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
F630219557065594A62AFA33 /* Release */ = {
|
86C6A2723CE077891FDDBB19 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"@executable_path/Frameworks",
|
||||||
|
"@loader_path/Frameworks",
|
||||||
|
);
|
||||||
|
LOCALIZED_STRING_SWIFT_SYMBOLS = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
STRING_CATALOG_GENERATE_SYMBOLS = YES;
|
||||||
|
SWIFT_STRING_CATALOGS = YES;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RunPlus.app/RunPlus";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
C273DFDF1D50D371159338ED /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
@@ -425,13 +425,13 @@
|
|||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
GENERATE_INFOPLIST_FILE = NO;
|
GENERATE_INFOPLIST_FILE = NO;
|
||||||
INFOPLIST_FILE = CoopRunning/Info.plist;
|
INFOPLIST_FILE = RunPlus/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
|
||||||
LOCALIZED_STRING_SWIFT_SYMBOLS = YES;
|
LOCALIZED_STRING_SWIFT_SYMBOLS = YES;
|
||||||
MARKETING_VERSION = 0.1.0;
|
MARKETING_VERSION = 0.1.0;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = de.felixfoertsch.cooprunning;
|
PRODUCT_BUNDLE_IDENTIFIER = de.felixfoertsch.runplus;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
@@ -447,34 +447,34 @@
|
|||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
2322A6CDF4FC2AE59DD780B1 /* Build configuration list for PBXNativeTarget "CoopRunningTests" */ = {
|
19B80B19E7591F6011762D0C /* Build configuration list for PBXNativeTarget "RunPlusTests" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
2A934AD016F05C8A94BF4DA8 /* Debug */,
|
86C6A2723CE077891FDDBB19 /* Debug */,
|
||||||
84DDC04A355E486EE89AC7F8 /* Release */,
|
029D8ED443D4276C1F9AF969 /* Release */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Debug;
|
defaultConfigurationName = Debug;
|
||||||
};
|
};
|
||||||
3BCFE323CCC2757AAFD6F452 /* Build configuration list for PBXProject "CoopRunning" */ = {
|
CAC938FDE280688F31DE0CE4 /* Build configuration list for PBXProject "RunPlus" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
DE756993C972E7F7EDB4067D /* Debug */,
|
7A3BDC985CAD548B3291FD0F /* Debug */,
|
||||||
F630219557065594A62AFA33 /* Release */,
|
C273DFDF1D50D371159338ED /* Release */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Debug;
|
defaultConfigurationName = Debug;
|
||||||
};
|
};
|
||||||
5E860FBA956CBCBD03474441 /* Build configuration list for PBXNativeTarget "CoopRunning" */ = {
|
FE58DB119F93CB8FCB3C5149 /* Build configuration list for PBXNativeTarget "RunPlus" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
B10B4E0B66978D394F8DD3C9 /* Debug */,
|
025387CAFEC9F8982D05EAB3 /* Debug */,
|
||||||
5FDDE7CAF9D800EFEF79CEAB /* Release */,
|
7498E61B3963591BED3C7A48 /* Release */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Debug;
|
defaultConfigurationName = Debug;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
};
|
};
|
||||||
rootObject = 45108C7370BA21AEC5D4E16A /* Project object */;
|
rootObject = B994AC409B01DDDD340C5845 /* Project object */;
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,6 @@
|
|||||||
<Workspace
|
<Workspace
|
||||||
version = "1.0">
|
version = "1.0">
|
||||||
<FileRef
|
<FileRef
|
||||||
location = "group:CoopRunning.xcodeproj">
|
location = "self:">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
</Workspace>
|
</Workspace>
|
||||||
@@ -15,10 +15,10 @@
|
|||||||
buildForAnalyzing = "YES">
|
buildForAnalyzing = "YES">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "6D8086D1FAEE224EF0BE91DB"
|
BlueprintIdentifier = "5C2F99C6F3AFB5DA6199A4A1"
|
||||||
BuildableName = "CoopRunning.app"
|
BuildableName = "RunPlus.app"
|
||||||
BlueprintName = "CoopRunning"
|
BlueprintName = "RunPlus"
|
||||||
ReferencedContainer = "container:CoopRunning.xcodeproj">
|
ReferencedContainer = "container:RunPlus.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildActionEntry>
|
</BuildActionEntry>
|
||||||
</BuildActionEntries>
|
</BuildActionEntries>
|
||||||
@@ -32,10 +32,10 @@
|
|||||||
<MacroExpansion>
|
<MacroExpansion>
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "6D8086D1FAEE224EF0BE91DB"
|
BlueprintIdentifier = "5C2F99C6F3AFB5DA6199A4A1"
|
||||||
BuildableName = "CoopRunning.app"
|
BuildableName = "RunPlus.app"
|
||||||
BlueprintName = "CoopRunning"
|
BlueprintName = "RunPlus"
|
||||||
ReferencedContainer = "container:CoopRunning.xcodeproj">
|
ReferencedContainer = "container:RunPlus.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</MacroExpansion>
|
</MacroExpansion>
|
||||||
<Testables>
|
<Testables>
|
||||||
@@ -44,10 +44,10 @@
|
|||||||
parallelizable = "NO">
|
parallelizable = "NO">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "7176FDC3954B3226DB5DEE48"
|
BlueprintIdentifier = "F407DEF9415CB11EF9A62BDD"
|
||||||
BuildableName = "CoopRunningTests.xctest"
|
BuildableName = "RunPlusTests.xctest"
|
||||||
BlueprintName = "CoopRunningTests"
|
BlueprintName = "RunPlusTests"
|
||||||
ReferencedContainer = "container:CoopRunning.xcodeproj">
|
ReferencedContainer = "container:RunPlus.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</TestableReference>
|
</TestableReference>
|
||||||
</Testables>
|
</Testables>
|
||||||
@@ -68,10 +68,10 @@
|
|||||||
runnableDebuggingMode = "0">
|
runnableDebuggingMode = "0">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "6D8086D1FAEE224EF0BE91DB"
|
BlueprintIdentifier = "5C2F99C6F3AFB5DA6199A4A1"
|
||||||
BuildableName = "CoopRunning.app"
|
BuildableName = "RunPlus.app"
|
||||||
BlueprintName = "CoopRunning"
|
BlueprintName = "RunPlus"
|
||||||
ReferencedContainer = "container:CoopRunning.xcodeproj">
|
ReferencedContainer = "container:RunPlus.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
</LaunchAction>
|
</LaunchAction>
|
||||||
@@ -85,10 +85,10 @@
|
|||||||
runnableDebuggingMode = "0">
|
runnableDebuggingMode = "0">
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
BuildableIdentifier = "primary"
|
BuildableIdentifier = "primary"
|
||||||
BlueprintIdentifier = "6D8086D1FAEE224EF0BE91DB"
|
BlueprintIdentifier = "5C2F99C6F3AFB5DA6199A4A1"
|
||||||
BuildableName = "CoopRunning.app"
|
BuildableName = "RunPlus.app"
|
||||||
BlueprintName = "CoopRunning"
|
BlueprintName = "RunPlus"
|
||||||
ReferencedContainer = "container:CoopRunning.xcodeproj">
|
ReferencedContainer = "container:RunPlus.xcodeproj">
|
||||||
</BuildableReference>
|
</BuildableReference>
|
||||||
</BuildableProductRunnable>
|
</BuildableProductRunnable>
|
||||||
</ProfileAction>
|
</ProfileAction>
|
||||||
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 154 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 7.6 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
@@ -42,7 +42,7 @@ struct ContentView: View {
|
|||||||
|
|
||||||
private var header: some View {
|
private var header: some View {
|
||||||
VStack(spacing: 6) {
|
VStack(spacing: 6) {
|
||||||
Text("CoopRunning Sync")
|
Text("Run+")
|
||||||
.font(.title2).bold()
|
.font(.title2).bold()
|
||||||
Text(appModel.statusText)
|
Text(appModel.statusText)
|
||||||
.font(.footnote)
|
.font(.footnote)
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
<key>CFBundleDevelopmentRegion</key>
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
<key>CFBundleDisplayName</key>
|
<key>CFBundleDisplayName</key>
|
||||||
<string>CoopRunning</string>
|
<string>Run+</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
<string>Find nearby runners</string>
|
<string>Find nearby runners</string>
|
||||||
<key>NSBonjourServices</key>
|
<key>NSBonjourServices</key>
|
||||||
<array>
|
<array>
|
||||||
<string>_cooprun-sync._tcp</string>
|
<string>_runplus-sync._tcp</string>
|
||||||
</array>
|
</array>
|
||||||
<key>NSLocalNetworkUsageDescription</key>
|
<key>NSLocalNetworkUsageDescription</key>
|
||||||
<string>Sync audio with nearby runners</string>
|
<string>Sync audio with nearby runners</string>
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="390" height="844"/>
|
<rect key="frame" x="0.0" y="0.0" width="390" height="844"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="CoopRunning" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1aC-zt-x8B">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Run+" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1aC-zt-x8B">
|
||||||
<rect key="frame" x="120" y="412" width="150" height="20"/>
|
<rect key="frame" x="120" y="412" width="150" height="20"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17" weight="semibold"/>
|
<fontDescription key="fontDescription" type="system" pointSize="17" weight="semibold"/>
|
||||||
<color key="textColor" systemColor="labelColor"/>
|
<color key="textColor" systemColor="labelColor"/>
|
||||||
@@ -9,7 +9,7 @@ struct LocalTrack: Identifiable, Hashable {
|
|||||||
|
|
||||||
static func libraryDirectory() -> URL {
|
static func libraryDirectory() -> URL {
|
||||||
let docs = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
|
let docs = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
|
||||||
let dir = docs.appendingPathComponent("CoopRunning", isDirectory: true)
|
let dir = docs.appendingPathComponent("RunPlus", isDirectory: true)
|
||||||
if !FileManager.default.fileExists(atPath: dir.path) {
|
if !FileManager.default.fileExists(atPath: dir.path) {
|
||||||
try? FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
|
try? FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
|
||||||
}
|
}
|
||||||
@@ -10,7 +10,7 @@ final class PeerSession: NSObject, ObservableObject {
|
|||||||
var onMessage: ((SessionMessage) -> Void)?
|
var onMessage: ((SessionMessage) -> Void)?
|
||||||
var onReceiveResource: ((String, URL) -> Void)?
|
var onReceiveResource: ((String, URL) -> Void)?
|
||||||
|
|
||||||
private let serviceType = "cooprun-sync"
|
private let serviceType = "runplus-sync"
|
||||||
private let myPeerID = MCPeerID(displayName: UIDevice.current.name)
|
private let myPeerID = MCPeerID(displayName: UIDevice.current.name)
|
||||||
|
|
||||||
private var session: MCSession!
|
private var session: MCSession!
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
@main
|
@main
|
||||||
struct CoopRunningApp: App {
|
struct RunPlusApp: App {
|
||||||
@StateObject private var appModel = AppModel()
|
@StateObject private var appModel = AppModel()
|
||||||
|
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
9
RunPlusTests/RunPlusTests.swift
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import XCTest
|
||||||
|
@testable import RunPlus
|
||||||
|
|
||||||
|
final class RunPlusTests: XCTestCase {
|
||||||
|
func testLibraryLoads() {
|
||||||
|
let library = LocalTrack.loadLibrary()
|
||||||
|
XCTAssertNotNil(library)
|
||||||
|
}
|
||||||
|
}
|
||||||
32
project.yml
@@ -1,4 +1,4 @@
|
|||||||
name: CoopRunning
|
name: RunPlus
|
||||||
options:
|
options:
|
||||||
bundleIdPrefix: de.felixfoertsch
|
bundleIdPrefix: de.felixfoertsch
|
||||||
deploymentTarget:
|
deploymentTarget:
|
||||||
@@ -8,9 +8,9 @@ settings:
|
|||||||
SWIFT_VERSION: 5.9
|
SWIFT_VERSION: 5.9
|
||||||
DEVELOPMENT_ASSET_PATHS: ""
|
DEVELOPMENT_ASSET_PATHS: ""
|
||||||
TARGETED_DEVICE_FAMILY: "1" # iPhone
|
TARGETED_DEVICE_FAMILY: "1" # iPhone
|
||||||
INFOPLIST_FILE: CoopRunning/Info.plist
|
INFOPLIST_FILE: RunPlus/Info.plist
|
||||||
CODE_SIGN_STYLE: Automatic
|
CODE_SIGN_STYLE: Automatic
|
||||||
PRODUCT_BUNDLE_IDENTIFIER: de.felixfoertsch.cooprunning
|
PRODUCT_BUNDLE_IDENTIFIER: de.felixfoertsch.runplus
|
||||||
DEVELOPMENT_TEAM: NG5W75WE8U
|
DEVELOPMENT_TEAM: NG5W75WE8U
|
||||||
CODE_SIGN_IDENTITY: "Apple Development"
|
CODE_SIGN_IDENTITY: "Apple Development"
|
||||||
PROVISIONING_PROFILE_SPECIFIER: ""
|
PROVISIONING_PROFILE_SPECIFIER: ""
|
||||||
@@ -29,33 +29,33 @@ configs:
|
|||||||
Release: release
|
Release: release
|
||||||
|
|
||||||
schemes:
|
schemes:
|
||||||
CoopRunning:
|
RunPlus:
|
||||||
build:
|
build:
|
||||||
targets:
|
targets:
|
||||||
CoopRunning: all
|
RunPlus: all
|
||||||
test:
|
test:
|
||||||
targets:
|
targets:
|
||||||
- CoopRunningTests
|
- RunPlusTests
|
||||||
|
|
||||||
targets:
|
targets:
|
||||||
CoopRunning:
|
RunPlus:
|
||||||
type: application
|
type: application
|
||||||
platform: iOS
|
platform: iOS
|
||||||
sources:
|
sources:
|
||||||
- path: CoopRunning
|
- path: RunPlus
|
||||||
resources:
|
resources:
|
||||||
- path: CoopRunning/LaunchScreen.storyboard
|
- path: RunPlus/LaunchScreen.storyboard
|
||||||
settings:
|
settings:
|
||||||
base:
|
base:
|
||||||
PRODUCT_NAME: CoopRunning
|
PRODUCT_NAME: RunPlus
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
|
||||||
LOCALIZED_STRING_SWIFT_SYMBOLS: "YES"
|
LOCALIZED_STRING_SWIFT_SYMBOLS: "YES"
|
||||||
SWIFT_STRING_CATALOGS: "YES"
|
SWIFT_STRING_CATALOGS: "YES"
|
||||||
STRING_CATALOG_GENERATE_SYMBOLS: "YES"
|
STRING_CATALOG_GENERATE_SYMBOLS: "YES"
|
||||||
info:
|
info:
|
||||||
path: CoopRunning/Info.plist
|
path: RunPlus/Info.plist
|
||||||
properties:
|
properties:
|
||||||
CFBundleDisplayName: CoopRunning
|
CFBundleDisplayName: "Run+"
|
||||||
LSRequiresIPhoneOS: true
|
LSRequiresIPhoneOS: true
|
||||||
UILaunchStoryboardName: LaunchScreen
|
UILaunchStoryboardName: LaunchScreen
|
||||||
UISupportedInterfaceOrientations:
|
UISupportedInterfaceOrientations:
|
||||||
@@ -65,16 +65,16 @@ targets:
|
|||||||
- UIInterfaceOrientationLandscapeRight
|
- UIInterfaceOrientationLandscapeRight
|
||||||
NSLocalNetworkUsageDescription: "Sync audio with nearby runners"
|
NSLocalNetworkUsageDescription: "Sync audio with nearby runners"
|
||||||
NSBonjourServices:
|
NSBonjourServices:
|
||||||
- "_cooprun-sync._tcp"
|
- "_runplus-sync._tcp"
|
||||||
NSBluetoothAlwaysUsageDescription: "Find nearby runners"
|
NSBluetoothAlwaysUsageDescription: "Find nearby runners"
|
||||||
|
|
||||||
CoopRunningTests:
|
RunPlusTests:
|
||||||
type: bundle.unit-test
|
type: bundle.unit-test
|
||||||
platform: iOS
|
platform: iOS
|
||||||
sources:
|
sources:
|
||||||
- path: CoopRunningTests
|
- path: RunPlusTests
|
||||||
dependencies:
|
dependencies:
|
||||||
- target: CoopRunning
|
- target: RunPlus
|
||||||
settings:
|
settings:
|
||||||
base:
|
base:
|
||||||
LOCALIZED_STRING_SWIFT_SYMBOLS: "YES"
|
LOCALIZED_STRING_SWIFT_SYMBOLS: "YES"
|
||||||
|
|||||||