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

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

ただいまの
回答率

90.53%

  • Swift

    7210questions

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

  • Xcode

    4082questions

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

スヌーズの音源を変更したいのです。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 96

flarefactory

score 2

 前提・実現したいこと

スヌーズの度にランダムに流れる音源を、選択した音源によってグループ別けしたいと考えています。エラーは出ないのですが、何を選択しても最後のグループしか流れません。
本当はランダムではなく順番に流れるのが理想なのですが、それも判っていない初心者です。

 該当のソースコード

import UIKit
import Foundation
import AudioToolbox
import AVFoundation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, AVAudioPlayerDelegate, AlarmApplicationDelegate{


    var window: UIWindow?
    var audioPlayer: AVAudioPlayer?
    let alarmScheduler: AlarmSchedulerDelegate = Scheduler()
    var alarmModel: Alarms = Alarms()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        var error: NSError?
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        } catch let error1 as NSError{
            error = error1
            print("セッションを設定できませんでした。error:\(error!.localizedDescription)")
        }
        do {
            try AVAudioSession.sharedInstance().setActive(true)
        } catch let error1 as NSError{
            error = error1
            print("アクティブなセッションができませんでした。error:\(error!.localizedDescription)")
        }
        window?.tintColor = UIColor.blue

        return true
    }

    //フォアグラウンドでアプリケーションを使用するときにローカル通知を受け取る
    func application(_ application: UIApplication, didReceive notification: UILocalNotification) {

        //警告ウィンドウを表示する
        let storageController = UIAlertController(title: "ナマケモノめっ!", message: "目醒めるべきか 鍛えるか", preferredStyle: .alert)
        var isSnooze: Bool = false
        var soundName: String = ""
        var index: Int = -1
        if let userInfo = notification.userInfo {
            isSnooze = userInfo["snooze"] as! Bool
            soundName = userInfo["soundName"] as! String
            index = userInfo["index"] as! Int
        }

        playSound(soundName)
        //スヌーズのスケジュール通知
        if isSnooze {
            let snoozeOption = UIAlertAction(title: "鍛えるっ!", style: .default) {
                (action:UIAlertAction)->Void in self.audioPlayer?.stop()
                AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate)
                self.alarmScheduler.setNotificationForSnooze(snoozeMinute: 1, soundName: soundName, index: index)
            }
            storageController.addAction(snoozeOption)
        }
        let stopOption = UIAlertAction(title: "目醒めるっ!", style: .default) {
            (action:UIAlertAction)->Void in self.audioPlayer?.stop()
            AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate)
            self.alarmModel = Alarms()
            self.alarmModel.alarms[index].onSnooze = false
            //UIを変更する
            var mainVC = self.window?.visibleViewController as? MainAlarmViewController
            if mainVC == nil {
                let storyboard = UIStoryboard(name: "Main", bundle: nil)
                mainVC = storyboard.instantiateViewController(withIdentifier: "Alarm") as? MainAlarmViewController
            }
            mainVC!.changeSwitchButtonState(index: index)
        }

        storageController.addAction(stopOption)
        window?.visibleViewController?.navigationController?.present(storageController, animated: true, completion: nil)
    }

    //アプリがバックグラウンドでスヌーズ通知するハンドラ
    func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, for notification: UILocalNotification, completionHandler: @escaping () -> Void) {
        var index: Int = -1
        var soundName: String = ""
        if let userInfo = notification.userInfo {
            soundName = userInfo["soundName"] as! String
            index = userInfo["index"] as! Int
        }
        self.alarmModel = Alarms()
        self.alarmModel.alarms[index].onSnooze = false
        if identifier == Id.snoozeIdentifier {
            alarmScheduler.setNotificationForSnooze(snoozeMinute: 1, soundName: soundName, index: index)
            self.alarmModel.alarms[index].onSnooze = true
        }
        completionHandler()
    }

    //登録されたすべてのNSNotificationをデバッグ用に出力する
    func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {

        print(notificationSettings.types.rawValue)
    }


    //AlarmApplicationDelegateプロトコル
    func playSound(_ soundName: String) {

        //バイブ初期動作を設定する
        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        //バイブのコールバックを設定する
        AudioServicesAddSystemSoundCompletion(SystemSoundID(kSystemSoundID_Vibrate),nil,nil,
            { (_:SystemSoundID, _:UnsafeMutableRawPointer?) -> Void in
                AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        },nil)
        //音源をランダムに選択
        let url1 = URL(fileURLWithPath: Bundle.main.path(forResource: "Body", ofType: "mp3")!)
        let url2 = URL(fileURLWithPath: Bundle.main.path(forResource: "Body-1", ofType: "mp3")!)
        let url3 = URL(fileURLWithPath: Bundle.main.path(forResource: "Body-2", ofType: "mp3")!)
        let url4 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice", ofType: "mp3")!)
        let url5 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice-1", ofType: "mp3")!)
        let url6 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice-2", ofType: "mp3")!)
        let url7 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice-3", ofType: "mp3")!)
        let url8 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice-4", ofType: "mp3")!)
        let url9 = URL(fileURLWithPath: Bundle.main.path(forResource: "Voice-5", ofType: "mp3")!)
        let url10 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face", ofType: "mp3")!)
        let url11 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face-1", ofType: "mp3")!)
        let url12 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face-2", ofType: "mp3")!)
        let url13 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face-3", ofType: "mp3")!)
        let url14 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face-4", ofType: "mp3")!)
        let url15 = URL(fileURLWithPath: Bundle.main.path(forResource: "Face-5", ofType: "mp3")!)

        var error: NSError?
        //音源を追加するときは数値をあげる
        do {
            let rand = arc4random() % 3
            let rand1 = arc4random() % 6
            let rand2 = arc4random() % 6

            switch rand1 {
            case 1:
                audioPlayer = try AVAudioPlayer(contentsOf: url4)
            case 2:
                audioPlayer = try AVAudioPlayer(contentsOf: url5)
            case 3:
                audioPlayer = try AVAudioPlayer(contentsOf: url6)
            case 4:
                audioPlayer = try AVAudioPlayer(contentsOf: url7)
            case 5:
                audioPlayer = try AVAudioPlayer(contentsOf: url8)
            default:
                audioPlayer = try AVAudioPlayer(contentsOf: url9)
            }

            switch rand2 {
            case 1:
                audioPlayer = try AVAudioPlayer(contentsOf: url10)
            case 2:
                audioPlayer = try AVAudioPlayer(contentsOf: url11)
            case 3:
                audioPlayer = try AVAudioPlayer(contentsOf: url12)
            case 4:
                audioPlayer = try AVAudioPlayer(contentsOf: url13)
            case 5:
                audioPlayer = try AVAudioPlayer(contentsOf: url14)
            default:
                audioPlayer = try AVAudioPlayer(contentsOf: url15)
            }

            switch rand {
            case 1:
                audioPlayer = try AVAudioPlayer(contentsOf: url1)
            case 2:
                audioPlayer = try AVAudioPlayer(contentsOf: url2)
            default:
                audioPlayer = try AVAudioPlayer(contentsOf: url3)
            }

        } catch let error1 as NSError {
            error = error1
            audioPlayer = nil
        }

        if let err = error {
            print("audioPlayer error \(err.localizedDescription)")
            return
        } else {
            audioPlayer!.delegate = self
            audioPlayer!.prepareToPlay()
        }
        //負の数は無限のループ
        audioPlayer!.numberOfLoops = 0
        audioPlayer!.play()
    }
}

 試したこと

playSound(soundName)を複数にしたりsoundNameを増やしてみたりしたのですが、どうしても記述した最後のグループしか流れません。初心者なため質問の仕方もわからず本当に申し訳ありませんが、どなたかご指南いただければとてもありがたいです。
どうかよろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    7210questions

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

  • Xcode

    4082questions

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