はじめにDashboardウィジェットの作成は難しくありませんが、何か問題が発生すると、その対処は困難である場合があります。Objective-CやJavaのような言語を使い慣れている開発者は、ウィジェットの作成に使用するWebベースの技術によって提供されるものよりももっと思い通りのコントロールとより多くのフィードバックに慣れているかもしれません。このテクニカルノートでは、開発者が開発にかける時間を有効に活用できるように、そのようなコントロールとフィードバックを手に入れるための有効な手段について説明します。 このテクニカルノートの位置付けは、『Dashboardプログラミングガイド』への補足です。Dashboardウィジェットの作成方法を習得することに関心がある開発者は、まず前掲のドキュメントをお読みください。本稿では、ウィジェット開発の基礎は取り上げません。 Safariでの開発ウィジェットを開発するときに留意すべき最も重要なことの1つは、ウィジェットはいろいろな意味でWebページにすぎないということです。DashboardウィジェットはSafariと同じWeb Kitレンダリングエンジンを使用しているため、開発のほとんどすべてをSafariで行えます。その際に、複雑さが増す原因となるバンドリング、プロパティリスト、デフォルト画像、およびアイコンを考慮する必要がありません(これらについては後述)。 すでにウィジェットをバンドルにしている場合、Finderですべての内容を表示するには、単純に Safariでコンテンツをテストすることは、特にJavaScriptエラーの面では不可欠です。DashboardはJavaScriptエラーを「コンソール」アプリケーションに報告しますが、エラーの原因を絞り込むためにウィジェット内部から実行をブロックするのは困難です。また、Safariでの作業は、 Safariでデバッグを行うための最初の重要なステップは「Debug」メニューを有効にすることです。これを行うには、リスト1に示す「ターミナル」コマンドを入力します。 リスト1:Safariで「Debug」メニューを有効にする l337_d3v$ defaults write com.apple.Safari IncludeDebugMenu 1 次回Safariを起動したときに、ヘルプメニューの右に「Debug」メニューが表示されます。できるだけ多くのフィードバックを得るために、必ず「Log JavaScript Exceptions」項目を選択します。Mac OS X v10.4の新機能の1つにJavaScript Consoleがあります。これも「Debug」メニューから有効にできます。JavaScript Consoleを有効にしたら、いつでも作業を開始できます。 デバッグ情報の出力JavaScriptプログラミングにおいて最も基本的で一般的なデバッグ支援機能は
Dashboardで実行すると、 デバッグ要素は、ページのどこかに リスト2:既存コンテンツにデバッグ用divを挿入 <html>
<head>
<style type="text/css">
#debugDiv {
border-style:dotted;
border-color:black;
background:gray;
position:absolute;
bottom:0px;
left:0px;
height:200px;
width: 90%;
overflow:scroll;
display:none;
}
</style>
<script language="JavaScript" type="text/javascript">
var debugMode = false;
// Safariの中にいる場合は、デバッグ用divに書き込む。
// Dashboardにいる場合は、「コンソール」に簡単なアラートを送信する。
function DEBUG(str) {
if (debugMode) {
if (window.widget) {
alert(str);
} else {
var debugDiv = document.getElementById('debugDiv');
debugDiv.appendChild(document.createTextNode(str));
debugDiv.appendChild(document.createElement("br"));
debugDiv.scrollTop = debugDiv.scrollHeight;
}
}
}
// debugModeフラグを切り替えるが、SafariではdebugDivのみを表示する
function toggleDebug() {
debugMode = !debugMode;
if (debugMode == true && !window.widget) {
document.getElementById('debugDiv').style.display = 'block';
} else {
document.getElementById('debugDiv').style.display = 'none';
}
}
</script>
</head>
<body onload='toggleDebug();DEBUG("loaded!");'>
<!-- 既存のすべてのコンテンツ...-->
Hello World!
<!-- デバッグ用divを任意の場所で宣言する配置はCSSによって処理される -->
<div id='debugDiv'></div>
</body>
</html>
図1に、上記のページがSafariでどのように表示されるかを示します。 図1:デバッグ/ログ用のdivを使った簡単なWebページ
もう1つの手法は、 本稿では、JavaScriptデバッグの基礎については述べません。JavaScriptデバッグの基礎に関する優れた記事が、The JavaScript Sourceにあります。同記事はすでに古く、JavaScriptやDHTMLの新しい機能をいくつかカバーしていませんが、記事に記載されている情報と一般的な落とし穴の大半は今でも通用します。特に、上記の 開発モードの有効化ウィジェットをバンドル形式にしてテストする段階になると、ウィジェットとデスクトップアプリケーション(「コンソール」や変更を加えるために使用しているエディタなど)の間で表示を切り替えるためにDashboardの表示/非表示を繰り返すのが煩わしくなってきます。Dashboardの表示/非表示を切り替える回数を最小限に抑えるには、Dashboardを開発モード(Development Mode)にします。そうすることで、Dashboardが表示されていないときでも、ウィジェットを画面に表示したままにできます。開発モードを有効にするには、次の手順を実行します。
ウィジェットが表示されたままなので、出力を確認し、変更を加え、読み込みなおす作業がずっとスムーズになります。 注:ウィジェットを読み込みなおすには、そのウィジェットにフォーカスを設定して、キーボードでCommand-Rを押します。ウィジェットのコンテンツを読み込みなおしていることを示す、「旋回」アニメーションが表示されます。 起動しないウィジェットすべてのコンテンツを Dashboardがまったく表示されない作動するウィジェットをFinderでダブルクリックすると、Dashboardが表示され、そのウィジェットが読み込まれます。ウィジェットをダブルクリックしても、Dashboard自体が表示されない場合、バンドルから以下の項目のいずれか1つが欠落している可能性があります。
デフォルト画像、内容なしウィジェットがDashboardに正常に表示されたら、メインコンテンツが読み込まれている間、画面上にはデフォルト画像が表示されているはずです。デフォルト画像が消えて、代わりに何も表示されなければ、 注:このようなことが起こると、ウィジェットを閉じるのが難しい場合があります。このような場合の最も簡単な対処法はウィジェットバーを表示することです。そうすると、画面上のすべてのウィジェットにクローズボックスが表示されます。 表示されていても反応しないコンテンツは、 (ウィジェット)バーから放り出されるウィジェットをウィジェットバーに表示するには、 2つのインストールディレクトリの一方に追加したウィジェットは、次回Dashboardを表示したときに現れます。ウィジェットが現れない場合は、オフスクリーンになっているだけかもしれないので、ウィジェットバーのリストをすべて循環させて探ってみてください。ウィジェットバーは、各ウィジェットのローカライズされた 注:Mac OS Xの他の部分と同様に、ウィジェットバーは、ローカライズされた 個別機能の障害Webコンテンツ:ネットワーク、組み込み、ファイル入出力、Java『Dashboardプログラミングガイド』の「セキュリティ」セクションで述べているように、Webコンテンツの機能によっては、Dashboardウィジェット内で機能するために特別な
上記カテゴリのいずれかに該当するコンテンツがウィジェット内にあるものの、適切な ウィジェットの環境設定ウィジェットの環境設定を書くときによくやる間違いは、必要なパラメータを逆にすることです。 また、環境設定値とキーを文字列として永続化することも重要です。プリミティブ値またはオブジェクトは環境設定に正常に永続化できない可能性があります。永続化を試みると、通常はリスト3のようなエラーが「コンソール」に出力されます。 リスト3:一般的なウィジェット環境設定の書き込みエラー DashboardClient[869] CFLog (15):Could not generate XML data for property list ウィジェットの環境設定がウィジェットの状態を保存するメカニズムであることにも触れておく価値があります。ユーザはいつでもログアウトしたり、コンピュータを再起動できますが、その時点でウィジェットのプロセスは終了されます。ユーザが再ログインしてDashboardを再度表示したときに復元したい一時的な状態がある場合は、状態に変更があったときにただちにウィジェット環境設定としてその状態を書き出し、ウィジェットインスタンスの読み込み時に取り出す必要があります。 注: ウィジェットプラグインウィジェットプラグインの背後にある考え方は単純で、JavaScriptからネイティブなコードおよびAPIにアクセスできるようにすることです。このセクションでは、プラグインを開発するときによく生じる問題、それらの問題を認識する方法、問題を解決・防止する方法を取り上げます。ウィジェットプラグイン開発の基礎は『Dashboardプログラミングガイド』で説明しているため、ここでは述べません。 プラグインはどこ?ウィジェットプラグインに関して最もよくある問題は、プラグインが表示されないことです。この問題では通常、リスト4のようなエラーも「コンソール」に表示されます。 リスト4:欠落したウィジェットプラグインによる一般的なエラー DashboardClient[123] (com.mycompany.MyWidget) undefined:Can't find variable:MyWidgetPlugin (line: 0) これは実際には、JavaScriptの一般的な「未定義変数」エラーです。このエラーの特徴は、問題の変数がウィジェットプラグインの名前であることです。このエラーは、JavaScriptコードがプラグインを参照しようとするたびに表示され、ウィジェットがその変数をプラグインとして認識していないことを示します。これは通常、以下のいずれかの原因が考えられます。
図2:Xcodeターゲット設定の「プロダクト名」および「実行可能ファイル」プロパティ
( リスト5:ウィジェットプラグインの読み込みを報告
- (id) initWithWebView:(WebView*)webview {
NSLog(@"I'm in!");
// 初期化...
return self;
}
注:ウィジェットを配布するときには、忘れずにプラグインから プラグインの呼び出しウィジェットプラグインのメソッドは、 また、呼び出そうとしているメソッド、または参照しようとしているメンバを、 これらのメカニズムのいずれかによってブロックされているプラグインメソッドを呼び出すと、リスト6に示すように「コンソール」エラーが生じます。 リスト6:JavaScriptからメソッドが見つからない一般的なエラー Value undefined (result of expression MyPlugin.MyMethod) is not object.(line: 10) プラグインのクラッシュプラグインの複雑さによっては、開発中や使用中にクラッシュしたりハングすることもあります。クラッシュが確かにコードの中で起こっていれば、ウィジェットを読み込んだ このドキュメントでは、ウィジェットプラグインを対象にgdbを使用する最善の方法についてのみ述べます。gdbの一般的な利用については、「Getting Started With gdb」または「Debugging With gdb」を参照してください。 プラグインへのgdbのアタッチウィジェットにアタッチするには、そのウィジェットに対応する 図3:アクティブティモニタ内のDashboardウィジェット
また、 起動時のクラッシュをキャッチプラグインが読み込まれるとすぐにクラッシュする場合、 リスト7:ループを使ってウィジェットプラグインを停止
-(id)initWithWebView: (WebView*) w {
NSLog(@"initWithWebView");
// 何か実のあることをする前にループを回す
// これでgdbとアタッチする時間を稼ぐ
int spin = 1;
while (spin == 1) {
usleep(1000);
}
self = [super init];
return self;
}
これでウィジェットをとどまらせ、クラッシュが起こる前にgdbとアタッチできます。「コンソール」の pidを得たら、プロセスにアタッチしてループ条件を変更し、実行を想定どおり継続できます。図4に、この簡単な例を示します。 図4:gdbからループを脱出
ドキュメント改訂履歴
掲載日: 2005-09-07 | ||||||||||||
|