【发布时间】:2013-06-07 20:48:05
【问题描述】:
我正在使用 iOS AVPlayer 播放 HLS 流。在 HLS 会话开始时,当我收到 index.m3u8 URL 以响应创建 AVPlayerItem 时,响应还设置了基于会话的身份验证所需的 cookie。假设这个 cookie 名称是 myCookie,它是为域“.myhost.com”创建的。现在一切正常,播放器发送 myCookie 以从 xxx.myhost.com/stream 下载 ts 块。随着播放的进行,播放列表最终会更新,播放器会下载更新的播放列表。有时更新的播放列表包含一个 ts 块,可以从另一个主机的 URL 下载。因此,在尝试使用不同的主机播放块时,播放器请求 xxx.someotherhost.com 下载块。这会导致响应 302 重定向到 location:xxx-abc.myhost.com/ads。显然,AVPlayer 在从 someotherhost.com 请求块时不会发送 myCookie,因为它与 myCookie 的域不匹配。但问题是重定向到 xxx-abc.myhost.com/ads 后,即使重定向 URL 的域也是与 cookie 的域匹配的 myhost.com,AVPlayer 也不会发送 myCookie。
请注意,重定向 URL 域与原始流域相同,也与 myCookie 的域相同。由于 AVPlayer 重定向后不发送 cookie 下载块,因此 ts 块请求失败并显示 403 Forbidden (No Token)
我在这里做错了什么还是这看起来像是 iOS AVPlayer 中的一个错误?
有没有办法解决这个问题?请分享你的想法。
【问题讨论】:
-
这可能有帮助,也可能没有帮助...我们的身份验证服务返回了一个 cookie,然后我们用它来保持用户登录。我们需要为多个域使用相同的 cookie,所以当我们得到初始作为响应,我们复制 cookie,更改副本上的域,并将其添加到共享 cookie 存储中。如果您可以检测到新主机,找到现有的 cookie,然后复制数据只是更改域,似乎您可能会做类似的事情来防止初始重定向?
-
Matt,感谢您的快速回复,但是在发布此问题之前我已经尝试过相同的操作。但是我为不同的域创建的重复 cookie 在从不同的域 URL 请求块时以某种方式没有被 AVPlayer 拾取,导致 302。这里的主要问题是 AVPlayer 被重定向到已经存在 cookie 的域但是为什么AVPlayer 重定向后不发送。原始cookie的域为.myhost.com,重定向后,请求的主机为.myhost.com,只是子域不同,但cookie没有发送出去。
-
您是否向 Apple 提交了错误报告?听起来他们确实忘记在重定向期间检查 cookie jar。
-
vipw,还没有。我想首先确定是否有一种解决方法/黑客可以在客户端中修复它。否则最后的手段是向 Apple 提交错误报告。
-
indiantroy,我能想到的唯一解决方法是使用本地 http 代理来缓存客户端 cookie 并在重定向后重新插入它们。解决一个相当小的错误需要付出很多努力。
标签: ios objective-c avplayer http-live-streaming nshttpcookie