2009-08-01 12 views
1

Mac OS Xアプリケーションは、ネットワーク(この場合はtext/x-vcard)を介してファイルを受信します。私のコードでは、パスやアプリケーション名をハードコーディングせずに関連するアプリケーション(通常はアドレス帳)を開いてファイルを処理するにはどうしたらよいですか?私のコードでUTIを担当するアプリケーションを起動する方法

答えて

2

これは、本当に便利な "LSCopyApplicationForMIMEType"機能を持つApplicationServicesフレームワークでリンクすることで可能になります。これは次のように機能します:

CFURLRef appURL = nil; 
OSStatus err = LSCopyApplicationForMIMEType(CFSTR("text/x-vcard"), kLSRolesAll, &appURL); 

if (err != kLSApplicationNotFoundErr) { 
    NSLog(@"URL: %@", (NSURL *)appURL); 
} 

CFRelease(appURL); 

パラメータの意味を説明します。最初のパラメータは、探しているMIMEタイプのCFStringRefです。 2番目のパラメータは、探しているアプリケーションの種類、つまりこのファイルを編集できるアプリケーション、またはこのファイルを表示できるアプリケーションなどを示します。kLSRolesAllは気にしないことを意味します。最後のパラメータは、CFURLRefへのポインタで、関数がアプリケーションのURLを(もしあれば)見つけることができます。私のマシン上で

が、これはプリントアウト:CFURLRefsについてのクールなものの

2009-08-01 12:38:58.159 EmptyFoundation[33121:a0f] URL: file://localhost/Applications/Address%20Book.app/ 

一つは、彼らはフリーダイヤルNSURLにブリッジしているということです。つまり、CFURLRefを取得してNSURLにキャストすることができます。その逆もあります。アプリケーションのNSURLを取得したら、NSWorkspaceの-launchApplicationAtURL:options:configuration:error:メソッドを使用してアプリケーションを開くのはとても簡単です。

そのアプリケーションで特定のファイルを開く場合(MIMEタイプを取得したファイルなど)、[NSWorkspace openFile:withApplication:]のようなものを使用できます。

あなたがあなたの質問で言っているにもかかわらず、MIMEタイプを取得できない場合は、同様のLaunchServices関数がたくさんあります。 You can read all about them here

+0

ありがとうございます!それはまさに私が必要とするものです。 –

0

アプリケーションを見つけようとするよりもむしろ、LSOpenItemsWithRoleを使用することができます。

//Opens items specified as an array of values of type FSRef with a specified role. 

OSStatus LSOpenItemsWithRole (
    const FSRef *inItems, 
    CFIndex inItemCount, 
    LSRolesMask inRole, 
    const AEKeyDesc *inAEParam, 
    const LSApplicationParameters *inAppParams, 
    ProcessSerialNumber *outPSNs, 
    CFIndex inMaxPSNCount 
); 
関連する問題