Проблема безопасности транспорта приложения с AVAudioPlayer при загрузке локального файла target-C, XCode 9 - PullRequest
0 голосов
/ 14 мая 2018

У меня есть приложение, которое загружает аудиофайл m4a в комплекте как локальный ресурс, и оно хорошо работает уже много лет.Я обновляю приложение до iOS 11.3 / XCode 9.3, и теперь оно не работает на iPad (работает на iPhone), когда я нажимаю кнопку воспроизведения:

2018-05-13 20:45:24.437626-0700 my app[6175:218735] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
2018-05-13 20:45:24.437791-0700 my app[6175:218735] Cannot start load of Task <117E064E-ABB3-45F2-8D64-76397B140092>.<0> since it does not conform to ATS policy
2018-05-13 20:45:24.437948-0700 my app[6175:218732] NSURLConnection finished with error - code -1022

Мой код:

NSURL *medURL   = [[NSBundle mainBundle] URLForResource: @"MyFile"
                                          withExtension: @"m4a"];
NSError *playerError = nil;
AVAudioPlayer *newPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: medURL error: &playerError];
self.appSoundPlayer = newPlayer;

// "Preparing to play" attaches to the audio hardware and ensures that playback
//      starts quickly when the user taps Play
[appSoundPlayer prepareToPlay];

Не удается на prepareToPlay.

Читая другие ответы, я нашел много информации об ошибке ATS, поэтому я добавил ее в свой plist-файл для приложения, очистил, перестроил и запустил - но я все еще получаю ошибку:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsLocalNetworking</key>
    <true/>
    <key>NSAllowsArbitraryLoadsForMedia</key>
    <true/>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
    <key>NSExceptionAllowsInsecureHTTPLoads</key>
    <true/> </dict>

Я не могу использовать ключ NSExceptionDomain, потому что это локальный ресурс, нет домена.Как я могу это исправить?

Примечание: для ясности, этот файл встроен в приложение и не был загружен в любое время.Это не «http» url, это «file:» url.

Обновление: глядя на CFNetworkLog Я понял, что в сети NSURLConnection происходит простоперед подготовкой аудио в AppDelegate.Когда я убрал этот звонок, все начало работать.Поскольку оба работают независимо друг от друга, мне кажется, что в NSURLConnection происходит какой-то конфликт - возможно, ошибка в API?Было бы хорошо узнать, каков правильный обходной путь для этого, я сделал так, чтобы он работал достаточно хорошо, убрав вызов prepareToPlay выше - это не идеально, так как это занимает больше времени, когда пользователь идет проигрывать аудиофайл.

Еще одно обновление: приложение начало работать сегодня без видимой причины, я ничего не менял с момента последней попытки.К сожалению, я не могу определить, работают ли исправления в этот момент!Конечно, похоже, что мои plist-ключи работают в моем симуляторе iOS 11.3.

1 Ответ

0 голосов
/ 25 мая 2018

В моем проекте используется AVAudioPlayer для воспроизведения аудио, а мой исходный код:

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"MyFile"  ofType:@"m4a"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
AVAudioPlayer* audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
audioPlayer.numberOfLoops = -1; //Infinite
[audioPlayer setVolume:1];
[audioPlayer play];
...