Siri Shortcuts AVAudioRecorder работает только первый раз после предоставления разрешений - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь записать звук из Siri UI Intent, но получаю странное поведение, когда запись работает только на симуляторе, а на устройстве - только в первый раз после нажатия «ОК» в предупреждении о разрешении микрофона, но все сборки послеэта запись на устройстве не работает.Кто-нибудь имеет представление, что делать на?

Уже пытались добавить NSMicrophoneUsageDescription и запросить AVAudioSession requestRecordPermission из кода:

func startRecording() {
        let dirPath =  NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
        let recordName = "record.wav"
        self.audioURL = URL(fileURLWithPath: dirPath + "/" + recordName)
        let session = AVAudioSession.sharedInstance()
        let microPhoneStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.audio)
        print(microPhoneStatus)
            do {
                try session.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.default, options: AVAudioSession.CategoryOptions.duckOthers)

                //            try session.setCategory(AVAudioSession.Category.playAndRecord, with:.defaultToSpeaker)
            } catch {
                print(error)
            }

            guard let recorder  = try? AVAudioRecorder(url: self.audioURL, settings: [:]) else {
                self.finishRecording(success: false)
                return
            }


            self.audioRecorder = recorder
            self.audioRecorder.isMeteringEnabled = true
            self.audioRecorder.delegate = self
            self.audioRecorder.prepareToRecord()
            self.audioRecorder.record()
     }


@objc func recordingCallback() {
        guard let audioRecorder = self.audioRecorder else { return }
        audioRecorder.updateMeters()
        let alpha: Double = 0.5
        let peakPowerForChannel = pow(3, (0.07 * audioRecorder.peakPower(forChannel: 0)))
        let lowPassResults = Double(alpha) * Double(peakPowerForChannel) + (1.0 - alpha)

        UIView.animate(withDuration: 0.5, delay: 0.0, options: [.allowUserInteraction], animations: {
            self.someButton.transform = CGAffineTransform(scaleX: CGFloat(lowPassResults * 2.0),y: CGFloat(lowPassResults * 2.0))
        }, completion: nil)
    }
...