WebViewでFlashサイトを見ると異常終了する

印刷用表示 |テキストサイズ 小 |中 |大 |

Repeating Motif Wonderland

更新日 2011-10-02 | 作成日 2007-12-12

WebViewでFlashサイトを見ると異常終了する

2009.9.21


Drag&Drop対応のクラス群の為のサンプルコードを準備中

 CoreData対応のRepeating Motif Generatorの開発からすっかり遠ざかってしまいました。もう10ヶ月近く経過してしまい、中身をすっかり忘れています。こうなると、そう簡単には開発を再開できそうもありませんが、せめてDrag&Drop対応のクラス群(データソースやテーブルビュー)ぐらいは公開しておこうかと思って準備を始めました。

 CoreDataを使うアプリケーションでDrag&Dropに簡単に対応できるように作ったクラス群なので、サンプルプログラムもCoreDataらしいものにしたいところです。それなりに件数がたくさんあって、自由に利用できるデータには何があるだろうか?と考えて、青空文庫に目を付けました。青空文庫で公開されている書籍データを取り込んで、選択された書籍のウェブページを表示するというサンプルプログラムです。

 とりあえずこんな感じで動いています。

ピクチャ 1.png

初めて使うWebView

 サンプルプログラムの目的はDrag&Dropに対応させる為のクラスをどう使えばよいかを示す事なので、WebViewは本質とは関係ありません。しかし選んだ書籍の中身が見れないのでは、アプリケーションとしては意味のないものになります。

 WebViewは初めて使うのですが、本格的なウェブブラウザを作るわけではないので、その範囲内なら大して手間はかからないのではないかと思っていました。参考にした書籍にはバインディングの設定だけで、コードを一切書かずに使えると書いてあります。ところが書かれた通りにやろうとしても、そもそもbind to:の対象にWebViewが現れません。検索してみると、どうやらTigerではWebViewがビューでありながらコントローラ的な役割も果たしていたのでバインディング設定ができたのですが、LeopardではそのようなModel-View-Controllerの枠組みを壊すような事はやめたらしいのです。しかたがないので、ちょっとだけコードを書きました。

 配列コントローラのselectedObjectsをキー値監視を使って監視します。選択されている書籍が変更されたら以下のコードでページを更新します。estimatedURL:は書籍データからURLを推定して返すメソッドです。同じ作品IDの複数のレコードが存在するのに対してウェブページは一つしかないので、その辺りを解決する為に実際はもう少し複雑なコードなのですが、話が脇道にそれてしまうので省略します。

- (void)windowControllerDidLoadNib:(NSWindowController *)windowController
{
  [super windowControllerDidLoadNib:windowController];

  [self bind:@"worksSelections"
   toObject:works
  withKeyPath:@"selectedObjects"
    options:nil];
}

- (NSArray *)worksSelections  {return nil;}

- (void)setWorksSelections:(NSArray *)newSelections
{
  Work *selection;

  if([newSelections count] != 1) return;

  selection = [newSelections objectAtIndex:0];
  [[webView mainFrame] loadRequest:
   [NSURLRequest requestWithURL:
   [NSURL URLWithString:[self estimatedURL:selection]]]];
}

青空文庫のトップページにいくと異常終了する

 ウェブページを無事に表示できるようになってめでたしめでたしとなるはずだったのですが、何と青空文庫のトップページに移動するとクラッシュしてしまいました。問題なく表示できるページと必ずクラッシュするページがあって、青空文庫のトップページがダメなのです。作品を読む分には問題ないとはいえ、いつクラッシュするのかわからないというのでは、いくらサンプルプログラムとはいえひどすぎます。

 とりあえずコンソールに表示されるエラーメッセージを検索してみたところ、以下のページにたどりつきました。

 何と、はた迷惑な事にFlash 10(ベータ版ではなく正式版です)がデバッガを呼び出すコードを含んでいるというのです。Adobeの誰かがFlash Playerのコード中に"Debugger()"を置き忘れたという事なのでしょう。だからXcodeで実行中にFlashを含むウェブページを表示しようとすると、そこで強制停止するわけです。これ、知らなければちょっと原因が分からないのではないでしょうか?

 対策はXcodeの「実行」メニューの中にある「Debugger()/DebugStr()で停止」のチェックを外す事です。

ピクチャ 2.png