Apple Developer Connection
高度な検索
Member Login ログイン | ご入会 ADC連絡先

Cocoaアプリケーションの「About」パネル作成

Cocoaアプリケーションの「About」メニュー項目は、orderFrontStandardAboutPanel:メッセージを送ることで作成されます。そのメッセージは、レスポンダチェーンの下位から上位へ送られ、結果的にNSApplicationに渡されます。NSApplicationがそのメッセージを受け取ると、Info.plistファイルおよびアプリケーションバンドル内のResourcesフォルダから集めたさまざまな情報で「About」パネルを作成します。

Xcodeプロジェクトに必要な情報を指定しておけば、標準「About」パネルを使用する際に、ほかの作業は必要ありません。

しかし、orderFrontStandardAboutPanelWithOptions:メッセージを使用して、プログラミングによって実行時に決まる値を持つ標準「About」パネルを作成および表示することもできます。もう1つの方法は、標準「About」パネルの動作を完全にオーバーライドすることで、独自の「About」パネルを作成します。





「About」パネルのプロパティリスト値

情報プロパティリストファイルには、バンドルされている実行可能ファイルの基本的な設定情報が含まれています。ほとんどのバンドルには、この種類のファイル(通常、ファイル名はInfo.plist)が少なくとも1つはあります。その情報の一部を使ってアプリケーションの「About」パネルが作成されます。

orderFrontStandardAboutPanelWithOptions:を使用して「About」パネルを表示する場合、オプションディクショナリの定義に使用する、さまざまな属性およびキーについてよく理解している必要があります。

表1:次のキー文字列は、オプションディクショナリで使用できるキーです。

属性キー文字列説明
クレジット@"Credits"「About」パネルの情報領域に表示されるNSAttributedString

指定がない場合、このメソッドはNSBundleクラスのmainBundleメソッドが返したバンドルの中をファイル「Credits.html」、「Credits.rtf」、「Credits.rtfd」の順で探します。そして、最初に見つかったファイルが使用されます。ファイルが見つからない場合は、この領域は空のままです。
アプリケーション名@"ApplicationName"アプリケーションの名前として表示されるNSStringオブジェクト。

Info.plistファイル(ローカライズ可能)にある「CFBundleName」キーの文字列値を使用します。

見つからない場合、このメソッドは [[NSProcessInfo processInfo] processName]を使用します。この文字列は、アプリケーションがアクティブのときに、メニューバーに表示されます。
アプリケーションアイコン@"ApplicationIcon"アプリケーションの名前として表示されるNSImageオブジェクト。

Info.plistファイルにある「CFBundleIconFile」キーの文字列値を使用します。

文字列値の中にあるファイル名の拡張子は必須ではありません。拡張子を省いた場合、Mac OS Xは「.icns」拡張子で終わるその名前のファイルを探します。指定がない場合は、このメソッドは[NSImage imageNamed:@"NSApplicationIcon"]を使用して、「NSApplicationIcon」という名前の画像を探します。
アプリケーションバージョン文字列@"Version"アプリケーションのビルドバージョン番号(たとえば「58.4」)を持つNSStringオブジェクト。

指定がない場合、このメソッドはInfo.plistファイルにある「CFBundleVersion」キーの値を使用します。
ビルドバージョン文字列@"ApplicationVersion"アプリケーションバージョン(たとえば「Mac OS X」、「3」、「WebObjects 4.5」、「AppleWorks 6」など)を持つNSStringオブジェクト。アプリケーションバージョンは、マーケティングバージョンとも見なされます。

指定がない場合、このメソッドはInfo.plistファイルにある「CFBundleShortVersionString」キーの値を使用します。

そのどちらも使用できない場合、ビルドバージョンがあるなら、「Version x.x」という形で単独で表示されます。この値は「Finder」プレビューにも表示されます。
著作権@"Copyright"著作権情報を持つNSStringオブジェクト。

指定がない場合、このメソッドはInfo.plistファイルにある「NSHumanReadableCopyright」キーの文字列値を使用します。

その文字列値が見つからない場合、著作権の領域は空のままです。

先頭に戻る

バージョン表示フォーマット

「About」パネルのバージョン文字列を作成するアルゴリズムは、マーケティングバージョン(MV)およびビルドバージョン(BV)があるかどうかに応じて、次のように「About」パネルに表示します。

Version MV (BV)

Version MV

Version BV

