バンドルされた 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 です。
更新: CFNetworkLogNSURLConnection
を調べたところ、 の音声準備の直前にネットワークに問題が発生していることに気付きましたAppDelegate
。この呼び出しを削除すると、すべてが機能し始めました。両方とも独立して動作するため、何らかの競合が発生しているように見えNSURLConnection
ます。おそらく API のバグでしょうか? これに対する適切な回避策を知っておくとよいでしょう。prepareToPlay
上記の呼び出しを削除することで十分に機能するようになりました。これは、ユーザーがオーディオ ファイルを再生するときに時間がかかるため、理想的ではありません。
別の更新: アプリは明らかな理由もなく今日動作を開始しました。最後に試してから何も変更していませんでした。残念ながら、現時点では修正が機能するかどうかを判断できません! 確かに、私の plist キーは私の iOS 11.3 シミュレーターで動作しているようです。