fixed background playback issue, added systemwide playback control, bug fixes
This commit is contained in:
@@ -9,13 +9,16 @@ import SwiftUI
|
|||||||
import Network
|
import Network
|
||||||
import AVFoundation
|
import AVFoundation
|
||||||
import UIKit
|
import UIKit
|
||||||
|
import WatchKit
|
||||||
|
import MediaPlayer
|
||||||
|
|
||||||
class TrackInfo : NSObject, Identifiable, ObservableObject {
|
class TrackInfo : NSObject, Identifiable, ObservableObject {
|
||||||
@Published var s : String = ""
|
@Published var s : String = ""
|
||||||
@Published var art : Image? = nil
|
@Published var art : UIImage? = nil
|
||||||
@Published var m : AVPlayerItem? = nil
|
@Published var m : AVPlayerItem? = nil
|
||||||
@Published var changed = false
|
@Published var changed = false
|
||||||
var cv : ContentView? = nil
|
var cv : ContentView? = nil
|
||||||
|
var background = false
|
||||||
override init() {
|
override init() {
|
||||||
super.init()
|
super.init()
|
||||||
}
|
}
|
||||||
@@ -37,10 +40,30 @@ class TrackInfo : NSObject, Identifiable, ObservableObject {
|
|||||||
self.changed = !self.changed
|
self.changed = !self.changed
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (context == nil) {
|
||||||
|
if let change = change,
|
||||||
|
let keyPath = keyPath,
|
||||||
|
let cv = self.cv,
|
||||||
|
keyPath == "timeControlStatus" && self.background
|
||||||
|
{
|
||||||
|
let old = change[.oldKey] as! Int
|
||||||
|
let new = change[.newKey] as! Int
|
||||||
|
if (new == 0 && old != 0) {
|
||||||
|
cv.player.playImmediately(atRate: 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if let cv = self.cv {
|
if let cv = self.cv {
|
||||||
if let idx = cv.music.music.firstIndex(where: { s in
|
if let idx = cv.music.music.firstIndex(where: { s in
|
||||||
change![.newKey] as? AVPlayerItem == s.m
|
change![.newKey] as? AVPlayerItem == s.m
|
||||||
}){
|
}){
|
||||||
|
var nowPlayingInfo = [String: Any]()
|
||||||
|
nowPlayingInfo[MPMediaItemPropertyTitle] = self.s
|
||||||
|
nowPlayingInfo[MPMediaItemPropertyPlaybackDuration] = cv.player.currentItem?.duration
|
||||||
|
nowPlayingInfo[MPNowPlayingInfoPropertyElapsedPlaybackTime] = cv.player.currentTime()
|
||||||
|
nowPlayingInfo[MPNowPlayingInfoPropertyPlaybackRate] = cv.player.rate
|
||||||
|
//nowPlayingInfo[MPMediaItemPropertyArtwork] = self.art
|
||||||
|
MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
|
||||||
self.from(other: cv.music.music[idx])
|
self.from(other: cv.music.music[idx])
|
||||||
cv.update_pbv(idx: idx)
|
cv.update_pbv(idx: idx)
|
||||||
}
|
}
|
||||||
@@ -74,14 +97,39 @@ class PlaybackViewProxy {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ContentView: View {
|
struct ContentView: View {
|
||||||
|
@Environment(\.scenePhase) private var scenePhase
|
||||||
@ObservedObject var music = ListViewModel()
|
@ObservedObject var music = ListViewModel()
|
||||||
@ObservedObject var nowplaying : TrackInfo
|
@ObservedObject var nowplaying : TrackInfo
|
||||||
@State var pushState = false
|
@State var pushState = false
|
||||||
@State var geo:CGSize = .zero
|
@State var geo:CGSize = .zero
|
||||||
@State var active = false
|
@State var active = false
|
||||||
|
var audio_session: AVAudioSession = AVAudioSession.sharedInstance()
|
||||||
//@State var _curr_sel_music : TrackInfo = TrackInfo()
|
//@State var _curr_sel_music : TrackInfo = TrackInfo()
|
||||||
var pbv : PlaybackViewProxy
|
var pbv : PlaybackViewProxy
|
||||||
var dir: String
|
var dir: String
|
||||||
|
var cc = MPRemoteCommandCenter.shared()
|
||||||
|
func play() {
|
||||||
|
do {
|
||||||
|
try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, policy:.longForm)
|
||||||
|
try AVAudioSession.sharedInstance().setActive(true)
|
||||||
|
|
||||||
|
self.player.play()
|
||||||
|
} catch {
|
||||||
|
print("Error playing audio: \(error)")
|
||||||
|
}
|
||||||
|
/*do {
|
||||||
|
try audio_session.setCategory(AVAudioSession.Category.ambient, options: .mixWithOthers)
|
||||||
|
try audio_session.setActive(true)
|
||||||
|
audio_session.activate { _, e in
|
||||||
|
if e == nil {
|
||||||
|
self.player.audiovisualBackgroundPlaybackPolicy = .continuesIfPossible
|
||||||
|
self.player.playImmediately(atRate: 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
print(error)
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
func update_pbv(idx: Int) {
|
func update_pbv(idx: Int) {
|
||||||
let m = music.music[idx]
|
let m = music.music[idx]
|
||||||
@@ -150,6 +198,18 @@ struct ContentView: View {
|
|||||||
.toolbar(.visible, for: .navigationBar)
|
.toolbar(.visible, for: .navigationBar)
|
||||||
|
|
||||||
self.pbv.tabpbv
|
self.pbv.tabpbv
|
||||||
|
NowPlayingView().blur(radius: 0.2)
|
||||||
|
}
|
||||||
|
}.onChange(of: scenePhase) { phase in
|
||||||
|
switch phase {
|
||||||
|
case .active:
|
||||||
|
self.nowplaying.background = false
|
||||||
|
case .inactive:
|
||||||
|
self.nowplaying.background = true
|
||||||
|
case .background:
|
||||||
|
self.nowplaying.background = true
|
||||||
|
default:
|
||||||
|
self.nowplaying.background = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +221,7 @@ struct ContentView: View {
|
|||||||
let file_url = URL(filePath: dir + "/Documents/" + filename)
|
let file_url = URL(filePath: dir + "/Documents/" + filename)
|
||||||
let asset = AVAsset(url: file_url)
|
let asset = AVAsset(url: file_url)
|
||||||
let track = TrackInfo()
|
let track = TrackInfo()
|
||||||
|
|
||||||
asset.loadMetadata(for: .iTunesMetadata) {
|
asset.loadMetadata(for: .iTunesMetadata) {
|
||||||
items, b in
|
items, b in
|
||||||
if (items == nil) { return }
|
if (items == nil) { return }
|
||||||
@@ -169,7 +229,7 @@ struct ContentView: View {
|
|||||||
if(i.identifier == .iTunesMetadataCoverArt) {
|
if(i.identifier == .iTunesMetadataCoverArt) {
|
||||||
Task{
|
Task{
|
||||||
let imageData = try await i.load(.dataValue)
|
let imageData = try await i.load(.dataValue)
|
||||||
track.art = Image(uiImage: UIImage(data: imageData!)!)
|
track.art = UIImage(data: imageData!)!
|
||||||
/*if (track.art != nil) {
|
/*if (track.art != nil) {
|
||||||
track.art!.resizable().scaledToFill().frame(width: geo.width, height: geo.height)
|
track.art!.resizable().scaledToFill().frame(width: geo.width, height: geo.height)
|
||||||
}*/
|
}*/
|
||||||
@@ -188,7 +248,7 @@ struct ContentView: View {
|
|||||||
print(self.player.error!)
|
print(self.player.error!)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
self.player.play()
|
//self.play()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
init() {
|
init() {
|
||||||
@@ -200,12 +260,6 @@ struct ContentView: View {
|
|||||||
self.dir = NSHomeDirectory()
|
self.dir = NSHomeDirectory()
|
||||||
let dir = self.dir
|
let dir = self.dir
|
||||||
|
|
||||||
do {
|
|
||||||
let session = AVAudioSession.sharedInstance()
|
|
||||||
try session.setCategory(AVAudioSession.Category.playback, mode: .default, policy: .longFormAudio, options: .duckOthers)
|
|
||||||
} catch {
|
|
||||||
print(error)
|
|
||||||
}
|
|
||||||
self.player = AVQueuePlayer()
|
self.player = AVQueuePlayer()
|
||||||
self.nowplaying = TrackInfo()
|
self.nowplaying = TrackInfo()
|
||||||
|
|
||||||
@@ -213,11 +267,9 @@ struct ContentView: View {
|
|||||||
|
|
||||||
self.pbv.pbv.parent = self
|
self.pbv.pbv.parent = self
|
||||||
self.pbv.tabpbv.parent = self
|
self.pbv.tabpbv.parent = self
|
||||||
|
|
||||||
self.player.audiovisualBackgroundPlaybackPolicy = .continuesIfPossible
|
self.player.audiovisualBackgroundPlaybackPolicy = .continuesIfPossible
|
||||||
|
self.player.addObserver(self.nowplaying, forKeyPath: "currentItem", options: [.old, .new], context: &self)
|
||||||
self.player.addObserver(self.nowplaying, forKeyPath: "currentItem",options: [.old, .new], context: &self)
|
self.player.addObserver(self.nowplaying, forKeyPath: "timeControlStatus", options: [.old, .new], context: nil)
|
||||||
|
|
||||||
session.dataTask(with: request, completionHandler:
|
session.dataTask(with: request, completionHandler:
|
||||||
{ [self] (data, response, error) -> Void in
|
{ [self] (data, response, error) -> Void in
|
||||||
if (error != nil) { return }
|
if (error != nil) { return }
|
||||||
@@ -251,24 +303,7 @@ struct ContentView: View {
|
|||||||
check_file(filepath)
|
check_file(filepath)
|
||||||
check_file("\(dir)/Documents/\(_file)")
|
check_file("\(dir)/Documents/\(_file)")
|
||||||
if (download) {
|
if (download) {
|
||||||
var tries = 16
|
var tries = 32
|
||||||
/*
|
|
||||||
func try_save_response (data: Data?, response: URLResponse?, error: Error?) -> Void {
|
|
||||||
if (error == nil) {
|
|
||||||
let fp = fopen(filepath, "wb")
|
|
||||||
data!.withUnsafeBytes({ ptr in
|
|
||||||
fwrite(ptr, 1, data!.count, fp)
|
|
||||||
})
|
|
||||||
fclose(fp)
|
|
||||||
add_music(filename: file)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (tries > 0) {
|
|
||||||
tries -= 1
|
|
||||||
session.dataTask(with: URLRequest(url: URL(string: base + "/" + _file)!, timeoutInterval: TimeInterval(100000 * (5 - tries))), completionHandler: try_save_response).resume()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
var req = URLRequest(url: URL(string: base + "/" + _file)!, timeoutInterval: 65536)
|
var req = URLRequest(url: URL(string: base + "/" + _file)!, timeoutInterval: 65536)
|
||||||
func try_download (u: URL?, r: URLResponse?, e: Error?) -> Void { // use download to avoid memory overflow
|
func try_download (u: URL?, r: URLResponse?, e: Error?) -> Void { // use download to avoid memory overflow
|
||||||
@@ -289,9 +324,6 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
session.downloadTask(with: req, completionHandler: try_download).resume()
|
session.downloadTask(with: req, completionHandler: try_download).resume()
|
||||||
|
|
||||||
|
|
||||||
//session.dataTask(with: URLRequest(url: URL(string: base + "/" + _file)!, timeoutInterval: TimeInterval(65535)), completionHandler: try_save_response).resume()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}catch{}
|
}catch{}
|
||||||
@@ -303,6 +335,17 @@ struct ContentView: View {
|
|||||||
|
|
||||||
self.pbv.pbv.update(music: self.nowplaying)
|
self.pbv.pbv.update(music: self.nowplaying)
|
||||||
self.pbv.tabpbv.update(music: self.nowplaying)
|
self.pbv.tabpbv.update(music: self.nowplaying)
|
||||||
|
|
||||||
|
let player = self.player
|
||||||
|
cc.playCommand.addTarget { _ in
|
||||||
|
player.play()
|
||||||
|
return .success
|
||||||
|
}
|
||||||
|
cc.stopCommand.addTarget { _ in
|
||||||
|
player.play()
|
||||||
|
return .success
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,10 @@
|
|||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import UIKit
|
import UIKit
|
||||||
|
import WatchKit
|
||||||
|
|
||||||
|
let window_width = WKInterfaceDevice.current().screenBounds.width
|
||||||
|
let window_height = WKInterfaceDevice.current().screenBounds.height
|
||||||
|
|
||||||
class AppearTimer : ObservableObject {
|
class AppearTimer : ObservableObject {
|
||||||
@Published var appear = false
|
@Published var appear = false
|
||||||
@@ -47,19 +51,24 @@ struct PlaybackView: View {
|
|||||||
if trackInfo.m != nil {
|
if trackInfo.m != nil {
|
||||||
GeometryReader { geo in
|
GeometryReader { geo in
|
||||||
ZStack {
|
ZStack {
|
||||||
if(trackInfo.art == nil) {
|
ZStack{
|
||||||
|
if(trackInfo.art == nil) {
|
||||||
Image(systemName: "music.note")
|
|
||||||
.resizable()
|
Image(systemName: "music.note")
|
||||||
.scaledToFit()
|
.resizable()
|
||||||
.foregroundColor(.white)
|
.scaledToFit()
|
||||||
.frame(width: geo.size.width*0.84, height: geo.size.height*0.84)
|
.foregroundColor(.white)
|
||||||
.padding(.leading, geo.size.width*0.08)
|
.frame(width: window_width*0.7, height: window_height*0.7)
|
||||||
.padding(.top, geo.size.height*0.08)
|
//.padding(.leading, window_width*0.05)
|
||||||
}
|
//.padding(.bottom, window_height * 0.15)
|
||||||
else {
|
|
||||||
trackInfo.art!.resizable().scaledToFill()
|
//.padding(.top, window_height*0.08)
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
Image(uiImage: trackInfo.art!).resizable().scaledToFill()
|
||||||
|
}
|
||||||
|
}.frame(width : window_width, height: window_height * 0.8)
|
||||||
|
.background(appearTimer.appear ? Color.gray : Color.clear).opacity(appearTimer.appear ? 0.3 : 1).blur(radius: appearTimer.appear ? 5 : 0)
|
||||||
if (appearTimer.appear)
|
if (appearTimer.appear)
|
||||||
{
|
{
|
||||||
VStack {
|
VStack {
|
||||||
@@ -70,8 +79,9 @@ struct PlaybackView: View {
|
|||||||
self.playing = false
|
self.playing = false
|
||||||
} else {
|
} else {
|
||||||
parent!.player.audiovisualBackgroundPlaybackPolicy = .continuesIfPossible
|
parent!.player.audiovisualBackgroundPlaybackPolicy = .continuesIfPossible
|
||||||
parent!.player.play()
|
parent!.play()
|
||||||
self.playing = true
|
self.playing = true
|
||||||
|
appearTimer.appear()
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
(
|
(
|
||||||
@@ -81,9 +91,9 @@ struct PlaybackView: View {
|
|||||||
)
|
)
|
||||||
.resizable()
|
.resizable()
|
||||||
.scaledToFit()
|
.scaledToFit()
|
||||||
.frame(width: geo.size.width/5.5)
|
.frame(width: window_width/5.5)
|
||||||
}.background(Color(red: 0,green: 0,blue: 0,opacity: 0.2))
|
}.background(Color(red: 0,green: 0,blue: 0,opacity: 0.2))
|
||||||
.frame(width: geo.size.width/2.5)
|
.frame(width: window_width/2.5)
|
||||||
.cornerRadius(90, antialiased: true)
|
.cornerRadius(90, antialiased: true)
|
||||||
.foregroundColor(.white)
|
.foregroundColor(.white)
|
||||||
.opacity(1)
|
.opacity(1)
|
||||||
@@ -94,25 +104,27 @@ struct PlaybackView: View {
|
|||||||
curr!.seek(to: .zero)
|
curr!.seek(to: .zero)
|
||||||
parent!.player.play()
|
parent!.player.play()
|
||||||
self.playing = true
|
self.playing = true
|
||||||
|
appearTimer.appear()
|
||||||
} label : {
|
} label : {
|
||||||
Image(systemName: "chevron.forward")
|
Image(systemName: "chevron.forward")
|
||||||
.resizable()
|
.resizable()
|
||||||
.scaledToFit()
|
.scaledToFit()
|
||||||
.frame(width: geo.size.width/7, height: geo.size.height/7)
|
.frame(width: window_width/7, height: window_height/7)
|
||||||
}.background(Color.clear)
|
}.background(Color.clear)
|
||||||
.clipShape(Circle())
|
.clipShape(Circle())
|
||||||
.foregroundColor(.white)
|
.foregroundColor(.white)
|
||||||
.frame(width: geo.size.width/4, height: geo.size.height/4)
|
.frame(width: window_width/4, height: window_height/4)
|
||||||
.padding(0)
|
.padding(0)
|
||||||
.opacity(1)
|
.opacity(1)
|
||||||
.buttonStyle(.plain)
|
.buttonStyle(.plain)
|
||||||
}
|
}
|
||||||
}
|
}.zIndex(5)
|
||||||
}
|
}
|
||||||
}.onTapGesture {
|
}.onTapGesture {
|
||||||
appearTimer.appear()
|
appearTimer.appear()
|
||||||
}
|
}
|
||||||
}.navigationBarBackButtonHidden(false)
|
}.navigationBarBackButtonHidden(false)
|
||||||
|
.navigationTitle(trackInfo.s)
|
||||||
.toolbar(.visible, for: .navigationBar)
|
.toolbar(.visible, for: .navigationBar)
|
||||||
.onAppear() {
|
.onAppear() {
|
||||||
appearTimer.appear(time: 3, _appear: true)
|
appearTimer.appear(time: 3, _appear: true)
|
||||||
|
|||||||
@@ -2,9 +2,21 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
|
<key>NSSupportsAutomaticTermination</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSSupportsSuddenTermination</key>
|
||||||
|
<false/>
|
||||||
|
<key>UIApplicationExitsOnSuspend</key>
|
||||||
|
<false/>
|
||||||
<key>UIBackgroundModes</key>
|
<key>UIBackgroundModes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>audio</string>
|
<string>audio</string>
|
||||||
|
<string>fetch</string>
|
||||||
|
<string>processing</string>
|
||||||
</array>
|
</array>
|
||||||
|
<key>WKBackgroundModes</key>
|
||||||
|
<array/>
|
||||||
|
<key>WKSupportsAlwaysOnDisplay</key>
|
||||||
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = A95C117329C531C000737618 /* Project object */;
|
containerPortal = A95C117329C531C000737618 /* Project object */;
|
||||||
proxyType = 1;
|
proxyType = 1;
|
||||||
remoteGlobalTrackInfoing = A95C117E29C531C100737618;
|
remoteGlobalIDString = A95C117E29C531C100737618;
|
||||||
remoteInfo = "MusicPlayer Watch App";
|
remoteInfo = "MusicPlayer Watch App";
|
||||||
};
|
};
|
||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
@@ -338,6 +338,7 @@
|
|||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = "MusicPlayer-Watch-App-Info.plist";
|
INFOPLIST_FILE = "MusicPlayer-Watch-App-Info.plist";
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = MusicPlayer;
|
INFOPLIST_KEY_CFBundleDisplayName = MusicPlayer;
|
||||||
|
INFOPLIST_KEY_UIStatusBarHidden = YES;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||||
INFOPLIST_KEY_WKWatchOnly = YES;
|
INFOPLIST_KEY_WKWatchOnly = YES;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
@@ -352,7 +353,7 @@
|
|||||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = 4;
|
TARGETED_DEVICE_FAMILY = 4;
|
||||||
WATCHOS_DEPLOYMENT_TARGET = 9.1;
|
WATCHOS_DEPLOYMENT_TARGET = 9.3;
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
@@ -369,6 +370,7 @@
|
|||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
INFOPLIST_FILE = "MusicPlayer-Watch-App-Info.plist";
|
INFOPLIST_FILE = "MusicPlayer-Watch-App-Info.plist";
|
||||||
INFOPLIST_KEY_CFBundleDisplayName = MusicPlayer;
|
INFOPLIST_KEY_CFBundleDisplayName = MusicPlayer;
|
||||||
|
INFOPLIST_KEY_UIStatusBarHidden = YES;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||||
INFOPLIST_KEY_WKWatchOnly = YES;
|
INFOPLIST_KEY_WKWatchOnly = YES;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
@@ -384,7 +386,7 @@
|
|||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = 4;
|
TARGETED_DEVICE_FAMILY = 4;
|
||||||
VALIDATE_PRODUCT = YES;
|
VALIDATE_PRODUCT = YES;
|
||||||
WATCHOS_DEPLOYMENT_TARGET = 9.1;
|
WATCHOS_DEPLOYMENT_TARGET = 9.3;
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
|||||||
+225
-6
@@ -14,10 +14,57 @@
|
|||||||
filePath = "MusicPlayer Watch App/ContentView.swift"
|
filePath = "MusicPlayer Watch App/ContentView.swift"
|
||||||
startingColumnNumber = "9223372036854775807"
|
startingColumnNumber = "9223372036854775807"
|
||||||
endingColumnNumber = "9223372036854775807"
|
endingColumnNumber = "9223372036854775807"
|
||||||
startingLineNumber = "284"
|
startingLineNumber = "319"
|
||||||
endingLineNumber = "284"
|
endingLineNumber = "319"
|
||||||
landmarkName = "try_download(u:r:e:)"
|
landmarkName = "try_download(u:r:e:)"
|
||||||
landmarkType = "9">
|
landmarkType = "9">
|
||||||
|
<Locations>
|
||||||
|
<Location
|
||||||
|
uuid = "F041D2A4-68A2-4A72-AF55-126A4671C51F - 53ac876fe7baaccd"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "try_download(u: Swift.Optional<Foundation.URL>, r: Swift.Optional<__C.NSURLResponse>, e: Swift.Optional<Swift.Error>) -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "319"
|
||||||
|
endingLineNumber = "319"
|
||||||
|
offsetFromSymbolStart = "3035">
|
||||||
|
</Location>
|
||||||
|
<Location
|
||||||
|
uuid = "F041D2A4-68A2-4A72-AF55-126A4671C51F - 53ac876fe7baaccd"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "try_download(u: Swift.Optional<Foundation.URL>, r: Swift.Optional<__C.NSURLResponse>, e: Swift.Optional<Swift.Error>) -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "319"
|
||||||
|
endingLineNumber = "319"
|
||||||
|
offsetFromSymbolStart = "2394">
|
||||||
|
</Location>
|
||||||
|
<Location
|
||||||
|
uuid = "F041D2A4-68A2-4A72-AF55-126A4671C51F - 53ac876fe7baaccd"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "try_download(u: Swift.Optional<Foundation.URL>, r: Swift.Optional<__C.NSURLResponse>, e: Swift.Optional<Swift.Error>) -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "319"
|
||||||
|
endingLineNumber = "319"
|
||||||
|
offsetFromSymbolStart = "2320">
|
||||||
|
</Location>
|
||||||
|
</Locations>
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
</BreakpointProxy>
|
</BreakpointProxy>
|
||||||
<BreakpointProxy
|
<BreakpointProxy
|
||||||
@@ -30,10 +77,57 @@
|
|||||||
filePath = "MusicPlayer Watch App/ContentView.swift"
|
filePath = "MusicPlayer Watch App/ContentView.swift"
|
||||||
startingColumnNumber = "9223372036854775807"
|
startingColumnNumber = "9223372036854775807"
|
||||||
endingColumnNumber = "9223372036854775807"
|
endingColumnNumber = "9223372036854775807"
|
||||||
startingLineNumber = "287"
|
startingLineNumber = "322"
|
||||||
endingLineNumber = "287"
|
endingLineNumber = "322"
|
||||||
landmarkName = "try_download(u:r:e:)"
|
landmarkName = "try_download(u:r:e:)"
|
||||||
landmarkType = "9">
|
landmarkType = "9">
|
||||||
|
<Locations>
|
||||||
|
<Location
|
||||||
|
uuid = "49177A11-3378-488A-968C-D4D34C28279D - 53ac876fe7baad60"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "try_download(u: Swift.Optional<Foundation.URL>, r: Swift.Optional<__C.NSURLResponse>, e: Swift.Optional<Swift.Error>) -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "322"
|
||||||
|
endingLineNumber = "322"
|
||||||
|
offsetFromSymbolStart = "3867">
|
||||||
|
</Location>
|
||||||
|
<Location
|
||||||
|
uuid = "49177A11-3378-488A-968C-D4D34C28279D - 53ac876fe7baad60"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "try_download(u: Swift.Optional<Foundation.URL>, r: Swift.Optional<__C.NSURLResponse>, e: Swift.Optional<Swift.Error>) -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "322"
|
||||||
|
endingLineNumber = "322"
|
||||||
|
offsetFromSymbolStart = "3177">
|
||||||
|
</Location>
|
||||||
|
<Location
|
||||||
|
uuid = "49177A11-3378-488A-968C-D4D34C28279D - 53ac876fe7baad60"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "try_download(u: Swift.Optional<Foundation.URL>, r: Swift.Optional<__C.NSURLResponse>, e: Swift.Optional<Swift.Error>) -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "322"
|
||||||
|
endingLineNumber = "322"
|
||||||
|
offsetFromSymbolStart = "3108">
|
||||||
|
</Location>
|
||||||
|
</Locations>
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
</BreakpointProxy>
|
</BreakpointProxy>
|
||||||
<BreakpointProxy
|
<BreakpointProxy
|
||||||
@@ -46,10 +140,135 @@
|
|||||||
filePath = "MusicPlayer Watch App/ContentView.swift"
|
filePath = "MusicPlayer Watch App/ContentView.swift"
|
||||||
startingColumnNumber = "9223372036854775807"
|
startingColumnNumber = "9223372036854775807"
|
||||||
endingColumnNumber = "9223372036854775807"
|
endingColumnNumber = "9223372036854775807"
|
||||||
startingLineNumber = "277"
|
startingLineNumber = "312"
|
||||||
endingLineNumber = "277"
|
endingLineNumber = "312"
|
||||||
landmarkName = "try_download(u:r:e:)"
|
landmarkName = "try_download(u:r:e:)"
|
||||||
landmarkType = "9">
|
landmarkType = "9">
|
||||||
|
<Locations>
|
||||||
|
<Location
|
||||||
|
uuid = "26EC7C75-1CAF-4528-A913-46A2A74EC392 - 53ac876fe7baabd6"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "try_download(u: Swift.Optional<Foundation.URL>, r: Swift.Optional<__C.NSURLResponse>, e: Swift.Optional<Swift.Error>) -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "312"
|
||||||
|
endingLineNumber = "312"
|
||||||
|
offsetFromSymbolStart = "3984">
|
||||||
|
</Location>
|
||||||
|
<Location
|
||||||
|
uuid = "26EC7C75-1CAF-4528-A913-46A2A74EC392 - 53ac876fe7baabd6"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "try_download(u: Swift.Optional<Foundation.URL>, r: Swift.Optional<__C.NSURLResponse>, e: Swift.Optional<Swift.Error>) -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "312"
|
||||||
|
endingLineNumber = "312"
|
||||||
|
offsetFromSymbolStart = "4003">
|
||||||
|
</Location>
|
||||||
|
<Location
|
||||||
|
uuid = "26EC7C75-1CAF-4528-A913-46A2A74EC392 - 53ac876fe7baabd6"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "try_download(u: Swift.Optional<Foundation.URL>, r: Swift.Optional<__C.NSURLResponse>, e: Swift.Optional<Swift.Error>) -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "312"
|
||||||
|
endingLineNumber = "312"
|
||||||
|
offsetFromSymbolStart = "719">
|
||||||
|
</Location>
|
||||||
|
<Location
|
||||||
|
uuid = "26EC7C75-1CAF-4528-A913-46A2A74EC392 - 53ac876fe7baabd6"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "try_download(u: Swift.Optional<Foundation.URL>, r: Swift.Optional<__C.NSURLResponse>, e: Swift.Optional<Swift.Error>) -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "312"
|
||||||
|
endingLineNumber = "312"
|
||||||
|
offsetFromSymbolStart = "668">
|
||||||
|
</Location>
|
||||||
|
</Locations>
|
||||||
|
</BreakpointContent>
|
||||||
|
</BreakpointProxy>
|
||||||
|
<BreakpointProxy
|
||||||
|
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
|
||||||
|
<BreakpointContent
|
||||||
|
uuid = "A63D6DC5-02A0-4A47-B9E2-6CF4B772291D"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
filePath = "MusicPlayer Watch App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "118"
|
||||||
|
endingLineNumber = "118"
|
||||||
|
landmarkName = "play()"
|
||||||
|
landmarkType = "7">
|
||||||
|
<Locations>
|
||||||
|
<Location
|
||||||
|
uuid = "A63D6DC5-02A0-4A47-B9E2-6CF4B772291D - 99fd1b50d24bb9f5"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "MusicPlayer_Watch_App.ContentView.play() -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "131"
|
||||||
|
endingLineNumber = "131"
|
||||||
|
offsetFromSymbolStart = "712">
|
||||||
|
</Location>
|
||||||
|
<Location
|
||||||
|
uuid = "A63D6DC5-02A0-4A47-B9E2-6CF4B772291D - 99fd1b50d24bbf20"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "MusicPlayer_Watch_App.ContentView.play() -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "118"
|
||||||
|
endingLineNumber = "118"
|
||||||
|
offsetFromSymbolStart = "769">
|
||||||
|
</Location>
|
||||||
|
<Location
|
||||||
|
uuid = "A63D6DC5-02A0-4A47-B9E2-6CF4B772291D - 99fd1b50d24bbf20"
|
||||||
|
shouldBeEnabled = "Yes"
|
||||||
|
ignoreCount = "0"
|
||||||
|
continueAfterRunningActions = "No"
|
||||||
|
symbolName = "MusicPlayer_Watch_App.ContentView.play() -> ()"
|
||||||
|
moduleName = "MusicPlayer Watch App"
|
||||||
|
usesParentBreakpointCondition = "Yes"
|
||||||
|
urlString = "file:///Users/bill/Desktop/MusicPlayer/MusicPlayer%20Watch%20App/ContentView.swift"
|
||||||
|
startingColumnNumber = "9223372036854775807"
|
||||||
|
endingColumnNumber = "9223372036854775807"
|
||||||
|
startingLineNumber = "118"
|
||||||
|
endingLineNumber = "118"
|
||||||
|
offsetFromSymbolStart = "708">
|
||||||
|
</Location>
|
||||||
|
</Locations>
|
||||||
</BreakpointContent>
|
</BreakpointContent>
|
||||||
</BreakpointProxy>
|
</BreakpointProxy>
|
||||||
</Breakpoints>
|
</Breakpoints>
|
||||||
|
|||||||
Reference in New Issue
Block a user