2013-12-20 8 views
5

私は環境設定エディタツール(http://www.tempel.org/PrefsEditorを参照)を作成しています。実質的にはdefaultsコマンドのGUIバージョンです。OS Xのdefaultsコマンドは、サンドボックスアプリケーションの設定にどのようにアクセスできますか?

私は、ランダムなサンドボックスアプリケーションの設定を読んでいません。例えば

、私は地図アプリのキーを取得しようとすると、私はNULLが返されます:

CFArrayRef prefs = CFPreferencesCopyKeyList (CFSTR("com.apple.Maps"), kCFPreferencesCurrentUser, kCFPreferencesAnyHost); 

をしかし、defaultsコマンドは、これらの環境設定を読み取ることができます:

defaults read com.apple.Maps 

私はdefaultsコマンドがどのようにこれを達成し、私のツールで同じことをしようとしているか知りたい。

CFPropertyListRef prop = CFPreferencesCopyValue(CFSTR("ElementsVersion"), 
CFSTR("/Users/karsten/Library/Containers/com.apple.Maps/Data/Library/Preferences/com.apple.Maps"), 
CFSTR("kCFPreferencesCurrentUser"), 
CFSTR("kCFPreferencesAnyHost")); 

は、あなただけのバンドルID

+0

サンドボックスされていないとしますか? – trojanfoe

+1

@trojanfoeが正しいです。 OSビルドインコマンドはサンドボックス化されていないため、システムに無制限にアクセスできます。サンドボックス化されているので、あなたはアクセスできるデータに限られています。これは、UNIXの世界では 'chroot'のようなものです。 – Donovan

+0

もちろん、ソリューションはサンドボックス環境で実行することはできません。もちろん、これはApp Storeからの除外を意味します。 – Donovan

答えて

4

はそれを試します_CFPreferencesCopyApplicationMap()は、環境設定の完全なURLを取得する機能です。

#import <CoreFoundation/CoreFoundation.h> 

extern CFDictionaryRef _CFPreferencesCopyApplicationMap(CFStringRef userName, CFStringRef hostName); 

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool 
    { 
     CFDictionaryRef applicationMap = _CFPreferencesCopyApplicationMap(kCFPreferencesCurrentUser, kCFPreferencesAnyHost); 
     CFArrayRef urls = CFDictionaryGetValue(applicationMap, CFSTR("com.apple.mail")); 
     CFShow(urls); 
     CFRelease(applicationMap); 
    } 
} 
+0

はい、それは動作します。どうもありがとう! –

4

カルステンの答えが正しいですが、完全を期すために、defaultsコマンドは文書化されていないを使用して、ファイルへのパスをする必要はありませんようだ:

+0

もう一つの素晴らしい答え。私は、他の方法が将来壊れる場合のための代替方法としてそれを念頭に置くでしょう。これを理解するためにホッパーを使いましたか? (私がKarstenが答えを出さなかったなら、私はそれを自分自身で行うつもりでした) –

+1

私はHopperを使いましたが、 '(lldb)br set -r CFPreferencesCopy。*'を最初に見つけました。 – 0xced

関連する問題