MPMovieRepeatModeOneが動かない問題の回避法

iOS 5.0〜5.1.1のiPhone 3GSと、iPod touchにおいて、
[c][self.player setRepeatMode:MPMovieRepeatModeOne];[/c]
による動画のリピート再生が動作しませんでした。
iOS Simulatorと、iPad 3では問題無くリピート再生されるので、機種依存の問題のようです。

仕方ないので、次のようにNotificationを受け取って、リピートする形にしました。

1. Notificationを受け取る設定
[c][[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moviePlayerDidFinish:)
name:MPMoviePlayerPlaybackDidFinishNotification
object:self.player];[/c]

2. Notificationの受け取り
[c]- (void)moviePlayerDidFinish:(NSNotification *)notification {
[self play];
}[/c]

しかし、これでも動きませんでした
色々と試したところ、Notificationを受け取った後、
すぐにplayメソッドを呼んでも反応しない仕様のようでした。
そこで、次のように0.02秒間待機した後playメソッドを呼ぶと、
少しカクつくものの、リピートできました。

[c]- (void)moviePlayerDidFinish:(NSNotification *)notification {
double delayInSeconds = 0.02f;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[self.player play];
});
}[/c]

ちなみに、次のコードでもリピートできます。
NSLogを呼んでいる間に、0.02秒経つのでしょう。

[c]- (void)moviePlayerDidFinish:(NSNotification *)notification {
NSLog(@”Repeat”);
[self play];
}[/c]

この不思議な仕様、iOS 6では改善して欲しいものです。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