seekpoint

devlog

PostNotification With Object

DarwinNotifyCenter

PreferenceLoaderからtweakの設定変更時の変更通知としてスタンダードになっているCFNotificationCenterのDarwinNotifyCenterですが、これはシステムグローバル用の通知として設計されており、

void CFNotificationCenterPostNotification(CFNotificationCenterRef center,
        CFStringRef name,
        const void *object,
        CFDictionaryRef userInfo,
        Boolean deliverImmediately);

CFNotificationCenterPostNotificationにおける引数object, userinfo, deliverimmediatelyは無視されNULLになります。であれば、有効な引数はnameだけなので、uint32_t notify_post(const char *name);はcenterをDarwinでnameを引数に取りその他をNULLにした便利関数です。

通常であれば何か変更が入ったら全て設定値をロードしなおせば良いが、極々まれにそれでは都合が悪い場合(パフォーマンスとか)があります。何の設定が変更されたかをPreferenceBundleとして得る事はセッターを設定すると得られますが、それを対象のプロセスに伝える方法としてIPCをするのは大げさでちょいと面倒でした。

DistributedCenter

CFNotificationCenterRefには3種類あり、Darwin, Local, Distributedの3種類があります。このうち、DistributedはiOSではimportされない記述になっています。

#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) || TARGET_OS_WIN32
CF_EXPORT CFNotificationCenterRef CFNotificationCenterGetDistributedCenter(void);
#endif

が、iOS 5からいつのまにか内部的には実装されていました。 サンプルコードはdev wikiに書きました。 Cloakyは1.6.3からこれを使用してステータスバーアイコンのON/OFF設定を検出しています。