如何创建静音开关覆盖?

How to create a silent switch override?

我有用户抱怨我的应用程序没有声音。我发现这通常是因为静音开关打开了,并且使用方便的回复工具我通常可以告诉他们这个……但这似乎是一个持续存在的问题,我需要解决这个问题。我找到了一种使用以下代码禁用静音开关的方法。

import UIKit
import AVKit
import AVFoundation


class InitialViewController: UIViewController {

    let defaults = UserDefaults.standard

    override func viewDidLoad() {
        super.viewDidLoad()
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            //print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)
                //print("AVAudioSession is Active")
            } catch _ as NSError {
                //print(error.localizedDescription)
            }
        } catch _ as NSError {
            //print(error.localizedDescription)
        }
    }
}

幸运的是,此代码有效,但我希望用户仍然可以控制是否启用此代码。默认情况下,我希望启用它并让用户打开或关闭此功能。对于我的其他视图控制器,我有这个:

import UIKit
import AVFoundation

class CustomTableView: UITableViewController {

    let defaults = UserDefaults.standard
    let OverrideSwitch2 = "OverrideSwitch2"

    @IBOutlet weak var OverrideSwitch: UISwitch!

    override func viewDidLoad() {
        super.viewDidLoad()

        if let fixFin = defaults.value(forKey: OverrideSwitch2) {
            OverrideSwitch.isOn = fixFin as! Bool
        }

    }
    @IBAction func `switch`(_ sender: UISwitch) {
        defaults.set(sender.isOn, forKey: "OverrideSwitch2")
        if (sender.isOn == true){
            //Code to switch feature on
        } else {
            //Code to switch feature off
        }
    }
}

我在开关上设置了一个 NSUserDefault 以便项目记住首选项,并且由于它是一个简单的布尔值,我可以将代码粘贴到两种开关状态中,其中一个是 'false.' 但是,这个开关在另一个视图控制器上,我需要我的代码在初始视图控制器上,否则代码不会工作,直到用户进入首选项来更改它。我需要一些帮助来设置一个可以切换此代码的开关 on/off 并让 UserDefault 记住它。

所以我不敢相信我已经弄明白了,但我刚刚创建了另一个 UserDefault 来设置一个布尔值。如果为 true,AVAudioSession 的代码将得到 运行。如果为假,则不执行任何操作。这个 UserDefault 通过开关切换,它也有一个 UserDefault 来记住开关状态。

代码如下:

import UIKit
import CoreGraphics
import AVFoundation



class CustomTableView: UITableViewController  {

    //This is for the NSUserDefaults
    let defaults = UserDefaults.standard
    let OverrideSwitch2 = "OverrideSwitch2"
    
    //This Outlet connects the Switch
    @IBOutlet weak var OverrideSwitch: UISwitch!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
//These if statements only run if one is true or false
        
        //True: AVAudioSession is initialized; Silent Switch is Overridden
        if UserDefaults.standard.bool(forKey: "Key") == true {
        do {
            try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
            //print("AVAudioSession Category Playback OK")
            do {
                try AVAudioSession.sharedInstance().setActive(true)
                print("AVAudioSession")
            } catch _ as NSError {
                //print(error.localizedDescription)
            }
        } catch _ as NSError {
            //print(error.localizedDescription)
    }
        
}
    
        //False: No Code is executed, silent switch works as normal
        if UserDefaults.standard.bool(forKey: "Key") == false {
          
            //No Code Here
}
        
        //This NSUserDefault remembers if the switch is on or off
        if let switchState = defaults.value(forKey: OverrideSwitch2) {
            OverrideSwitch.isOn = switchState as! Bool
        }
    }
    
    //This IBAction is connected to the switch; It toggles the UserDefault which your app will remember next time you run it
   @IBAction func switchIsChanged(_ OverrideSwitch: UISwitch) {
    defaults.set(OverrideSwitch.isOn, forKey: "OverrideSwitch2")
        if OverrideSwitch.isOn == true {
          
            UserDefaults.standard.set(true, forKey: "Key")
            
        } else {
            
            UserDefaults.standard.set(false, forKey: "Key")
    
        }
    }
}

简单地说,如果你切换开关 'On' NSUserDefault 运行 是一个初始化会话的函数,它只会 运行 如果 bool 是 'true.' 如果它是false 那么什么都不是 运行。我现在需要的只是提醒用户启用或禁用覆盖只有在他们重新启动应用程序后才有效。