Audio 新到这一点,并试图纳入信标和声音得到一切后返回将不会执行
我在这段代码中使用信标,希望有不同颜色和消息标识的区域。在离信标最近的区域,我希望屏幕变成红色,显示您离我太近的信息,并播放警报声。颜色和信息起作用,但声音从不播放。这是我的代码,一定是我在“危险离我太近”一节中使用了let这个词,导致它在它之后不执行任何操作,但是我要将let改成什么呢Audio 新到这一点,并试图纳入信标和声音得到一切后返回将不会执行,audio,beacon,region,Audio,Beacon,Region,我在这段代码中使用信标,希望有不同颜色和消息标识的区域。在离信标最近的区域,我希望屏幕变成红色,显示您离我太近的信息,并播放警报声。颜色和信息起作用,但声音从不播放。这是我的代码,一定是我在“危险离我太近”一节中使用了let这个词,导致它在它之后不执行任何操作,但是我要将let改成什么呢 import Combine import CoreLocation import SwiftUI import AVFoundation class BeaconDetector: NSObject, Ob
import Combine
import CoreLocation
import SwiftUI
import AVFoundation
class BeaconDetector: NSObject, ObservableObject, CLLocationManagerDelegate {
var objectWillChange = ObservableObjectPublisher()
var locationManager: CLLocationManager?
var lastDistance = CLProximity.unknown
var alarm: AVAudioPlayer?
override init() {
super.init()
locationManager = CLLocationManager()
locationManager?.delegate = self
locationManager?.requestWhenInUseAuthorization()
}
func locationManager(_ manager: CLLocationManager,
didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedWhenInUse {
if CLLocationManager.isMonitoringAvailable(for:CLBeaconRegion.self) {
if CLLocationManager.isRangingAvailable() {
startScanning()
}
}
}
}
func startScanning() {
let uuid = UUID(uuidString: "00000000-0000-0000-0000-000000000000")!
let constraint = CLBeaconIdentityConstraint(uuid: uuid)
let beaconRegion = CLBeaconRegion(beaconIdentityConstraint: constraint, identifier: "MyBeacon")
locationManager?.startMonitoring(for: beaconRegion)
locationManager?.startRangingBeacons(satisfying: constraint)
}
func locationManager(_ manager: CLLocationManager, didRange beacons: [CLBeacon], satisfying beaconConstraint: CLBeaconIdentityConstraint) {
if let beacon = beacons.first {
update(distance: beacon.proximity)
} else {
update(distance: .unknown)
}
}
func update(distance: CLProximity) {
lastDistance = distance
self.objectWillChange.send()
}
}
struct BigText: ViewModifier {
func body(content: Content) -> some View {
content
.font(Font.system(size: 72, design: .rounded))
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
}
}
struct ContentView: View {
@ObservedObject var detector = BeaconDetector()
var body: some View {
if detector.lastDistance == .immediate {
return Text("DANGER TOO CLOSE TO ME")
.modifier(BigText())
.background(Color.red)
.edgesIgnoringSafeArea(.all)
let sndurl = Bundle.main.url (forResource: "Alarm", withExtension: "mp3")!
var snd : SystemSoundID = 0
AudioServicesCreateSystemSoundID(sndurl as CFURL, &snd)
AudioServicesPlaySystemSoundWithCompletion (snd) { AudioServicesDisposeSystemSoundID(snd) }
}
else if detector.lastDistance == .near {
return Text("Outer Zone")
.modifier(BigText())
.background(Color.orange)
.edgesIgnoringSafeArea(.all)
} else if detector.lastDistance == .far {
return Text("Far")
.modifier(BigText())
.background(Color.yellow)
.edgesIgnoringSafeArea(.all)
} else {
return Text("UNKNOWN")
.modifier(BigText())
.background(Color.green)
.edgesIgnoringSafeArea(.all)
}
}
感谢return语句导致子程序方法的执行停止。然后,调用该方法的人继续执行,调用方可以使用
return
语句后的值(在本例中为Text
对象)
要解决您询问的特定问题,只需将播放声音的代码移到
return
语句上方,使其实际执行。return语句导致子程序方法的执行停止。然后,调用该方法的人继续执行,调用方可以使用return
语句后的值(在本例中为Text
对象)
要解决您询问的特定问题,只需将播放声音的代码移到return
语句上方,使其实际执行即可