У меня есть приложение, которое загружает связанный аудиофайл 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, потому что это локальный ресурс, домена нет. Как я могу это исправить?
Примечание: для ясности, этот файл входит в состав приложения и никогда не загружался. Это не URL-адрес «http», это URL-адрес «file:».
Обновление: просматривая CFNetworkLog, я понял, что в сети произошло NSURLConnection
непосредственно перед подготовкой звука в AppDelegate
. Когда я удалил этот звонок, все заработало. Поскольку оба работают независимо, мне кажется, что в NSURLConnection
происходит какой-то конфликт - возможно, ошибка в API? Было бы неплохо узнать, каков правильный обходной путь для этого, я заставил его работать достаточно хорошо, удалив вышеприведенный вызов prepareToPlay
- это не идеально, так как требуется больше времени, когда пользователь переходит к воспроизведению аудиофайла.
Еще одно обновление: сегодня приложение заработало без видимых причин, я ничего не менял с тех пор, как последний раз пробовал. К сожалению, я не могу определить, работают ли исправления на данный момент! Чтобы быть уверенным, похоже, что мои ключи plist работают в моем симуляторе iOS 11.3.
NSAllowsArbitraryLoadsForMedia
? Вместо того, чтобы набирать все ATS, только для медиа (я знаю, что вам не нужно, но это, по крайней мере, менее опасное решение). - person wottle   schedule 22.05.2018NSAllowsArbitraryLoadsInWebContent
,NSAllowsLocalNetworking
,NSAllowsArbitraryLoadsForMedia
, вы переопределяетеNSAllowsArbitraryLoads
. Я рекомендую прочитать первичные ключи словаря App Transport Security, чтобы понять, какие ключи следует включать. Включение конфликтующих ключей бессмысленно; вы просто получите такое же нежелательное поведение. - person l'L'l   schedule 24.05.2018NSAllowsArbitraryLoadsForMedia
еще не поддерживался, по-прежнему соблюдая общее «NSAllowsArbitraryLoads». Так что я бы не стал заявлять, что что-то бессмысленно, если это особая стратегия Apple, позволяющая обеспечить обратную совместимость. И это, конечно, не приводит к одинаковому поведению на разных версиях iOS. Я бы рекомендовал полностью понять ключи, прежде чем комментировать ложную информацию. - person wottle   schedule 24.05.2018NSAllowsArbitraryLoads
) игнорируется, что приводит к эффективному значению для этого ключа его значение по умолчанию NO — если любой из следующих ключей присутствует в файле Info.plist вашего приложения: NSAllowsArbitraryLoadsForMedia NSAllowsArbitraryLoadsInWebContent NSAllowsLocalNetworking - person wottle   schedule 24.05.2018NSAllowsArbitraryLoads
, не принесет им абсолютно никакой пользы; какую часть этого вы не понимаете? Что не предполагается, так это то, что OP хочет или когда-либо упоминал, что для приложения требуется iOS 9. Почему именно установка правильных ключей может привести к плохому исправлению? Это нелепо. - person l'L'l   schedule 24.05.2018pathForResource:ofType:
- person Bimawa   schedule 24.05.2018