前提・実現したいこと
Swiftで、一定時間ごとにダミー着信+応答すると音声再生ができるアプリを作っています。
- 音声が再生されているor通話状態の間だけ、画面に切電ボタンが表示される
- 音声が再生されていないor通話状態ではないときは切電ボタンは非表示になる
これが目標です。
ふわっと消えるとかはできたら嬉しいけど、とりあえず消えるだけでも実装したいです。
発生している問題
button.isHidden = false
これを使うというのは分かるのですが、
音声の再生状態や通話状態に対応させたい場合、どこに書き込めば良いのかわかりません。
CallKitのCXCallObserverらへんでもできるのかもしれませんが、これもうまく合体できませんでした…
該当のソースコード
丸ごと貼ります。
swift
1import UIKit 2import CallKit 3import PushKit 4import AVFoundation 5 6var callON = false 7var callNow = false 8var uuid = UUID() 9 10class ViewController: UIViewController { 11 12 var audioPlayer: AVAudioPlayer! 13 let url = Bundle.main.bundleURL.appendingPathComponent("voice.mp3") 14 15 override func viewDidLoad() { 16 17 super.viewDidLoad() 18 19 //声をバッファに読み込んでおく 20 do { 21 try audioPlayer = AVAudioPlayer(contentsOf: url) 22 audioPlayer.prepareToPlay() 23 } catch { 24 print(error) 25 } 26 27 let audioSession = AVAudioSession.sharedInstance() 28 do { 29 try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.voiceChat, options: AVAudioSession.CategoryOptions.duckOthers) 30 //声を上のスピーカーから鳴らす 31 try audioSession.overrideOutputAudioPort(.none) 32 try audioSession.setActive(true) 33 } catch { 34 debugPrint(error.localizedDescription) 35 } 36 37 Timer.scheduledTimer( 38 timeInterval: 10, 39 target: self, 40 selector: #selector(self.vibrate(_:)), 41 userInfo: nil, 42 repeats: false ) 43 44 45 } 46 47 48 @objc func call(_ sender: Any) { 49 while (audioPlayer.isPlaying == false) { 50 print("再生準備中…") 51 audioPlayer.currentTime = 0 52 audioPlayer.play() 53 } 54 callNow = true 55 } 56 57 @objc func vibrate(_ sender: Timer) { 58 59 if ( callNow == false ) { 60 uuid = UUID() 61 let provider = CXProvider(configuration: CXProviderConfiguration(localizedName: "")) 62 provider.setDelegate(self, queue: nil) 63 let update = CXCallUpdate() 64 update.remoteHandle = CXHandle(type: .generic, value: "非通知") 65 provider.reportNewIncomingCall(with: uuid, update: update, completion: { error in }) 66 print("着信中") 67 } 68 } 69 70 @objc func end(_ sender: Any){ 71 72 let controller = CXCallController() 73 let transaction = CXTransaction(action:CXEndCallAction(call: uuid)); 74 controller.request(transaction,completion: { error in 75 if let error = error { 76 print(error) 77 } else { 78 print("電話が切れる") 79 } 80 }) 81 82 } 83 84 85 @IBAction func endButton(_ sender: Any) { 86 print("EndButton") 87 end((Any).self) 88 } 89 90 91} 92 93extension ViewController: CXProviderDelegate { 94 95 func providerDidReset(_ provider: CXProvider) { 96 print("providerDidReset") 97 } 98 99 func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) { 100 print("応答") 101 action.fulfill() 102 call((Any).self) 103 } 104 105 func provider(_ provider: CXProvider, perform action: CXEndCallAction) { 106 print("音声終了") 107 audioPlayer.stop() 108 callNow = false 109 action.fulfill() 110 111 Timer.scheduledTimer( 112 timeInterval: 4, 113 target: self, 114 selector: #selector(self.vibrate(_:)), 115 userInfo: nil, 116 repeats: false ) 117 118 } 119 120} 121 122 123extension ViewController: AVAudioPlayerDelegate { 124 func playSound(name: String) { 125 guard let path = Bundle.main.path(forResource: name, ofType: "mp3") else { 126 print("音源ファイルが見つかりません") 127 return 128 } 129 130 do { 131 // AVAudioPlayerのインスタンス化 132 audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: path)) 133 134 // AVAudioPlayerのデリゲートをセット 135 audioPlayer.delegate = self 136 137 // 音声の再生 138 audioPlayer.play() 139 } catch { 140 } 141 } 142 143} 144
試したこと
endButton.isHidden = false
とりあえずこれを、
- @objc func vibrateの中
- callNow = Trueの後ろ
あたりに貼ってみたのですが…
Value of type '(Any) -> ()' has no member 'isHidden'
このエラーが出てきてしまいます。
補足情報(FW/ツールのバージョンなど)
- Xcodeは12.4
- Swiftは4.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/28 09:21
2021/02/28 09:30
2021/02/28 15:13