objective-c - AVAudioPlayer 加载本地文件 objective-C,XCode 9 的应用程序传输安全问题

标签 objective-c avaudioplayer app-transport-security xcode9.3 ios11.3

我有一个应用程序可以加载一个捆绑的 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 key 似乎在我的 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];

关于objective-c - AVAudioPlayer 加载本地文件 objective-C,XCode 9 的应用程序传输安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50322976/

相关文章:

ios - 为什么图像过渡会影响我的动画?

javascript - 为音频播放器创建轨道标题(在 codepen 上找到)

ios - Xcode 错误 : NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9814)

ios - Xcode 7/iOS 9 中的 Api 调用错误(如何在 plist 中设置 App Transport Security)

ios - 可用的链接器标志及其在 iOS 中的使用

objective-c - 如何使用 Objective C 检测击键?

ios - 如何在 Objective C 中使用 HSV 缩放颜色

objective-c - 使用 AVAudioplayer 在后台播放音乐

swift - 在 SwiftUI 应用程序中放置音频播放代码的位置

swift - 如何使用 SSLSetALPNProtocols?