По какой-то причине, когда я получаю эту ошибку, флаг все еще установлен в YES. Мне удалось найти обходной путь, сравнив currentTime с продолжительностью и немедленно перезапустив проигрыватель, если currentTime не равен 0.0 (конец звука). Все мои тесты выполняются на симуляторе, так как у меня еще нет лицензии на тестирование на моем телефоне. Надеюсь это поможет. Смотрите правки для пары причуд.
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
{
if ([_player currentTime] != [_player duration] && [_player currentTime] != 0.0f) {
[_player play];
return;
}
...
РЕДАКТИРОВАТЬ: К сожалению, я все еще нашел ошибки при поиске в самом начале или в самом конце звука (или с очень небольшим приращением любого из них). Я обнаружил, что если вы создаете особые случаи, которые обрабатывают эти два случая, вы, как правило, охвачены. Вы должны остановить игрока, установить значение currentTime равным 0.0, а затем либо снова запустить проигрыватель, если вы стремитесь к началу, либо вручную вызвать финишного делегата, если вы стремитесь к концу (если вы его реализовали).
Если я найду лучшее решение или получу больше отзывов, запустив его на реальном устройстве, я обновлю.