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")
我相信可以通过在您的应用程序功能中选择 Outgoing Connections
来修复 XPC 错误
我在你对我之前回答过的 发表评论后发现了你的问题,所以让我们在这里继续:)
我可以通过将我对该问题的原始答案与上面@callam 提供的答案相结合来使您的代码正常工作,所以...请将正确答案归功于他 :)
总而言之,您需要:
- 将
AVPlayerView
添加到您的情节提要并将其连接到您的 ViewController
- 设置您的
ViewController
- 管理应用程序传输安全和传出连接。
更详细
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)
如果我这样做,我会得到这样的结果:
但请注意,我仍然在控制台中看到错误。
希望您按照这些步骤能够得到相同的结果:)
我正在尝试非常简单 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")
我相信可以通过在您的应用程序功能中选择 Outgoing Connections
来修复 XPC 错误
我在你对我之前回答过的
我可以通过将我对该问题的原始答案与上面@callam 提供的答案相结合来使您的代码正常工作,所以...请将正确答案归功于他 :)
总而言之,您需要:
- 将
AVPlayerView
添加到您的情节提要并将其连接到您的ViewController
- 设置您的
ViewController
- 管理应用程序传输安全和传出连接。
更详细
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)
如果我这样做,我会得到这样的结果:
但请注意,我仍然在控制台中看到错误。
希望您按照这些步骤能够得到相同的结果:)