フランケンシュタインは博士の名前であって
「フンガー」などと抜かしている
ツギハギだらけのおっちゃんの名前ではない事に最近気がついた

どうも、相変わらず体調不良がまだ続いている
テクニカルラボ室長です

さて、あれから受付システムはどうなったのかというと
結構進んでしまって予定していた2月からの会社でデモがほぼ出来る様になった。

受付システムとしてネットワークによる音声会話ができる仕組みは
元々サンプルソースを参考にある程度実装は完了していたが
今回、主にiPad設置時を意識し画面操作やCMムービーなどで
いくつか調査や実装を行なったので紹介したい。
尚、言語はobjectiv-cを使用している

(1)CMムービー一時停止、再生
当初、以下のロジックの様にWebViewにそのままMP4ファイルをURLとして渡してやる事で
iPadにムービーが再生できたのでなーんだ余裕じゃんとか思っていたのだが・・・

NSString *filePath = [DocumentsDirPath stringByAppendingPathComponent:@"a.mp4"];
// NSURL の形式でパスを生成
NSURL* url;
url = [NSURL fileURLWithPath:filePath];
    
//NSURLRequest の形式でパスを生成
NSURLRequest* urlReq = [NSURLRequest requestWithURL: url];

なんとWebView上に対しては再生は出来るものの停止すら出来ない
これでは受付で会話中にムービーの音声が流れ続けて会話に邪魔になるやんけガッデムなんてこったい

とりあえず無音のムービーを流す事で解決しようかと思ったがそれではインパクトが足りん、
ちゃんとアプリで操作できるにしようと調べたらAVPlayerというオブジェクトをWebViewの上に置き、
AVPlayerのプロパティを操作する事でムービーの一時停止やボタンで再生などができる事がわかった。
そこで以下の様にロジックを修正した

//NSURLRequest の形式でパスを生成
NSURLRequest* urlReq = [NSURLRequest requestWithURL: url];

AVPlayer *avPlayer;
  ・
  ・
  ・
- (void)viewDidLoad
{
(中略)
NSString *filePath = [DocumentsDirPath stringByAppendingPathComponent:@"a.mp4"];
// NSURL の形式でパスを生成
NSURL* url;
url = [NSURL fileURLWithPath:filePath];
(中略)
avPlayer = [AVPlayer playerWithURL:url];
AVPlayerViewController *controller = [[AVPlayerViewController alloc]init];
(中略)
[avPlayer play]; //再生
(中略)
[avPlayer pause];

これであとは画面遷移させたり、ボタン操作におけるイベントを受け取って
一時停止や再生が可能になった。

(2)CMムービー繰り返し再生
会社の受付に設置する際、CMムービーをひたすら流す繰り返し再生を可能にしないと
CMになんねーわなと
AVPlayerに繰り返し再生としてプロパティにLoopをTureにするとかなんかあるんぢゃね?
ってかあるやろと、探してみたが繰り返し再生がない・・・ないやん、いやーん
と調べるとなんと、再生が終了したイベントを受け取る事ができる。
そこで再生が終了した際にムービーのシークバー(スクラブ)を0にシークし、
最初から再生し直すという方法で解決させた。

//ムービー再生が終了した時のイベント
- (void)playerItemDidReachEnd:(NSNotification *)notification {
    [avPlayer seekToTime:kCMTimeZero];//ムービーシークバーを最初の0カウントにシーク
    [avPlayer play];//再生開始
}

(3)ロック/スリープの禁止
iPhoneやiPadを使用した事がある人ならわかると思うが、
アプリを起動していても一定時間操作していないとスリープ機能により画面が暗くなりロックがかかる。
会社受付に画面が真っ暗なiPadがあったとしても、なんだこれ?扱いされてしまう可能性もあったので
ロック/スリープの禁止を行い、受付用端末であることを認識させるために
常に画面を表示させている必要がある。

そこで以下プロパティを指定しデバイスのスリープタイマーを無効化させ、
常に画面を表示させる様にした。

//ロック/スリープの禁止.デバイスのスリープタイマーを無効化します。
UIApplication* application = [UIApplication sharedApplication];
application.idleTimerDisabled = YES;

更に、受付システムアプリがバックグラウンドになったらスリープ機能をオンにさせる様にした。

// アプリがバックグラウンドになったら呼ばれる.
- (void)applicationDidEnterBackground:(UIApplication *)application
{
//ロック/スリープの禁止の解除.
[[UIApplication sharedApplication] setIdleTimerDisabled:NO];
}

他にも色々苦労したり、調査したこともあるのだが
それはまたの機会にしたいと思う。

んではー