我有一个应用程序,它将捆绑的 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"网址,它是一个"文件:"网址。
更新:查看CFNetworkLog,我意识到在AppDelegate
音频准备之前发生了网络NSURLConnection
。 当我删除此呼叫时,一切开始工作。 由于两者都独立工作,在我看来,正在发生的NSURLConnection
存在某种冲突——可能是 API 中的错误? 很高兴知道正确的解决方法是什么,我已经通过删除上面的prepareToPlay
调用使其工作得足够好 - 这并不理想,因为当用户去播放音频文件时需要更长的时间。
另一个更新:该应用程序今天无缘无故地开始工作,自从上次尝试以来我没有改变任何东西。 不幸的是,我无法确定修复程序在这一点上是否有效! 可以肯定的是,我的 plist 键似乎在我的 iOS 11.3 模拟器中起作用。
在我的项目中,使用 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];