tvOS allow audio in other apps, iOS show complete sheet without watch
This commit is contained in:
@@ -34,6 +34,7 @@
|
|||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
1C08B2372C234522005F07D1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||||
1CC0930B2C21DE760004E1E6 /* WekoutThotViewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WekoutThotViewer.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
1CC0930B2C21DE760004E1E6 /* WekoutThotViewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WekoutThotViewer.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
1CC0930E2C21DE760004E1E6 /* WekoutThotViewerApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WekoutThotViewerApp.swift; sourceTree = "<group>"; };
|
1CC0930E2C21DE760004E1E6 /* WekoutThotViewerApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WekoutThotViewerApp.swift; sourceTree = "<group>"; };
|
||||||
1CC093102C21DE760004E1E6 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
1CC093102C21DE760004E1E6 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||||
@@ -132,6 +133,7 @@
|
|||||||
1CC0930D2C21DE760004E1E6 /* WekoutThotViewer */ = {
|
1CC0930D2C21DE760004E1E6 /* WekoutThotViewer */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
1C08B2372C234522005F07D1 /* Info.plist */,
|
||||||
1CC0930E2C21DE760004E1E6 /* WekoutThotViewerApp.swift */,
|
1CC0930E2C21DE760004E1E6 /* WekoutThotViewerApp.swift */,
|
||||||
1CC7CB7B2C21E089001614B8 /* RegisteredUser.swift */,
|
1CC7CB7B2C21E089001614B8 /* RegisteredUser.swift */,
|
||||||
1CC093102C21DE760004E1E6 /* ContentView.swift */,
|
1CC093102C21DE760004E1E6 /* ContentView.swift */,
|
||||||
@@ -387,6 +389,7 @@
|
|||||||
DEVELOPMENT_TEAM = V3PF3M6B6U;
|
DEVELOPMENT_TEAM = V3PF3M6B6U;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = WekoutThotViewer/Info.plist;
|
||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
|
INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
@@ -413,6 +416,7 @@
|
|||||||
DEVELOPMENT_TEAM = V3PF3M6B6U;
|
DEVELOPMENT_TEAM = V3PF3M6B6U;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_FILE = WekoutThotViewer/Info.plist;
|
||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
|
INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
|
|||||||
10
WekoutThotViewer/WekoutThotViewer/Info.plist
Normal file
10
WekoutThotViewer/WekoutThotViewer/Info.plist
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>UIBackgroundModes</key>
|
||||||
|
<array>
|
||||||
|
<string>audio</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -6,12 +6,16 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
import AVKit
|
||||||
|
|
||||||
@main
|
@main
|
||||||
struct WekoutThotViewerApp: App {
|
struct WekoutThotViewerApp: App {
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
WindowGroup {
|
WindowGroup {
|
||||||
ContentView()
|
ContentView()
|
||||||
|
.onAppear(perform: {
|
||||||
|
_ = try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, mode: .default, options: .mixWithOthers)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ class HealthKitHelper {
|
|||||||
{ (sampleQuery, results, error ) -> Void in
|
{ (sampleQuery, results, error ) -> Void in
|
||||||
|
|
||||||
if let queryError = error {
|
if let queryError = error {
|
||||||
|
self.shitReturned()
|
||||||
|
self.shitReturned()
|
||||||
print( "There was an error while reading the samples: \(queryError.localizedDescription)")
|
print( "There was an error while reading the samples: \(queryError.localizedDescription)")
|
||||||
} else {
|
} else {
|
||||||
for samples: HKSample in results! {
|
for samples: HKSample in results! {
|
||||||
@@ -86,10 +88,8 @@ class HealthKitHelper {
|
|||||||
self.healthKitWorkoutData.minHeartRate = _minHeartRate
|
self.healthKitWorkoutData.minHeartRate = _minHeartRate
|
||||||
self.healthKitWorkoutData.maxHeartRate = _maxHeartRate
|
self.healthKitWorkoutData.maxHeartRate = _maxHeartRate
|
||||||
print("got heart")
|
print("got heart")
|
||||||
DispatchQueue.main.async {
|
|
||||||
self.shitReturned()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
self.shitReturned()
|
||||||
})
|
})
|
||||||
healthStore.execute(heartQuery)
|
healthStore.execute(heartQuery)
|
||||||
}
|
}
|
||||||
@@ -108,10 +108,8 @@ class HealthKitHelper {
|
|||||||
if let result = result {
|
if let result = result {
|
||||||
self.healthKitWorkoutData.caloriesBurned = result.sumQuantity()?.doubleValue(for: HKUnit.kilocalorie()) ?? -1
|
self.healthKitWorkoutData.caloriesBurned = result.sumQuantity()?.doubleValue(for: HKUnit.kilocalorie()) ?? -1
|
||||||
print("got total burned")
|
print("got total burned")
|
||||||
DispatchQueue.main.async {
|
|
||||||
self.shitReturned()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
self.shitReturned()
|
||||||
})
|
})
|
||||||
healthStore.execute(calQuery)
|
healthStore.execute(calQuery)
|
||||||
}
|
}
|
||||||
@@ -121,7 +119,7 @@ class HealthKitHelper {
|
|||||||
self.returnCount += 1
|
self.returnCount += 1
|
||||||
print("\(self.returnCount)")
|
print("\(self.returnCount)")
|
||||||
if self.returnCount == 2 {
|
if self.returnCount == 2 {
|
||||||
self.completion!(self.healthKitWorkoutData)
|
self.completion?(self.healthKitWorkoutData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,10 +19,10 @@ struct WorkoutDetailView: View {
|
|||||||
|
|
||||||
enum Sheet: Identifiable {
|
enum Sheet: Identifiable {
|
||||||
case completedWorkout([String: Any])
|
case completedWorkout([String: Any])
|
||||||
var id: String { return UUID().uuidString }
|
var id: String { return "completedWorkoutSheet" }
|
||||||
}
|
}
|
||||||
|
|
||||||
@State var presentedSheet: Sheet?
|
@State var workoutComplete: Sheet?
|
||||||
@State var workoutToPlan: Workout?
|
@State var workoutToPlan: Workout?
|
||||||
@State var showExecersizeInfo: Bool = false
|
@State var showExecersizeInfo: Bool = false
|
||||||
|
|
||||||
@@ -134,13 +134,14 @@ struct WorkoutDetailView: View {
|
|||||||
.frame(height: 44)
|
.frame(height: 44)
|
||||||
|
|
||||||
}
|
}
|
||||||
.sheet(item: $presentedSheet) { item in
|
.sheet(item: $workoutComplete) { item in
|
||||||
switch item {
|
switch item {
|
||||||
case .completedWorkout(let data):
|
case .completedWorkout(let data):
|
||||||
CompletedWorkoutView(postData: data,
|
CompletedWorkoutView(postData: data,
|
||||||
workout: workout,
|
workout: workout,
|
||||||
completedWorkoutDismissed: { uploaded in
|
completedWorkoutDismissed: { uploaded in
|
||||||
if uploaded {
|
if uploaded {
|
||||||
|
bridgeModule.resetCurrentWorkout()
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -195,7 +196,8 @@ struct WorkoutDetailView: View {
|
|||||||
func startWorkout(workout: Workout) {
|
func startWorkout(workout: Workout) {
|
||||||
bridgeModule.completedWorkout = {
|
bridgeModule.completedWorkout = {
|
||||||
if let workoutData = createWorkoutData() {
|
if let workoutData = createWorkoutData() {
|
||||||
presentedSheet = .completedWorkout(workoutData)
|
workoutComplete = .completedWorkout(workoutData)
|
||||||
|
} else {
|
||||||
bridgeModule.resetCurrentWorkout()
|
bridgeModule.resetCurrentWorkout()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user