Новичок в этом и попытка включить маяки и звук «Все после возвращения» не будет выполнено - PullRequest
1 голос
/ 25 апреля 2020

Я использую маяки в этом коде и хочу, чтобы регионы были обозначены разными цветами и сообщениями. В ближайшем к маяку районе я хочу, чтобы экран покраснел, получил сообщение о том, что вы слишком близко от меня, и раздастся звуковой сигнал. Цвет и сообщение работают, но звук никогда не воспроизводится. Вот мой код, это должно быть мое использование слова let в разделе «Опасность слишком близка ко мне», которое заставляет его ничего не выполнять после него, но что мне изменить в let?

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)


    }
}

Спасибо

1 Ответ

0 голосов
/ 25 апреля 2020

Оператор return останавливает выполнение метода подпрограммы. Затем выполнение возобновляется с тем, кто вызвал этот метод, и значение после оператора return (в данном случае объект Text) становится доступным для вызывающей стороны.

Для устранения указанной проблемы c вы спросите о, просто переместите код, где вы воспроизводите звук, над оператором return, чтобы он действительно выполнялся.

...