S3 图片链接不会在 Chromecast 上显示(Rails 网络应用程序在 Swift iOS 包装器中)

S3 image links won't show on Chromecast (Rails web app inside Swift iOS wrapper)

第一个 post 但长期用户(我的 hair/sanity 已多次被 SO 保存)。

我正在努力让托管在 S3 上的图像显示在 Chromecast 上。

我有一个 Rails 网络应用程序,它通过 websockets (Action Cable) 将图像 link 发送到 iOS 包装器应用程序(在 Swift 中),它在turn 将 link 发送到连接的默认 Chromecast 接收器以在屏幕上显示图像。由于我的用例和 Cast SDK,这条复杂的路线是必要的。

这完美地工作并且 Chromecast 正确显示从网络应用程序本身发送的图像(即相对路径 links 到 Heroku 上托管的图像),以及直接 links(例如这个 public image of a plane。但是,它不会显示我在 AWS S3 上托管的图像。

Cast SDK 没有显示任何与图像格式(jpg、png)或 link 相关的问题,因此问题可能出在 S3 link,而不是演员表本身。

我使用 Active Storage 将我的 rails 应用程序连接到 S3,并 url_for(artwork.image) 在应用程序中显示正确的图像。

我还根据精彩的 Rails Guide

为我的 Javascript 前端生成了一个完整的 link
*my_channel.rb*

indirect_link = Rails.application.routes.url_helpers.rails_blob_path(artwork.image, only_path: true)

出于安全原因,这种间接 link 路由通过网络应用程序然后到达 S3。这适用于我的 javascript 页面更新,但 Cast 无法显示此 link。

我认为它不喜欢重定向,所以我使用 S3 docs

反复试验后生成了完整签名的直接 link
s3 = Aws::S3::Resource.new(region: 'eu-west-2')
obj = s3.bucket(‘bucket name’).object(‘key’)
direct_url = obj.presigned_url(:get, expires_in: 3600)

这在应用程序和任何浏览器中都有效,因此看起来尽可能 public。但是Cast还是无法显示它。

然后我尝试按照 AWS S3 CORS 指南编辑 S3 存储桶的 CORS。我尝试了这两个选项,但都没有用。

<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <ExposeHeader>ETag</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
</CORSRule>

我也尝试过完全制作我的 S3 存储桶 public,还制作了一个单独的图像 public,但都没有用(无论如何,已签名的直接 link 生成 以上已经 public 并且可以从任何浏览器访问)。

我可以访问 iOS 代码(在 Swift 中),其中详细说明了 Cast 设置等,但我不知道 Swift 并且无法访问任何错误不幸的消息。因此,我无法使用 。由于它在其他 public link 上工作成功,我认为问题最有可能与 S3 link(尽管这个假设可能是错误的)或 [=59= 的类型有关]演员允许的。

我已经在这上面花了很多天,但我现在没有想法,所以非常感谢任何帮助!

谢谢!

我已经解决了我自己的问题 - 事实证明 iOS 包装器有错误(具体来说,它需要同时提交一个不相关的值,现在已经得到补偿) .

从好的方面来说,我的问题中的间接和直接 S3 link 方法都是通过 Casting 工作的,因此希望它们对处于类似位置并希望创建这些 link 的人有用将来。