OGeek|极客世界-中国程序员成长平台

标题: ios - NSUrlRequest 在模拟器中有效,但在 iPhone 上无效 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 18:18
标题: ios - NSUrlRequest 在模拟器中有效,但在 iPhone 上无效

我有一个应用程序,它记录麦克风的声音,然后通过 NSUrlRequest 将其发送到我的网站。为了测试它,我添加了从网站播放的音频,这样我就可以听到它是否有效。
当我在模拟器上测试它时,一切正常:录制并上传了音频,我可以听到它,但是当我将它安装到我的 iPhone 上时,我什么也听不见,而且在我的网站上,音频文件损坏了。

我的 TestNahravani.swift 代码:

import UIKit
import AVFoundation

class TestNahravani: UIViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate {


@IBOutlet weak var recordButton: UIButton!
@IBOutlet weak var playButton: UIButton!

var soundRecorder: AVAudioRecorder!
var soundPlayer:AVAudioPlayer?

let fileName = "demo.m4a"

override func viewDidLoad() {
    super.viewDidLoad()
    setupRecorder()
}

@IBAction func recordSound(sender: UIButton) {
    if (sender.titleLabel?.text == "Record"){
        soundRecorder.record()
        sender.setTitle("Stop", for: .normal)
        playButton.isEnabled = false
    } else {
        soundRecorder.stop()
        sender.setTitle("Record", for: .normal)
    }
}

@IBAction func playSound(sender: UIButton) {
    if (sender.titleLabel?.text == "lay"){
        recordButton.isEnabled = false
        sender.setTitle("Stop", for: .normal)
        preparePlayer()
    } else {
        soundPlayer?.stop()
        sender.setTitle("lay", for: .normal)
    }
}

// MARK:- AVRecorder Setup

func setupRecorder() {

    //set the settings for recorder

    let recordSettings = [AVSampleRateKey : NSNumber(value: Float(44100.0)),
                          AVNumberOfChannelsKey : NSNumber(value: 2),
                          AVEncoderAudioQualityKey : NSNumber(value: Int32(AVAudioQuality.max.rawValue)),
                          AVFormatIDKey : NSNumber(value: kAudioFormatMPEG4AAC)]
    var error: NSError?
    do {
        soundRecorder =  try AVAudioRecorder(url: getFileURL() as URL, settings: recordSettings)
    } catch let error1 as NSError {
        error = error1
        soundRecorder = nil
    }

    if let err = error {
        print("AVAudioRecorder error: \(err.localizedDescription)")
    } else {
        soundRecorder.delegate = self
        soundRecorder.prepareToRecord()
    }
}

// MARK:- Prepare AVPlayer

func preparePlayer() {
    var errorX: NSError?




        let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let docsDir: AnyObject=dirPaths[0] as AnyObject
        var recordedFilePath : String = docsDir.appendingPathComponent(fileName)
        let recordedFileURL = getFileURL()

        // "currentFilename", "recordedFilePath" and "recordedFileURL" are all global variables

        // This recording stored at "recordedFileURL" can be played back fine.

        let sendToPath = "http://www.kvetinac97.cz/jt.php"
        let sendToURL = NSURL(string: sendToPath)
        let recording: NSData! = NSData(contentsOf: recordedFileURL as URL)
    if recording == nil {
        recordedFilePath = "FailedUpload"
    }
        let boundary = "--------14737809831466499882746641449----"
        let contentType = "multipart/form-data;boundary=\(boundary)"

        let beginningBoundary = "--\(boundary)"
        let endingBoundary = "--\(boundary)--"

        let header = "Content-Disposition: form-data; name=\"\(fileName)\"; filename=\"\(recordedFilePath)\"\r\n"

        let body = NSMutableData()
        body.append(("\(beginningBoundary)\r\n" as NSString).data(using: String.Encoding.utf8.rawValue)!)
        body.append((header as NSString).data(using: String.Encoding.utf8.rawValue)!)
        body.append(("Content-Type: application/octet-stream\r\n\r\n" as NSString).data(using: String.Encoding.utf8.rawValue)!)
        body.append(recording! as Data) // adding the recording here
        body.append(("\r\n\(endingBoundary)\r\n" as NSString).data(using: String.Encoding.utf8.rawValue)!)

        let request = NSMutableURLRequest()
        request.url = sendToURL! as URL
        request.httpMethod = "OST"
        request.addValue(contentType, forHTTPHeaderField: "Content-Type")
        request.addValue("multipart/form-data", forHTTPHeaderField: "Accept")
        request.httpBody = body as Data

        let session = URLSession.shared
        let task = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
            if let data = NSData(contentsOf: NSURL(string: "http://www.kvetinac97.cz/uploads/demo.m4a")! as URL) {
                do {
                    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
                    try AVAudioSession.sharedInstance().setActive(true)
                    self.soundPlayer = try AVAudioPlayer(data: data as Data, fileTypeHint: AVFileType.m4a.rawValue)
                    self.soundPlayer!.delegate = self
                    self.soundPlayer!.prepareToPlay()
                    self.soundPlayer!.volume = 1.0
                    self.soundPlayer!.play()
                } catch let error1 as NSError {
                    errorX = error1
                    self.soundPlayer = nil
                    print ("Chyba nejaka \(error1)")
                }
            }
            else {
                print ("Smulicka")
            }
        })
        task.resume()


}

func generateBoundaryString() -> String {
    return "Boundary-\(NSUUID().uuidString)"
}

// MARK:- File URL

func getCacheDirectory() -> String {

    let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory,.userDomainMask, true)

    return paths[0]
}

func getFileURL() -> NSURL {

    let path = getCacheDirectory().appending(fileName)

    let filePath = NSURL(fileURLWithPath: path)

    return filePath
}

// MARK:- AVAudioPlayer delegate methods

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    recordButton.isEnabled = true
    playButton.setTitle("lay", for: .normal)
}

// MARK:- AVAudioRecorder delegate methods

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
    playButton.isEnabled = true
    recordButton.setTitle("Record", for: .normal)
}

// MARK:- didReceiveMemoryWarning

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

}



Best Answer-推荐答案


我发现我的问题出在哪里

看起来,iPhone 模拟器不需要激活 AVAudioSession,而真正的 iPhone 则需要。

因此可以通过添加轻松修复

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryRecord)
try AVAudioSession.sharedInstance().setActive(true)

audioRecorder 初始化之前。

关于ios - NSUrlRequest 在模拟器中有效,但在 iPhone 上无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45143487/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://jike.in/) Powered by Discuz! X3.4