AVPlayer不允许我访问URL

Nea*_*vis 2 xcode avplayer swift

我正在尝试使用Swift 4.0开发非常简单的Xcode OS X程序-该程序可以构建并运行,但是访问URL视频文件时出现错误。可能与某处的特权或安全设置有关,但无法确定该位置。这是我在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();
}
Run Code Online (Sandbox Code Playgroud)

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

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict/>
</dict>
Run Code Online (Sandbox Code Playgroud)

我在尝试访问以上两个网址之一时遇到以下运行时错误,为什么?

UserInfo = {NSDebugDescription =与名为com.apple.rtcreportingdd的服务的连接} 2017-11-05 10:12:21.925221-0800 AVPlayer [54381:5617654]应用传输安全性已阻止自明文HTTP(http://)资源加载这是不安全的。可以通过应用程序的Info.plist文件配置临时异常。

pbo*_*dsk 5

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

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

总而言之,您需要:

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

更详细地

1.将一个添加AVPlayerView到您的Storyboard,然后将其连接到ViewController

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

添加AVKit播放器视图

在您的ViewController课程中,outlet为视图创建一个:

 @IBOutlet weak var playerView: AVPlayerView!
Run Code Online (Sandbox Code Playgroud)

并连接它。

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎不熟悉:)

注意,我在videoPlayer这里创建了权限,无需我使用let playerView = self.playerView您在评论中提及的内容。

如果仅执行这两个步骤,最终将获得无法在控制台中播放视频和错误的播放器视图。因此,您需要将最后一块添加到拼图中,由@callam提供。

3.管理应用程序传输安全性和传出连接。

首先,如果无法使用HTTPS连接,则必须允许文件中的HTTP连接info.plist

这是我.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>
Run Code Online (Sandbox Code Playgroud)

重要的部分是NSAppTransportSecurity一部分

然后终于,您必须启用Outgoing Connections (Client)Capabilities您的项目

启用传出连接

如果这样做,我将得到以下结果:

最终结果

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

希望您能够按照以下步骤获得相同的结果:)