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()
}
}
Möglicherweise wird das Problem durch ATS (App Transport Security; z. B. nicht mit HTTPS) verursacht? –
AllowArbitaryLoads ist auf YES gesetzt, es muss ein Problem mit ähnlichen iOS-Dateiberechtigungen oder ähnlichem geben – kvetinac97
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) –