私は、プライベート ビデオのダウンロードと HTTP ライブ ストリーミングを可能にするiOSアプリに取り組んでいます。動画は Amazon S3 バケットに保存されます ( /ファイルとしてセグメント化されます)。また、 CloudFrontがオンになり、バケットに接続されます。mp4
m3u8
ts
コンテンツは非公開であるため、CloudFront 経由で接続するときに URL に署名する必要があります。URL に署名するには秘密鍵を使用する必要があるため、バンドルに秘密鍵を保存しないと、iOS アプリで署名付き URL を生成することはできません。そして、それは悪い考えです!
そこで、次のように URL 署名を実行し、生成された署名付き CloudFront URL にリダイレクトする単純な Ruby サーバーを作成することにしました。
http://signing.server.local/videos/1.mp4 → https://acbdefg123456.cloudfront.net/videos/1.mp4??Expires=XXX&Signature=XXX&Key-Pair-Id=XXX
http://signing.server.local/videos/1.m3u8 → https://acbdefg123456.cloudfront.net/videos/1.m3u8??Expires=XXX&Signature=XXX&Key-Pair-Id=XXX
ビデオのダウンロードの場合は、リクエストが 1 つしかないため、うまく機能します。しかし、コンテンツをストリーミングしMPMoviePlayerController
て署名サーバーの URL を指定すると、最初のリクエストのみがサーバーによって署名され、CloudFront にリダイレクトされます。次のリクエストでMPMoviePlayerController
は、最初に署名された CloudFront URL をベースとして取得し、署名サーバーをスローせずに直接接続を試みます。
m3u8
ファイル内のパスは相対パスです。
署名サーバーを介してすべてのコンテンツを送信する必要なく、この機能を実装する方法について何か提案はありますか?