AVPlayer无法让我访问URL。

3

我正在尝试使用Swift 4.0编写一个非常简单的Xcode OS X程序 - 这个程序可以构建和运行,但是在访问视频文件的URL时会出现错误。可能与某些特权或安全设置有关,但我无法找到原因所在。以下是我的程序:

class ViewController: NSViewController:

请注意保留HTML标记。

@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: 日志开始记录... 2017-11-05 10:12:21.758024-0800 AVPlayer[54381:5617612] setMessageLoggingBlock: 已调用 2017-11-05 10:12:21.758520-0800 AVPlayer[54381:5617612] initWithSessionInfo:XPC 连接中断 2017-11-05 10:12:21.758842-0800 AVPlayer[54381:5617612] startConfigurationWithCompletionHandler: 无法获取远程对象代理: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: 无法获取远程对象代理: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已由于不安全阻止了清晰文本 HTTP(http://)资源加载。可以通过应用程序的Info.plist文件进行临时例外配置。
2个回答

9
I found your question after you commented on a question I had answered previously, so let's continue here :)
I can get your code working by combining my original answer to that question with the answer provided by @callam above so...give him the credit for the correct answer :)
To summarize, you need to:
1. Add an AVPlayerView to your Storyboard and connect it to your ViewController 2. Setup your ViewController 3. Manage App Transport Security and the outgoing connection.
In greater detail:

1. Add an AVPlayerView to your Storyboard and connect it to your ViewController

Drag an AVKit Player View to your view in the storyboard.

Add AVKit player view

在您的ViewController类中,为视图创建一个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. 管理应用程序传输安全性和出站连接。

首先,如果您不能使用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)`。

enable Outgoing Connections

如果我这样做,最后得到的就是这个:

The final result

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

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


搞定了,非常感谢你提供的所有屏幕截图!问题出在我的“引用插座”部分,我没有将playerView——>视图控制器连接。我不得不重新拖动我的Player View到类中以建立连接。非常感谢,这正是我需要的屏幕截图! - Neal Davis
@NealDavis,就是这些小细节啊 :) 很高兴最终你解决了它。 - pbodsk
这对我有用!我的问题是Info.plist中没有NSAllowsArbitraryLoads。感谢@pbodsk! - suomi35

4
即使您启用了任意加载,使用不安全的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错误。

App Sandbox

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


更改为:let url1 = URL(string: https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4),仍然得到相同的错误:2017-11-05 15: 28: 14.574696-0800 AVPlayer [54923: 5681894] initWithSessionInfo:XPC连接中断2017-11-05 15:28:14.575333-0800 AVPlayer[54923:5681894] startConfigurationWithCompletionHandler:无法获取远程对象代理:错误域= NSCocoaErrorDomain Code=4097“连接到名为com.apple.rtcreportingd”的服务(基本上与上面相同?) - Neal Davis
是的,我已经添加了https:// - 不确定为什么评论中没有显示,但您可以单击链接查看它是否有效。 - Neal Davis
注意到故障显示为:无法获取远程对象代理:错误领域=NSCocoaErrorDomain Code=4097“连接到名为com.apple.rtcreportingd”的服务”UserInfo={NSDebugDescription=连接到名为com.apple.rtcreportingd的服务} - com.apple.rtcreportingd似乎会涉及https://commondatastorage.googleapis.com??? - Neal Davis
@NealDavis 我已经添加了一张截图。 - Callam
1
根据您的截图添加了入站和出站,仍然出现相同的错误:2017-11-05 21:12:42.236064-0800 AVPlayer[55535:5754173] initWithSessionInfo: XPC连接中断 2017-11-05 21:12:42.236524-0800 AVPlayer[55535:5754173] startConfigurationWithCompletionHandler: 无法获取远程对象代理:Error Domain=NSCocoaErrorDomain Code=4097 "connection to service named com.apple.rtcreportingd" UserInfo={NSDebugDescription=connection to service named com.apple.rtcreportingd} - Neal Davis
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接