前提・実現したいこと
appleのサイト(リンク内容)からのものです。
キャプチャの承認を確認してリクエストする
キャプチャセッションを設定する前に、必ずメソッドをテストしてください。ユーザーがキャプチャ権限をまだ付与または拒否していない場合、承認ステータスはです。この場合、メソッドを使用して、ユーザーにプロンプトを表示するようにiOSに指示します。AVCaptureDevice authorizationStatus(for:)AVAuthorizationStatus.notDeterminedrequestAccess(for:completionHandler:)
上の文章がよくわかりません。
初めのアプリのinfo.plistの説明は、写真がついていたので、どこに設定すればいいかを把握できました。
しかし、キャプチャの承認を確認してリクエストするがわかりせん。
どこに以下のコードを挿入すればいいですか?
下記のコードにボイスメモを入れたいと思っています。
今はまだ、入れてません。
該当のソースコード
newTask
1 2// 3// newTask.swift 4// voiceAPP 5// 6// Created by user on 2020/09/06. 7// Copyright © 2020 user. All rights reserved. 8// 9 10import SwiftUI 11import AVFoundation 12 13 14 15 16struct newTask: View { 17 18 19 20 21 @State var task: String = "" 22 @State var task2: String = "" 23 @State var time: Date? = Date() 24 @State var category: Int16 = Entity.Category.ImpUrg_1st.rawValue 25 var categories: [Entity.Category] 26 = [.ImpUrg_1st, .ImpNUrg_2nd, .NImpUrg_3rd, .NImpNUrg_4th, .NImpNUrg_5th, .NImpNUrg_6th] 27 @Environment(.managedObjectContext) var viewContext 28 29 fileprivate func save() { 30 do { 31 try self.viewContext.save() 32 } catch { 33 let nserror = error as NSError 34 fatalError("Unresolved error (nserror), (nserror.userInfo)") 35 } 36 } 37 38 //enviromentは、 39 @Environment(.presentationMode) var presentationMode 40 var body: some View { 41 NavigationView { 42 Form { 43 Section(header: Text("タスク")) { 44 TextField("情報の入力", text: $task)} 45 46 47 48 49 50 Section(header: Toggle(isOn: Binding(isNotNil: $time, defaultValue: Date())){Text("時間設定")}) { 51 if time != nil { 52 DatePicker(selection: Binding($time, Date()), label: { Text("日時")}) 53 } else { 54 Text("時間未設定").foregroundColor(.secondary)}} 55 56 57 58 59 Picker(selection: $category, label: Text("種類")) { 60 ForEach(categories, id: .self) { category in 61 HStack { 62 CategoryImage(category) 63 Text(category.toString()) 64 }.tag(category.rawValue)}} 65 66 67 68 69 Section(header: Text("操作")) { 70 Button(action: { 71 self.presentationMode.wrappedValue.dismiss() 72 }) { 73 HStack(alignment: .center) { 74 Image(systemName: "minus.circle.fill") 75 Text("キャンセル") 76 }.foregroundColor(.red)}} 77 78 79 80 81 Section(header: Text("メモ")) { 82 TextField("メモ", text: $task2)} 83 84 85 86 }.navigationBarTitle("内容の追加") 87 .navigationBarItems(trailing: Button(action: { 88 Entity.create(in: self.viewContext, category: Entity.Category(rawValue: self.category) ?? .ImpUrg_1st, 89 task: self.task, time: self.time) //task2: self.task 90 91 92 93 94 95 self.save() 96 //dismissで画面を閉じる 97 self.presentationMode.wrappedValue.dismiss() 98 }) { 99 Text("保存") 100 }) 101 } 102 } 103} 104 105struct newTask_Previews: PreviewProvider { 106 static let context = (UIApplication.shared.delegate as! AppDelegate) 107 .persistentContainer.viewContext 108 static var previews: some View { 109 newTask() 110 .environment(.managedObjectContext, context) 111 } 112} 113 114
該当のソースコード
EditTask
1 2// 3// EditTask.swift 4// voiceAPP 5// 6// Created by user on 2020/09/07. 7// Copyright © 2020 user. All rights reserved. 8// 9 10import SwiftUI 11import AVFoundation 12 13 14struct EditTask: View { 15 @ObservedObject var todo: Entity 16 @State var showingSheet = false 17 var categories: [Entity.Category] 18 = [.ImpUrg_1st, .ImpNUrg_2nd, .NImpUrg_3rd, .NImpNUrg_4th, .NImpNUrg_5th, .NImpNUrg_6th] 19 @Environment(.managedObjectContext) var viewContext 20 21 fileprivate func save() { 22 do { 23 try self.viewContext.save() 24 } catch { 25 let nserror = error as NSError 26 fatalError("Unresolved error (nserror), (nserror.userInfo)") 27 } 28 } 29 30 fileprivate func delete() { 31 viewContext.delete(todo) 32 save() 33 } 34 35 //enviromentは、 36 37 @Environment(.presentationMode) var presentationMode 38 39 var body: some View { 40 41 Form { 42 Section(header: Text("タスク")) { 43 TextField("情報の入力", text: Binding($todo.task,"内容の編集")) 44 45 46 } 47 Section(header: Toggle(isOn: Binding(isNotNil: $todo.time, defaultValue: Date())){Text("時間設定")}) { 48 if todo.time != nil { 49 DatePicker(selection: Binding($todo.time, Date()), label: { Text("日時")}) 50 } else { 51 Text("時間未設定").foregroundColor(.secondary) 52 } 53 } 54 Picker(selection: $todo.category, label: Text("種類")) { 55 ForEach(categories, id: .self) { category in 56 HStack { 57 CategoryImage(category) 58 Text(category.toString()) 59 }.tag(category.rawValue) 60 } 61 } 62 63 Section(header: Text("メモ")) { 64 TextField("メモ", text: Binding($todo.task2,"メモ")) 65 } 66 67 68 Section(header: Text("操作")) { 69 Button(action: { 70 self.showingSheet = true 71 72 }) { 73 HStack(alignment: .center) { 74 Image(systemName: "minus.circle.fill") 75 Text("削除") 76 }.foregroundColor(.red)}} 77 78 79 80 81 82 }.navigationBarTitle("内容の編集") 83 .navigationBarItems(trailing: Button(action: { 84 self.save() 85 //dismissで画面を閉じる 86 self.presentationMode.wrappedValue.dismiss() 87 }) { 88 Text("閉じる") 89 }) 90 .actionSheet(isPresented: $showingSheet) { 91 ActionSheet(title: Text("タスクの削除"), message: Text("情報を削除します。よろしいですか?"), buttons: [.destructive(Text("削除")) { 92 self.delete() 93 self.presentationMode.wrappedValue.dismiss() 94 }, 95 .cancel(Text(" キャンセル")) 96 ]) 97 } 98 } 99} 100 101struct EditTask_Previews: PreviewProvider { 102 static let context = (UIApplication.shared.delegate as! AppDelegate) 103 .persistentContainer.viewContext 104 static var previews: some View { 105 let newTodo = Entity(context: context) 106 return NavigationView { 107 EditTask(todo: newTodo) 108 .environment(.managedObjectContext, context) 109 } 110 } 111} 112 113
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
> それがよくわかりません。
初めのアプリのinfo.plistの説明は、写真がついていたので、どこに設定すればいいかを把握できました。
この部分の、「写真がついていたので、どこに設定すればいいのかを把握できました」というのは、テキストか何かみて、同じようにやってみた、ということでしょうか。
写真があり、自分のXcodeと画面が同じだったので、その通りにできたということです。
その「写真」というのが何らかの参考書であれば、そこに書かれていた手順と同じ手順で設定できます。
「 NSCameraUsageDescription 」というキー名で、任意の文字列(メッセージとして出したい文字列)をInfo.plist に入力すれば良いとおもいますが、いかがでしょうか。
すみません。写真は他のサイトでした。
アプリがデバイスカメラを使用している場合は、アプリのInfo.plistファイルにNSCameraUsageDescriptionキーを含めます。
アプリがデバイスマイクを使用する場合は、アプリのInfo.plistファイルにNSMicrophoneUsageDescriptionキーを含めます。
上のものはできました。
キャプチャの承認を確認してリクエストする ここからがどこにコードなどを入力するのかがわかりません。
では、現在までできているコードを「ご質問本文」に追記していただけますでしょうか。
それを見ないことには、どこまで記述できていて、どこが足りないのか判断できないので、ご協力よろしくお願いします。
わかりました。
自分の作ったTodoアプリの編集画面で「タイトル、メモ」の記入できるものと合わせて音声を保存できる桃のを作りたいと思っています。
タグが「Swift」なので、Swiftの話だと思っていました。
これは「SwiftUI」なので、また異なった話になってくるかと思います。
私は SwiftUI での記述方法は知らないので、別の方の回答を得た方がいいかと思います。
ただ、このままだと質問が注目されないため、タグを「SwiftUI」に変更し、タイトルを「SwiftUIでキャプチャの承認を確認してリクエストする方法」など、もっとわかりやすいタイトルにしてみてはいかがでしょうか。
了解です。ありがとうございます。変更します。
読みにくいサイトですが、下記のような情報もありました。
https://www.iosapptemplates.com/blog/swiftui/photo-camera-swiftui
SwiftUIから、Swiftのメソッドを呼んで実現しているようです。
書き忘れてましたが、私がやりたいことは、録音でした、
そうすると、質問タイトルとやりたいことが一致していないかと思います。
「キャプチャ」というと「撮影」と解釈されることが多いので、「キャプチャの承認を確認してリクエストする」ではなく、「録音の承認を確認してリクエストする」のほうがいいのではないでしょうか。
了解です。直ちに変更します。
あなたの回答
tips
プレビュー