AVPlayer 不允许我访问 URL

AVPlayer won't let me access URL

我正在尝试非常简单 Xcode OS X 程序 swift 4.0 - 该程序构建并运行但我在访问 URL 视频文件时遇到错误.可能与某处的特权或安全设置有关,但无法弄清楚在哪里。这是我在 class ViewController 下的程序: NSViewController:

@IBOutlet var playerView: AVPlayerView!
//var url: URL!

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    // guard let url = URL(string: "https://devimages.apple.com.edgekey.net/samplecode/avfoundationMedia/AVF oundationQueuePlayer_HLS2/master.m3u8")
    //    else {
    //        return
    //    }

   let url1 = URL(string: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")


    let player = AVPlayer(url: url1!)
    // Create a new AVPlayer and associate it with the player view

    let playerView = self.playerView
    playerView?.player = player
    playerView?.player!.play();
}

我还用以下内容修改了 info.plist 文件:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict/>
</dict>

我在尝试访问 URL 中的任何一个时遇到以下运行时错误 以上为什么?

2017-11-05 10:12:21.757333-0800 AVPlayer[54381:5617593] startLogging: logging starts... 2017-11-05 10:12:21.758024-0800 AVPlayer[54381:5617612] setMessageLoggingBlock: called 2017-11-05 10:12:21.758520-0800 AVPlayer[54381:5617612] initWithSessionInfo: XPC connection interrupted 2017-11-05 10:12:21.758842-0800 AVPlayer[54381:5617612] startConfigurationWithCompletionHandler: Failed to get remote object proxy: Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.apple.rtcreportingd" UserInfo={NSDebugDescription=connection to service named com.apple.rtcreportingd} 2017-11-05 10:12:21.759003-0800 AVPlayer[54381:5617612] startConfigurationWithCompletionHandler: Failed to get remote object proxy: Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.apple.rtcreportingd" UserInfo={NSDebugDescription=connection to service named com.apple.rtcreportingd} 2017-11-05 10:12:21.925221-0800 AVPlayer[54381:5617654] 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.

即使启用任意加载,尝试使用不安全的 HTTP 进行连接也会失败。

将 URL 中的协议更改为 https:// 或将域添加到 NSExceptionDomains

let url1 = URL(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")

https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW35

我相信可以通过在您的应用程序功能中选择 Outgoing Connections 来修复 XPC 错误

https://developer.apple.com/library/content/documentation/Miscellaneous/Reference/EntitlementKeyReference/Chapters/EnablingAppSandbox.html

我在你对我之前回答过的 发表评论后发现了你的问题,所以让我们在这里继续:)

我可以通过将我对该问题的原始答案与上面@callam 提供的答案相结合来使您的代码正常工作,所以...请将正确答案归功于他 :)

总而言之,您需要:

  1. AVPlayerView 添加到您的情节提要并将其连接到您的 ViewController
  2. 设置您的 ViewController
  3. 管理应用程序传输安全和传出连接。

更详细

1。将 AVPlayerView 添加到您的情节提要并将其连接到您的 ViewController

AVKit Player View 拖到情节提要中的视图中

在您的 ViewController class 中,为视图创建一个 outlet

 @IBOutlet weak var playerView: AVPlayerView!

并连接它。

2。设置您的 ViewController

这是我的代码:

import Cocoa
import AVKit

class ViewController: NSViewController {

    @IBOutlet weak var playerView: AVPlayerView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let fileURL = URL(string: "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
        let avAsset = AVURLAsset(url: fileURL!, options: nil)

        let playerItem = AVPlayerItem(asset: avAsset)
        let videoPlayer = AVPlayer(playerItem: playerItem)
        playerView.player = videoPlayer
        videoPlayer.play()
    }
}

似乎很熟悉不 :)

请注意,我在这里创建了 videoPlayer,我不需要使用您在评论中提到的 let playerView = self.playerView

如果您只执行这两个步骤,您最终会遇到无法播放视频的播放器视图和您的控制台中的错误。所以你需要添加最后一块拼图,由上面的@callam 友情提供。

3。管理 App Transport Security 和传出连接。

首先,如果您不能使用 HTTPS 连接,您必须在 info.plist 文件中允许 HTTP 连接。

这是我的 .plist 完整文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>$(DEVELOPMENT_LANGUAGE)</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIconFile</key>
    <string></string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>$(PRODUCT_NAME)</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>LSMinimumSystemVersion</key>
    <string>$(MACOSX_DEPLOYMENT_TARGET)</string>
    <key>NSHumanReadableCopyright</key>
    <string>Copyright © 2017 :) </string>
    <key>NSMainStoryboardFile</key>
    <string>Main</string>
    <key>NSPrincipalClass</key>
    <string>NSApplication</string>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
</dict>
</plist>

重要的部分是 NSAppTransportSecurity 部分

最后,您必须在项目Capabilities下启用Outgoing Connections (Client)

如果我这样做,我会得到这样的结果:

但请注意,我仍然在控制台中看到错误。

希望您按照这些步骤能够得到相同的结果:)