Почему AvPlayer останавливается на игровых действиях, задержанных с заблокированным экраном?IOS

Программируем под IOS
Ответить
Anonymous
 Почему AvPlayer останавливается на игровых действиях, задержанных с заблокированным экраном?

Сообщение Anonymous »

Почему, когда AvPlayer играет с заблокированным экраном, и я останавливаюсь на игре, он выполняется только после нескольких миллисекундов? В моем приложении для обучения английскому звуку будет воспроизводиться и пауза, контролируемая таймером. Но когда я выключите экран с AvPlayer, не будет пауза, как запланировано (он управляется текстами, которые являются точными), но задерживается сотнями миллисекунд. Мой код работает хорошо, когда экран включен даже при заблокированном экране или когда приложение работает в фоновом режиме. Мой iPhone не в режиме низкой батареи. Аудио -файл хранится на самом iPhone.if observer == nil {
weak var wself = self;
observer = self.addPeriodicTimeObserver(forInterval: CMTime(seconds: 0.05, preferredTimescale: CMTimeScale(NSEC_PER_SEC)), queue: nil, using: {cmtime in
if wself != nil {
wself!.onTimerTick(cmTime: cmtime);
}
})
}
< /code>
onTimerTick() Метод:
@objc func onTimerTick(cmTime:CMTime) {
if self.openAutoPlayAndReadTimer == false {
if self.autoPlayAndReadTimer != nil {
if self.autoPlayAndReadTimer!.isValid {
self.autoPlayAndReadTimer?.invalidate();
}
self.autoPlayAndReadTimer = nil;
}
return
}

let index = UserDefaults.getAL_WhiteCircleTime_In_ReadAndFollowView();
if index == 0 {
return
}

var i = 0;
for item in self.realPlayTimeList! {
if item.time < cmTime.seconds && abs(item.time - cmTime.seconds) < 0.5 {
break
}
i = i + 1;
}

if i >= self.realPlayTimeList!.count {
return
}

let matchItem = self.realPlayTimeList!;
let time = matchItem.time;
if time == lastTickTime {
return
}

//If the duation is zero, break
if matchItem.stopDuration * matchItem.scale < 0.05 {
return
}

self.pause();
if self.delegate != nil {
self.delegate?.onSongPauseByAutoPlayAndReadTimer();
}
lastTickTime = time;

autoPlayAndReadTimer?.invalidate();
autoPlayAndReadTimer = nil;

if autoPlayAndReadTimer == nil || autoPlayAndReadTimer?.isValid == false {
let duration = matchItem.stopDuration * matchItem.scale;
autoPlayAndReadTimer = Timer.scheduledTimer(timeInterval: duration, target: self, selector: #selector(onAutoPlayAndReadTimerTick), userInfo: nil, repeats: true);
}
autoPlayAndReadTimer?.fire()

}
< /code>
Timer onAutoPlayAndReadTimerTick() Метод:
@objc func onAutoPlayAndReadTimerTick() {
if hasEnter == false {
hasEnter = true
return
} else {
hasEnter = false
}
self.play();
if self.delegate != nil {
self.delegate?.onSongPlayByAutoPlayAndReadTimer();
}
autoPlayAndReadTimer?.invalidate();
autoPlayAndReadTimer = nil;
}
< /code>
Code in AppDelegate:
let audioSession = AVAudioSession.sharedInstance();
do {
try audioSession.setCategory(.playback, mode: .default, options: []) // 或者使用 .ambient
try audioSession.setActive(true)
} catch {
print("Setting category to AVAudioSessionCategoryPlayback failed.")
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... een-locked
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»