2017-07-17 4 views
2

Ich habe eine App, die den Ton vom Mikrofon aufzeichnet und dann über NSUrlRequest an meine Website sendet. Um es zu testen, fügte ich hinzu, dass Audio von der Website gespielt wird, so dass ich hören kann, ob es funktioniert hat.
Wenn ich es auf Simulator teste, funktioniert alles gut: Audio wird aufgezeichnet und hochgeladen und ich kann es hören, aber wenn ich es auf meinem iPhone installiere, kann ich nichts hören und auf meiner Website gibt es eine beschädigte Audiodatei.NSUrlRequest funktioniert im Simulator, aber nicht auf dem iPhone

Mein TestNahravani.swift Code:

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 == "Play"){ 
     recordButton.isEnabled = false 
     sender.setTitle("Stop", for: .normal) 
     preparePlayer() 
    } else { 
     soundPlayer?.stop() 
     sender.setTitle("Play", 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 = "POST" 
     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("Play", 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() 
} 

}

+0

Möglicherweise wird das Problem durch ATS (App Transport Security; z. B. nicht mit HTTPS) verursacht? –

+0

AllowArbitaryLoads ist auf YES gesetzt, es muss ein Problem mit ähnlichen iOS-Dateiberechtigungen oder ähnlichem geben – kvetinac97

+0

Sie können Dateiberechtigungsprobleme überprüfen, indem Sie überprüfen, ob die Variable "recording" korrekt initialisiert wurde. Aber ich würde hier keine Probleme erwarten. Vielleicht sollten Sie versuchen, ein Dummy-Datenobjekt (wie eine Textzeichenfolge) zu senden und zu überprüfen, ob der Server die richtigen Daten empfängt und falls nicht, können Ihnen die empfangenen Daten Hinweise geben (wie eine versteckte "Fehlermeldung", die zufällig übertragen wurde) anstelle der erwarteten Daten) –

Antwort

0

habe ich herausgefunden, wo mein Problem

war, wie es scheint, hat iPhone-Simulator nicht AVAudioSession benötigen, während echte aktiviert werden iPhone tut es.

So kann es leicht

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

vor Audiorecorder Initialisierung mit dem Hinzufügen fixiert werden.

Verwandte Themen