iPhone 不播放声音但模拟器可以播放声音
iPhone doesn't play sound but simulator can play sound
我正在开发手电筒应用程序。
在这个应用程序中,我想使用 AVFoundation 播放声音。
当我 运行 应用程序时,声音文件在 Xcode 模拟器上播放良好。但是,在我的 iPhone 设备上,声音文件无法播放。
请看看我的代码。
import UIKit
import AVFoundation
import os.log
class ViewController: UIViewController {
@IBOutlet weak var switchButton: UIButton!
@IBOutlet weak var flashImageView: UIImageView!
var isOn = false
var soundPlayer: AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
prepareSound()
}
func prepareSound() {
let path = Bundle.main.path(forResource: "switch", ofType:"wav")!
let url = URL(fileURLWithPath: path)
do {
soundPlayer = try AVAudioPlayer(contentsOf: url)
soundPlayer?.prepareToPlay()
} catch {
// couldn't load file :(
}
}
func toggleTorch(on: Bool) {
guard let device = AVCaptureDevice.default(for: .video) else { return }
if device.hasTorch {
do {
try device.lockForConfiguration()
if on == true {
device.torchMode = .on
} else {
device.torchMode = .off
}
device.unlockForConfiguration()
} catch {
print("Torch could not be used")
}
} else {
print("Torch is not available")
}
}
@IBAction func switchTapped(_ sender: Any) {
isOn = !isOn
soundPlayer?.play()
os_log("sound played")
toggleTorch(on: isOn)
flashImageView.image = isOn ? #imageLiteral(resourceName: "onBG") : #imageLiteral(resourceName: "offBG")
switchButton.setImage( isOn ? #imageLiteral(resourceName: "onSwitch") : #imageLiteral(resourceName: "offSwitch"), for: .normal)
}
}
在prepareSound方法中加入两行代码,就可以了。
func prepareSound() {
let session = AVAudioSession.sharedInstance()
try? session.setCategory(AVAudioSessionCategoryPlayback)
let path = Bundle.main.path(forResource: "switch", ofType:"wav")!
let url = URL(fileURLWithPath: path)
do {
soundPlayer = try AVAudioPlayer(contentsOf: url)
soundPlayer?.prepareToPlay()
} catch {
// couldn't load file :(
}
}
我正在开发手电筒应用程序。 在这个应用程序中,我想使用 AVFoundation 播放声音。 当我 运行 应用程序时,声音文件在 Xcode 模拟器上播放良好。但是,在我的 iPhone 设备上,声音文件无法播放。 请看看我的代码。
import UIKit
import AVFoundation
import os.log
class ViewController: UIViewController {
@IBOutlet weak var switchButton: UIButton!
@IBOutlet weak var flashImageView: UIImageView!
var isOn = false
var soundPlayer: AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
prepareSound()
}
func prepareSound() {
let path = Bundle.main.path(forResource: "switch", ofType:"wav")!
let url = URL(fileURLWithPath: path)
do {
soundPlayer = try AVAudioPlayer(contentsOf: url)
soundPlayer?.prepareToPlay()
} catch {
// couldn't load file :(
}
}
func toggleTorch(on: Bool) {
guard let device = AVCaptureDevice.default(for: .video) else { return }
if device.hasTorch {
do {
try device.lockForConfiguration()
if on == true {
device.torchMode = .on
} else {
device.torchMode = .off
}
device.unlockForConfiguration()
} catch {
print("Torch could not be used")
}
} else {
print("Torch is not available")
}
}
@IBAction func switchTapped(_ sender: Any) {
isOn = !isOn
soundPlayer?.play()
os_log("sound played")
toggleTorch(on: isOn)
flashImageView.image = isOn ? #imageLiteral(resourceName: "onBG") : #imageLiteral(resourceName: "offBG")
switchButton.setImage( isOn ? #imageLiteral(resourceName: "onSwitch") : #imageLiteral(resourceName: "offSwitch"), for: .normal)
}
}
在prepareSound方法中加入两行代码,就可以了。
func prepareSound() {
let session = AVAudioSession.sharedInstance()
try? session.setCategory(AVAudioSessionCategoryPlayback)
let path = Bundle.main.path(forResource: "switch", ofType:"wav")!
let url = URL(fileURLWithPath: path)
do {
soundPlayer = try AVAudioPlayer(contentsOf: url)
soundPlayer?.prepareToPlay()
} catch {
// couldn't load file :(
}
}