グローバルキーダウンイベントを使用することがその操作の要件になるアプリに取り組んでいます。また、これをApp Store経由で厳密に配布する予定です. (これは Mac アプリであり、iOS ではありません。) addGlobalMonitorForEventsMatchingMask を介して動作するグローバル イベントをリッスンする例を取得しましたが、注意が必要です。
注: 私は最新の API を使用することを選択し、以前の Carbon ホットキー メソッドには依存しません。それらが最終的に廃止される場合、後でこの問題を解決する必要はありません。
主な問題は、グローバル イベントを検出するには、アプリが信頼されている必要があることです。それ以外の場合は、すべてのアプリでアクセシビリティを有効にする必要があります。アクセシビリティを有効にすると、イベントが正常に検出されます。この要件は、https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/MonitoringEvents/MonitoringEvents.htmlに記載されています。
ユーザーにとって、アクセシビリティを有効にする必要がないことを望みます。私が行った他の調査から、AXMakeProcessTrusted を呼び出してからアプリケーションを再起動することで、アプリケーションを信頼できるようにすることができます。
私が使用しているコードでは、認証プロンプトが表示されません。アプリは再起動しますが、まだ信頼されていません (認証プロンプトが表示されないためと思われます)。この部分の私のコードは次のとおりです。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
if (!AXAPIEnabled() && !AXIsProcessTrusted()) {
NSString *appPath = [[NSBundle mainBundle] bundlePath];
AXError error = AXMakeProcessTrusted( (CFStringRef)CFBridgingRetain(appPath) );
[self restartApp];
}
}
- (void)restartApp{
NSTask *task = [[NSTask alloc] init];
NSMutableArray *args = [NSMutableArray array];
[args addObject:@"-c"];
[args addObject:[NSString stringWithFormat:@"sleep %d; open \"%@\"", 3, [[NSBundle mainBundle] bundlePath]]];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:args];
[task launch];
[NSApp terminate:nil];
}
さらに、 https://developer.apple.com/library/archive/documentation/Security/Conceptual/authorization_concepts/03authtasks/authtasks.html#//apple_ref/doc/uid/の認証サービスタスクのドキュメントを見てきましたTP30000995-CH206-BCIGAIAG .
最初に気になるのは、この情報ボックスです。「重要: 認証サービス API は、権限のエスカレーションが許可されているため、アプリ サンドボックス内ではサポートされていません。」
アプリを再起動する前に認証プロンプトを取得するためにこの API が必要な場合、アクセシビリティ機能を有効にしないとグローバル イベントを取得できない可能性があります。
要約すると、私の具体的な質問は次のとおりです。
認証プロンプトを表示する方法に関するサンプル コードにエラーはありますか?
認証プロンプトを表示するには、Authorization Services API を使用する必要がありますか?
グローバルイベントにアクセスできるサンドボックス化されたアプリを持つことは可能ですか、それとも不可能ですか?