質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1291閲覧

AVAudioRecorder 録音をするときにコンソールにエラーが出る (PropertyID=1667788144 is NULL)

techiro

総合スコア10

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/16 08:13

編集2020/05/17 02:42

私は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

###エラーまでの手順

  1. 録音するフォルダを生成. 名前はsampleMusicで生成
/Users/username/Library/Containers/com.username.RecordPlay/Data/Music/RecordPlay/sampleMusic
  1. sampleMusicフォルダ内に録音ファイルを生成する. 名前はrecordボタンを押した時の日時で生成
  2. 2.で生成した録音ファイルを使ってAVAudioRecorderにファイルのパスを渡す
  3. 録音開始
  4. ====Error=====
  5. エラーが出るが録音は実行できる
  6. 録音停止した後に再生
  7. 問題なく再生される.

今回使用したソースコードは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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/05/16 18:23

AddInstanceForFactory の警告は重要ではないという説もある ( https://stackoverflow.com/a/58290822/1019868 ) ようですが、リジェクトの理由はそれですか? タイムゾーンが日本標準時じゃないとクラッシュしますが、そのせいでは?
techiro

2020/05/23 12:03 編集

ありがとうございます. 今回提出したアプリを確認したところAddInstanceForFactoryのエラーが出ていなかったため 質問を修正させていただきました. FormatLogicでファイル名をLocationに依存しない書き方に変更しました. (クラッシュの1つの原因でした.)
guest

回答1

0

自己解決

#お礼
hoshi-takanoriさんの"タイムゾーンが日本標準時じゃないとクラッシュしますが、そのせいでは?"の助言のおかげでクラッシュしていた原因の1つを解決することができました.(hoshi-takanoriさんありがとうございます!)

#結論
この質問であげたエラーコードはクラッシュの原因ではありませんでした.
この質問を見てくださった方々に感謝します.

#クラッシュの原因を調べるために私がとった行動
クラッシュの原因を私が予想して解決するのは博打をするようなもので,解決するかしないかを当てずっぽうでやるのはとても非効率な行動だと気付きました.
そのため,敬遠していたApp Store Connectでのレビューに添付されたクラッシュログ(拡張子は.log)を見るしかないと思いmacアプリのクラッシュログを解析できる方法を調べました.
以下にその方法を示します.

  1. クラッシュログをある場所にダウンロードする(ここでは~/Desktop/LOG)
  2. Xcodeを開きメニューバー→Window→Organizerを開いて自分がアップロードしたArciveを右クリック

イメージ説明

3.Show in Finderでフォルダを開く.→dSYMs→自分のappのdsYMsファイルをコピーして~/Desktop/LOGに保存
イメージ説明

  1. 次にProduct→Applications→自分のappをコピーして~/Desktop/LOGに保存

  ここまでで下準備が完了

5.ターミナルを使って先ほど作成したフォルダ(~/Desktop/LOG)で

xcrun dwarfdump --uuid MyApp.app/Contents/MacOS/MyApp

を実行(MyAppは自分のアプリ名)するとUUIDを取得できる.→ 2421317E--79BF-3738-B831-77E365D6BD34

  1. このUUIDをコピーしてクラッシュログで検索します.
→0x103184000 - 0x10319eff7 +com.Awesomesauce.MyApp (1.0 - 3) <2421317E-79BF-3738-B831-77E365D6BD34> /Applications/MyApp.app/Contents/MacOS/MyApp

最初のロードアドレスをコピー→0x103184000

  1. クラッシュを起こしたであろうログを見つける.

  0x103184000で検索したら出るはず.今回は0x000000010318e964を調べる.

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 libobjc.A.dylib 0x00007fff837c97aa objc_retain + 26 1 com.Awesomesauce.MyApp 0x000000010318e964 0x103184000 + 43364 2 libdispatch.dylib 0x00007fff891f41bb _dispatch_call_block_and_release + 12 3 libdispatch.dylib 0x00007fff891f128d _dispatch_client_callout + 8

8. 次のコマンドを叩く

atos -o MyApp.app/Contents/MacOS/MyApp -arch x86_64 -l 0x103184000 0x000000010318e964
  1. どのコードでエラーが生じているかがわかる.

以上でクラッシュログを解析する方法でした.思っても見なかったところがクラッシュしていて驚きました!

この投稿が誰かの助けになれば嬉しいです!

#アプリを公開することができました!

英語学習支援アプリ
イメージ説明

英語学習をより効率よく勉強できる音楽再生プレーヤーになってます.
是非ダウンロードして使って見てください!

投稿2020/05/23 12:50

編集2020/05/23 13:24
techiro

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問