ASの最近のブログ記事

どうも、@okajunです。

最近、ちょこちょこ勉強しているprogression。
こないだprogression4にヴァージョン移行してから初めて案件で使用しました。

その時に生じたバグとその解決方法を一つ書きたいと思います。

progressionの最大の売りの一つにシーン遷移における個別URLの発行があります。
非常に有難い機能なのですが今回、1つだけこの個別URLの発行に伴う、
シーン移動(画面遷移のモーション)のアニメーションがうまく動作しない現象が起きました。

状況としては、WEBブラウザの戻る、進むボタンを使用して各個別URLに移動させた場合で
スタートシーンとなるindexシーンに戻る際にだけ画面遷移のモーションが発生しないというバグです。


index(URL: /)トップページ
↓ シーンAというボタンをクリックして移動
index/sceneAへ移動(URL: /#/A)
↓ シーンBというボタンをクリックして移動
index/sceneBへ移動(URL: /#/B)

その後に

index/sceneB(URL: /#/B)
↓ ブラウザ戻るボタン
index/sceneAの画面へ戻る(URL: /#/A)...ここではシーンBからAへの遷移モーションがちゃんと発動
↓ ブラウザ戻るボタン
個別URLは「/」になるが画面はsceneAのままから変わらずでTOPに戻る遷移モーションが発動しない!!

これと同じ現象がprogressionのフォーラム記事にもあり、そこに書いてある解決法を用いて何とか
このバグを対処する事が出来ました。

【原因】
progressionの個別URL発行や画面遷移で使われているSWFAddress2.4ではEXTERNAL_CHANGEイベントで
ブラウザ操作によるURL遷移を検知するとのこと。
Progressionのlibsの中でこのイベントを使っている「WebSynchronizer.as」の定義で
足りない部分があり、今回の様なバグが起こるとの事でした。
SWFAddressからswfへ正しくURL変更情報が渡っているかと思いきや、
indexシーンに戻る際にだけ空白文字「」が帰ってきており、
「_externalChange」メソッドにおいて、空白文字の場合はsceneIdの書式として正しくないとして、
シーン移動が発動しないようになっている事でこういった事象が起きていたみたいです。

【解決方法】
SWFAddressからswfへ渡されるURL変更情報が空白文字の時は
indexシーンに戻るように修正する。

(WebSynchronizer.as)にて
-------------------------
if ( path == "/" ) {
_target.goto( _target.root.sceneId );
return;
}
-------------------------

-------------------------
if (( path == "/" ) || ( path == "" )) {
_target.goto( _target.root.sceneId );
return;
}
-------------------------


以上の様に修正した所、indexシーンに戻る際も正常に
遷移モーションが発動するようになりました。