差分

ナビゲーションに移動 検索に移動

Xamarin.Mac/アクセシビリティの許可の有無を取得する

1,332 バイト追加, 2015年10月15日 (木) 04:45
編集の要約なし
[[Mac OS X]]のGlobal Event Monitorなどの一部の[[API]]は[[システム環境設定]]にあるアクセシビリティの許可がされていない状態では機能しない。
*[[Xamarin.Mac/Global Event Monitorでキー入力を監視する]]
恐ろしいことにアクセシビリティの許可がされていない状態でGlobal Event MonitorなどのAPI呼び出しを行ってもスルーされるだけで[[エラー]]も何も発生しない。 この挙動は確実に半年くらいしてどんな実装だったかを忘れたころにトラブルになり、[[エラー]]も出ないので[[デバッグ]]も捗らず原因不明の[[バグ]]に悩まされ、[[デスマーチ]]突入は決定的である。
これを回避するためアプリ起動時にアクセシビリティの許可がされているかを確認し、未許可であれば警告を出す必要がある。
==実装:TCC.db==
アクセシビリティの設定は「/Library/Application Support/com.apple.TCC/TCC.db」という[[ファイル]]に保存されている。このファイルの中身は[[SQLite3]]のデータベースとなっており、sqlite3コマンドで普通に開ける。ただしroot権限が必要となる。
<source lang="bash">
$ sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db
</source>
 
TCC.dbのテーブル構成は以下のようになっている。
<source lang="sql">
sqlite> .schema
CREATE TABLE admin (key TEXT PRIMARY KEY NOT NULL, value INTEGER NOT NULL);
CREATE TABLE access (service TEXT NOT NULL, client TEXT NOT NULL, client_type INTEGER NOT NULL, allowed INTEGER NOT NULL, prompt_count INTEGER NOT NULL, csreq BLOB, CONSTRAINT key PRIMARY KEY (service, client, client_type));
CREATE TABLE access_times (service TEXT NOT NULL, client TEXT NOT NULL, client_type INTEGER NOT NULL, last_used_time INTEGER NOT NULL, CONSTRAINT key PRIMARY KEY (service, client, client_type));
CREATE TABLE access_overrides (service TEXT PRIMARY KEY NOT NULL);
</source>
 
このうちaccessというテーブルにアクセシビリティの設定値が保存されている。
<source lang="sql">
select * from access;
</source>
==実装:ApplicationServicesフレームワークを使用する==
匿名利用者

案内メニュー