【问题标题】:AVPlayer won't let me access URLAVPlayer 不允许我访问 URL
【发布时间】:2018-04-18 01:34:20
【问题描述】:

我正在尝试使用 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();
}

我还用以下内容修改了 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] 开始记录: 记录开始... 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 "连接到名为 com.apple.rtcreportingd 的服务" UserInfo={NSDebugDescription=连接到服务命名 com.apple.rtcreportingd} 2017-11-05 10:12:21.759003-0800 AVPlayer[54381:5617612] startConfigurationWithCompletionHandler: 获取远程对象代理失败:Error Domain=NSCocoaErrorDomain Code=4097 "连接到名为 com.apple.rtcreportingd 的服务" UserInfo={NSDebugDescription=连接到服务命名 com.apple.rtcreportingd} 2017-11-05 10:12:21.925221-0800 AVPlayer[54381:5617654] App Transport Security 已阻止明文 HTTP (http://) 资源加载,因为它不安全。暂时的 可以通过应用的 Info.plist 文件配置异常。

【问题讨论】:

    标签: swift xcode avplayer


    【解决方案1】:

    即使您启用任意加载,尝试使用不安全的 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

    我相信 XPC 错误可以通过在您的 App Capabilities 中选择 Outgoing Connections 来修复

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

    【讨论】:

    • 更改为:让 url1 = URL(string:commondatastorage.googleapis.com/gtv-videos-bucket/sample/…) 仍然出现相同的错误: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 代码 = 4097“连接到名为 com.apple.rtcreportingd 的服务”(与上述基本相同?)
    • 是的,确实添加了 https:// - 不确定评论没有显示什么,但您可以单击链接并查看它是否有效
    • 注意失败似乎是:无法获取远程对象代理:错误域=NSCocoaErrorDomain 代码=4097“连接到名为 com.apple.rtcreportingd 的服务” UserInfo={NSDebugDescription=连接到名为 com 的服务.apple.rtcreportingd} - com.apple.rtcreportingd 似乎会说明commondatastorage.googleapis.com ???
    • 添加了 NSAllowsArbitraryLoadsForMedia 仍然与上面报告的错误相同
    • 根据您的屏幕截图添加传入和传出仍然得到相同的错误: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:无法获取远程对象代理:错误域= NSCocoaErrorDomain代码= 4097“连接到名为com.apple.rtcreportingd的服务” UserInfo = {NSDebugDescription =连接到名为com的服务。 apple.rtcreportingd}
    【解决方案2】:

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

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

    总而言之,您需要:

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

    更详细的

    1。将AVPlayerView 添加到您的故事板并将其连接到您的ViewController

    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,我不需要使用你在cmets中提到的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)

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

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

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

    【讨论】:

    • 得到它的工作非常感谢您的所有屏幕截图!发生的事情是在我的“参考插座”部分中,我没有 playerView --------> View Controller 连接。我不得不重做我的播放器视图的 CNTRL 拖动到班级以获得连接。非常感谢,这正是我需要的屏幕截图!
    • @NealDavis 是小事,嗯 :) 很高兴你最终成功了。
    • 这对我有用!我的问题是 Info.plist 中没有 NSAllowsArbitraryLoads。干杯@pbodsk!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 2021-10-16
    • 2015-12-30
    • 2011-07-28
    • 2020-05-03
    • 2015-04-25
    相关资源
    最近更新 更多