上記の表の繰り返しになりますが、MVはディクショナリのApplicationVersionに由来し、ディクショナリにない場合は、Info.plistファイルのCFBundleShortVersionStringに基づきます。BVは、ディクショナリのVersionに由来し、ディクショナリにない場合は、Info.plistファイルのCFBundleVersionに基づきます。

Tiger以降のシステムでは、単語「Version」を追加します。Tiger以前のシステムでは、「v」をその代わりとして使用しています。

先頭に戻る

'orderFrontStandardAboutPanelWithOptions'を使用した「About」パネル

この例では、オプションのディクショナリを用いて標準「About」パネルを使用する方法を示します。クレジットセクションを実装するかどうか(すなわち、使用しているプロジェクトに「Credits.rtf」ファイルを入れるかどうか)は、任意です。クレジットセクションが特定の著作権表示も提供するならば、文字列NSHumanReadableCopyrightがある場合は、その文字列をInfoPlist.stringsファイルから削除する必要があります。

リスト1:'orderFrontStandardAboutPanelWithOptions'を使用したサンプル

#import "Controller.h"

@implementation Controller

- (IBAction)openAboutPanel:(id)sender
{
    NSDictionary *options;
    NSImage *img;

    img = [NSImage imageNamed: @"Picture 1"];
    options = [NSDictionary dictionaryWithObjectsAndKeys:
          @"1.1", @"Version",
          @"Super App", @"ApplicationName",
          img, @"ApplicationIcon",
          @"Copyright 2005-2006, My Great Company", @"Copyright",
          @"Super App v1.1", @"ApplicationVersion",
          nil];

    [[NSApplication sharedApplication] orderFrontStandardAboutPanelWithOptions:options];
}

@end

図1:リスト1による「About」パネルのサンプル

図1 リスト1による「About」パネルのサンプル

先頭に戻る

独自の'NSView'を使用した「About」パネル

独自の「About」パネルを作成するには、使用しているアプリケーションのバンドル情報を直接読み、自分のパネルやウインドウもしくはNSViewにそのバンドル情報を表示できます。リスト2では、InterfaceBuilder IBOutletsを使用していないことに注目してください。その代わりに、埋め込まれた各NSViewがそのタグにより参照されます。また、InfoPlist.stringsエントリがInfo.plistエントリに優先することに留意してください。

リスト2:独自のNSViewで「About」パネルの使用法を示すサンプル

@interface AboutView : NSView
{}
@end

@implementation AboutView

-(id)infoValueForKey:(NSString*)key
{
    if ([[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:key])
        return [[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:key];

    return [[[NSBundle mainBundle] infoDictionary] objectForKey:key];
}

- (void)drawRect:(NSRect)rect
{
    [super drawRect: rect];

    // 背景を白に描画する
    [[NSColor whiteColor] set];
    [NSBezierPath fillRect:rect];

    // NSBundle情報を表示する
    NSString* nameStr = [self infoValueForKey:@"CFBundleName"];
    NSTextField* field = [self viewWithTag: 1];
    [field setStringValue: nameStr];

    NSString* versionStr = [self infoValueForKey:@"CFBundleVersion"];
    field = [self viewWithTag: 2];
    [field setStringValue: versionStr];

    NSString* copyrightStr = [self infoValueForKey:@"NSHumanReadableCopyright"];
    field = [self viewWithTag: 3];
    [field setStringValue: copyrightStr];

    // アプリケーションのアイコンを描画する
    NSImage* iconImage = nil;
    NSImageView* imageView = [self viewWithTag: 0];
    NSString* iconFileStr = [self infoValueForKey:@"CFBundleIconFile"];
    if ([iconFileStr length] > 0)
    {
        // アイコンの実体が存在する
        iconImage = [NSImage imageNamed: iconFileStr];
    }
    else
    {
        // アプリケーションアイコンが定義されていないので、デフォルトのシステムアイコンを使用する
        iconImage = [NSImage imageNamed: @"NSApplicationIcon"];
        // もしくは
        //NSString* appIconType = NSFileTypeForHFSTypeCode(kGenericApplicationIcon);
        //iconImage = [[NSWorkspace sharedWorkspace] iconForFileType:appIconType];
    }
    [imageView setImage: iconImage];
}

@end

先頭に戻る

技術文書

先頭に戻る

ドキュメント改訂履歴

日付メモ
2007-01-22初版

掲載日: 2007-01-22




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.