私はmacOS版の音楽再生・録音アプリをmacOSで開発しています.今回,音声を録音する機能を作成しています.
コンソールのエラーを無視すれば実現したい機能はできているのですが,アプリを公開しようと考えていてAppStoreにリジェクトされてしまいました.エラーの意味などが全く想像つかないため質問させていただきます.
前提・実現したいこと
音声を録音したあとに再生する機能を作成しています.
録音部分→AVAudioRecorder
再生部分→AVAudioPlayer
今回の問題となっている部分は録音部分です.
発生している問題・エラーメッセージ
今回質問するエラーメッセージ↓
2020-05-17 10:49:22.539222+0900 RecordPlay[10856:347602] PropertyID=1667788144 is NULL
AppStore側からはrecordボタンを押した時にアプリがクラッシュすると返事がきていて,今回のエラーがクラッシュとは全く問題ないのかもしれないですが,エラーメッセージがこれしか出ないためこのエラーがクラッシュの問題ではないかと思い質問させていただきました.
App Store側からクラッシュのlogを添付してもらいましたが知識不足で解読ができていない状況です.
追記:
エラーメッセージを修正させてもらいました.
今回の質問では提出したアプリではなく新規のプログラムを作成して同じエラーを出させました.
しかし,
提出したアプリをもう一度確認したところ,出力されたエラーが少し異なりましたので今回の質問のエラーメッセージを修正させていただきます
修正前のエラーメッセージ(最初の3つのエラーメッセージは無視してください)↓
020-05-16 14:57:36.000103+0900 RecordPlay[86623:20773184] [plugin] AddInstanceForFactory: No factory registered for id <CFUUID 0x60000025d040> F8BB1C28-BAE8-11D6-9C31-00039315CD46 2020-05-16 14:57:36.057022+0900 RecordPlay[86623:20773184] HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine 2020-05-16 14:57:36.057460+0900 RecordPlay[86623:20773184] HALC_ShellDriverPlugIn::Open: Can't get a pointer to the Open routine 2020-05-16 14:57:36.065608+0900 RecordPlay[86623:20773184] PropertyID=1667788144 is NULL
###エラーまでの手順
- 録音するフォルダを生成. 名前はsampleMusicで生成
/Users/username/Library/Containers/com.username.RecordPlay/Data/Music/RecordPlay/sampleMusic
- sampleMusicフォルダ内に録音ファイルを生成する. 名前はrecordボタンを押した時の日時で生成
- 2.で生成した録音ファイルを使ってAVAudioRecorderにファイルのパスを渡す
- 録音開始
- ====Error=====
- エラーが出るが録音は実行できる
- 録音停止した後に再生
- 問題なく再生される.
今回使用したソースコードはGithubにのせてます.
シュミレーターで実行した時には何も問題なく実行できるのですが,このエラーがあるとアプリ公開ができないので困っています.
該当のソースコード
今回使用したソースコードはGithubにのせてます.
ViewController.swift
1import Cocoa 2import AVFoundation 3class ViewController: NSViewController,AVAudioRecorderDelegate,AVAudioPlayerDelegate { 4 var recorder : AVAudioRecorder! 5 var studentPlayer:AVAudioPlayer! 6 var recordLogic = RecordLogic() 7 var musicName = "sampleMusic" 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 11 // Do any additional setup after loading the view. 12 } 13 14 @IBAction func pushRecordBtn(_ sender: NSButton) { 15 16 17 if sender.state == NSControl.StateValue.on{ 18 sender.image = NSImage(named: "NSTouchBarPauseTemplate") 19 //録音準備 20 let musicFolder = recordLogic.makeMusicFolder(with: musicName) 21 //録音する音声ファイルを生成 22 let recordFile = recordLogic.makeMusicFile(with: musicFolder) 23 24 do{ 25 recorder = try AVAudioRecorder(url: recordFile, settings: [:]) 26 recorder!.delegate = self 27 recorder!.prepareToRecord() 28 }catch{ 29 print("Error initialize recorder, (error.localizedDescription)") 30 } 31 32 //録音開始 33 recorder!.record() 34 35 }else{ 36 37 sender.image = NSImage(named: "NSTouchBarRecordStartTemplate") 38 39 recorder!.stop() 40 } 41 42 } 43 44 45 @IBAction func pushPlayBtn(_ sender: NSButton) { 46 47 guard (recorder?.url != nil && recorder?.isRecording != true ) else { 48 sender.setNextState() 49 return 50 } 51 52 if sender.state == NSControl.StateValue.on{ 53 54 do{ 55 print("recorder!.url→(recorder!.url)") 56 studentPlayer = try AVAudioPlayer(contentsOf: recorder!.url) 57 studentPlayer.delegate = self 58 }catch{ 59 print(error.localizedDescription) 60 } 61 // 62 studentPlayer.play() 63 64 sender.image = NSImage(named: "NSTouchBarPauseTemplate") 65 66 }else{ 67 studentPlayer.pause() 68 sender.image = NSImage(named: "NSTouchBarPlayTemplate") 69 } 70 71 } 72 73}
録音フォルダとファイルの名前などの設定コード↓
RecorderLogic.swift
1 2import Foundation 3 4struct RecordLogic { 5 6 let format:DateFormatter! 7 8 init() { 9 self.format = DateFormatter() 10 format.timeStyle = .full 11 format.dateStyle = .long 12 format.locale = Locale(identifier: "ja_JP") 13 } 14 //MARK: -Saving Recording Data 15 16 mutating func makeMusicFolder(with musicName:String) -> String{ 17// let saveDir = FileManager.default.currentDirectoryPath + "/Music/" + musicName 18 let saveDir = NSHomeDirectory() + "/Music/RecordPlay/" + musicName 19 20 do { 21 try FileManager.default.createDirectory( atPath: saveDir, withIntermediateDirectories: true, attributes: nil) 22 23 24 } catch { 25 print("Error makeing Record Data Folder,(error)") 26 } 27 28 return saveDir 29 } 30 31 func makeMusicFile(with musicFolder:String) -> URL{ 32 //fileのパスを生成 33 let saveFileName = returnFileName(with: Date()) + ".caf" 34 let filePath = musicFolder + "/" + saveFileName 35 let stringurl = "file://" + filePath 36// fileURL = URL(fileURLWithPath: documentDirPath) 37 //fileのパスをStringからURLに変換 38 let encodeUrlString = stringurl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! 39 40 return URL(string: encodeUrlString)! 41 } 42 43 44 45 46 func returnFileName(with now:Date) -> String { 47 let str = self.format.string(from: now) 48 let longdata = str.replacingCharacters(in: str.range(of: "日本標準時")!, with: "") 49 return longdata.components(separatedBy: CharacterSet.whitespaces).joined() 50 } 51 52 53} 54
補足情報(FW/ツールのバージョンなど)
Swift Version 11.3.1 (11C504)
回答1件
あなたの回答
tips
プレビュー