iOS10、Moodle上で、音声・映像ファイルが動作しない事象の調査結果

## 追記

### 12/15

- **iOS 10.2 で事象が解消された**（@Mizue さんありがとうございます）
- 帝塚山大の[CCC-TIESのblog](http://www.cccties.org/blog/system/ios10%E3%81%A7moodle%E5%86%85%E3%81%AB%E3%81%82%E3%82%8B%E5%8B%95%E7%94%BB%E3%82%84%E9%9F%B3%E5%A3%B0%E3%81%8C%E5%86%8D%E7%94%9F%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%95%8F%E9%A1%8C%E3%81%AE%E5%AF%BE/)にMoodle側を変更する形での試行が掲載されていたのに今更気がついた。流石です。

### 11/8

- iOS 10.1.1 では事象は解消していない（@takehironet さんありがとうございます）
- [Im an iOS Beta-Tester. With iOS 10.2 (14C5062e) the bug seems to be fixed.（iOSのベータテスターだけど、iOS10.2だとこのバグ直ってるように見えるよ）](
https://tracker.moodle.org/browse/MDL-56129?focusedCommentId=437074&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-437074) との投稿あり
- [I found out that the browser app Opera-mini works fine.（それ、Opera-Miniで動くよ）](https://moodle.org/mod/forum/discuss.php?d=340465) という投稿もあるけれど、本当だとしたらOpera-Miniは何を使って音声/動画再生してるんだろう（いずれにせよ根本的な解決ではないのですが）


### 10/28

- iOS 10.1 では事象は解消していない
- [Moodle 3.x の対応アップデートは一進一退](https://tracker.moodle.org/browse/MDL-56129?focusedCommentId=434164&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-434164)の様相

## はじめに

Moodleで音声・映像を使った教材を展開している複数の教育機関が、教材の動作不具合としてアナウンスも出していたり、QiitaにMoodleタグもあるようなので、何かの参考になればと思い、メモ書き程度だけれども調査結果を記しておく。

なお、本稿はiOS 10.0.2, Moodle 2.7.16+ (Build: 20160915) で調査している。

## 事象の外観

iOS 10のSafariで、HTML5の`<audio>`タグ（`<video>`タグも駄目という報告あり）や、Audioオブジェクトを使った教材を利用すると、音声が再生できない。

具体的には、音声再生が標準のコントローラの場合、再生ボタンを押しても再生中にならなかったり、ロード後にエラーと表記される。

JavaScriptでエラーイベントをフックすると、イベントはフックできる。~~しかしerrorオブジェクトの内容は `undefined`。~~ iOS 10.1から、エラーコードは `MEDIA_ERR_SRC_NOT_SUPPORTED`（値は `4`）になった。

サーバ（HTTPD）側のステータスコードは、下の例の様に 407 (Proxy Access Denied) を返している。（これは、SCORMパッケージとしてアップロードしたファイルの例である）

```
xxx.xxx.xxx.xxx - - [14/Oct/2016:17:19:52 +0900] 
"GET /moodle/pluginfile.php/xxx/mod_scorm/content/xxx/xxx/xxx.mp3 HTTP/1.1" 407 20253 
"http://xxx.xxx.xxx/moodle/pluginfile.php/xxx/mod_scorm/content/xxx/xxx/xxx.html" 
"Mozilla/5.0 (iPad; CPU OS 10_0_2 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A456 Safari/602.1"
```

## 原因の推測

StackOverFlowの記事 [HTML5 video/audio player on mobile Safari (iOS 7 & iOS 10) excludes cookies](http://stackoverflow.com/questions/19215098/html5-video-audio-player-on-mobile-safari-ios-7-ios-10-excludes-cookies) によれば、

> Update 2016-09-20: The video player in iOS 10 (AppleCoreMedia) is not able to read session cookies. Only cookies set with an expire date is readable by the video player.

という報告があり、iOS10.0.2のブラウザが音声・映像の再生用に使っているAppleCoreMediaは、CookieのSession-Idを使ったHTTPリクエストを行うことができないことがうかがえる。

つまり、Sessionを使った認証の場合、ブラウザでログイン画面を経由して認証済みのはずだとしても、音声ファイルへのアクセスでは認証済みと扱われない（教材のHTMLは表示されても、音声がロードされないので、音声再生は実行できない）状態となり、上記の事象の外観とも辻褄があう。

## 影響範囲の推測

上記の原因推測が正しい場合、以下のような影響範囲が推定できる。

### Moodle以外のLMSでも発生する

- 端末がiOS 10.0.2で、ブラウザでアクセスする
- 教材に利用する音声（映像）ファイルが、外部からのアクセスにCookie（Session-Id）を用いた認証が必要な領域に保存されている

を満たすと発症するので、Moodle以外のLMSであっても、音声/映像ファイルがSessionによる認証が必須の領域に置かれているシステムであれば、同様の事象が発生すると推定できる。

### ブラウザを問わず発生する

Safariだけでなく、iOS 10.0.2のAppleCoreMediaを使うブラウザ（Chromeなど）ではもれなく同様の事象が発生すると推定できる。


## 考えられる対処方法の私案

1. iOSの更新を待つ
  - この記事の投稿時点で、バグなのか仕様なのかのAppleからの正式なアナウンスは見当たらない。
  - Appleの[サポートコミュニティには投稿があった](https://discussions.apple.com/thread/7704776?start=0&tstart=0)模様。
2. Moodle側の対処更新を待つ
  - この記事の投稿時点で、[Moodleのフォーラム](https://moodle.org/mod/forum/discuss.php?d=340465)、[MoodleのBTS](https://tracker.moodle.org/browse/MDL-56129)には報告があがっている。
  - パッチなどは提供されていないが、BTSに「manager.php をいじったらいいのでは」という報告はあり。
3. Moodle側を自前で修正する
  - リクエスト時の拡張子などを見て、認証をスルーさせるなどの手段。ただし、投稿者はMoodleにもphpにも詳しくないので、 上記の `manager.php`や`pluginfile.php` にそういった改変ができるのかはわからない。
  - 改変できたと仮定して、誰でも音声・映像にアクセスできるようになることが考えられるので、セキュリティポリシー面の考慮が必要そう。
4. 教材側を修正する
  - 音声・映像ファイルを認証の必要のない場所に配置しなおし、教材側もその場所のファイルをソースとして参照するように修正する。
  - 誰でも音声・映像にアクセスできるようになることが考えられるので、セキュリティポリシー面の考慮が必要そう。