Ссылки на изображения S3 не будут отображаться в Chromecast (веб-приложение Rails в оболочке Swift iOS) - PullRequest
0 голосов
/ 17 апреля 2020

первое сообщение, но давний пользователь (мои волосы / здравомыслие неоднократно сохранялись SO).

Я изо всех сил пытаюсь получить изображения, размещенные на S3, для показа в Chromecast.

У меня есть веб-приложение Rails, которое отправляет ссылку на изображение через веб-сокеты (Action Cable) в приложение-оболочку iOS (в Swift), которое, в свою очередь, отправляет ссылку на подключенный приемник Chromecast по умолчанию для отображения изображения на экране. Этот запутанный маршрут необходим из-за моего варианта использования и Cast SDK.

Это прекрасно работает, и Chromecast правильно отображает изображения, отправленные из самого веб-приложения (то есть относительные пути к изображениям, размещенным на Heroku), а также как прямые ссылки (например, это опубликованное c изображение самолета . Однако, оно не будет отображать изображения, которые я размещал на AWS S3.

В Cast SDK не отображаются какие-либо проблемы с форматами изображений (jpg, png) или ссылками, которые могут иметь отношение к проблеме, поэтому проблема, по-видимому, связана со ссылкой S3, а не с самим приведением.

Я использую Active Storage для подключения моего приложения rails к S3 и url_for(artwork.image) для отображения правильного изображения внутри приложения.

Я также создаю полную ссылку для моего Javascript интерфейса в соответствии с замечательным Rails Guide

*my_channel.rb*

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

Эта косвенная ссылка маршрутизирует через веб-приложение и затем на S3 из соображений безопасности. Это работает для моих обновлений страницы javascript, но Cast не смог отобразить эту ссылку .

Я фигу красный, ему не понравилось перенаправление, поэтому я сгенерировал полную подписанную прямую ссылку вместо некоторых проб и ошибок, используя S3 docs

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)

Это работало в приложении, а также из любой браузер, таким образом, казался максимально доступным c. Но снова Cast не смог отобразить его.

Затем я попытался отредактировать CORS для корзины S3, следуя указаниям AWS 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 publi c, а также сделать отдельное изображение publi c, но ни одна из них не работала (и в любом случае созданная выше прямая ссылка со знаком уже опубликована c и доступна из любого браузера).

У меня есть доступ к коду iOS (в Swift), в которой подробно описана настройка Cast et c, но я не знаю Swift и, к сожалению, не могу получить доступ к сообщениям об ошибках. Поэтому я не могу использовать отладчик . Поскольку он успешно работает для других ссылок publi c, я думаю, что проблема, скорее всего, связана со ссылкой S3 (хотя это предположение может быть неправильным) или с типами ссылок, которые разрешает Cast.

I ' Мы потратили несколько дней на это, и у меня нет идей на данный момент, поэтому любая помощь будет принята с благодарностью!

Спасибо!

1 Ответ

0 голосов
/ 20 апреля 2020

Я решил свой собственный вопрос - оказывается, что обертка iOS имела ошибку (в частности, требовалось, чтобы одновременно было передано несвязанное значение, которое теперь было компенсировано).

Что касается плюсов, то методы косвенной и прямой ссылок S3 в моем вопросе работают через Casting, так что, надеюсь, они будут полезны кому-то из тех, кто находится на аналогичной позиции и хочет создать эти ссылки в будущем.

...