
サンドボックスは、macOSをより安全にし、悪意のある、潜在的に危険なアプリケーションからユーザーを保護するように設計されています。 理論的には、これは合理的な予防策ですが、実際には、基本的な機能を実行するためにユーザーデータを必要とする多くのアプリケーションは制裁の対象となります。 この記事では、Sandboxとの互換性を維持しながら、アプリケーションにそのような関数を実装する方法を説明します-おそらく、この経験は公式市場で作業する他の開発者に役立つでしょう。
MaCleaner Xシステム監視ユーティリティを使用する場合、パートナーも同様のニーズに直面しました。 MaCleaner製品ライン全体は、Mac App Storeを通じてのみ配布されます。
MaCleaner Xの特徴的な機能は、タッチバーのサポートとカスタマイズされたデザインです。アプリケーションはMacモデルを自動的に検出し、各デバイスに特別なインターフェイスオプションを提供します。 ただし、これに加えて、現在、ユーザーがプログラムで見たい機能や、Mac Store以外で配布されているユーティリティに馴染みのある機能を高度なバージョンで実装するよう取り組んでいます。
まず第一に、これらは次のとおりです。
- アプリケーションおよびすべての関連情報の削除。
- macOSからの未使用のサービスファイルの削除(ログ、ローカライズ、一時);
- ハードウェア(たとえば、ハードドライブ)に関するシステム情報を取得します。
- システムの温度およびその他のインジケータを監視します。
解決方法
まず、プロセス全体がどのスキームに従って行われるかに従って、一般的な用語で概説します。
- ユーザーは、機能を拡張するためのアクセスに同意する必要があります(実際、アプリケーションの外部でいくつかのアクションを実行する必要があります)。
- アプリケーションは常にサンドボックスで動作しますが、必要に応じて、管理者アクセス権を必要とする各アクションの前に、ユーザーに許可を求めます。
サンドボックスの外部でこの操作を実行するには、次のmacOS機能を使用します:Apple Scriptを使用して機能の拡張をサポートするアプリケーションは、〜/ Library / Application Scriptsフォルダーにある場合、サンドボックスの外部でこれらのスクリプトを実行できます。 Sandboxをサポートするアプリケーションは、スクリプトをこのフォルダーに単独でコピーすることはできません-これはAppleモデレーターによって抑制されています。
したがって、次のような一連のアクションがあります。
- Application ScriptsフォルダーのApple Scriptを使用して拡張機能をサポートするマスターアプリケーションの実装。
- Mac Storeでのアプリケーションのモデレートパッシングと公開
- 拡張アプリケーションの準備。 彼のタスクには、必要なスクリプトをマスターアプリケーションを使用して共有フォルダーにコピーすることが含まれます。 これを行うには、交換が行われる共通のAppGroupが必要です。
- 独自のサイトで拡張アプリケーションを公開します。
例
例として、bashコマンド
system_profiler SPStorageDataType
を使用して現在のメディアに関する情報を取得する可能性を検討します。
拡張アプリケーションの準備
このコンポーネントに必要なのは、スクリプトを特定のフォルダーにコピーすることだけです。 したがって、そのインターフェイスでは、メディアに関する情報の表示を有効または無効にする唯一の可能性を表示します(詳細をユーザーに読み込まないために、これはマスターアプリケーションでプラグインを有効または無効にすることで表すことができます)。
Apple Sript-bash
ectentionによってコピーされるextract_storage_info.scptファイルの内容:
do shell script "system_profiler SPStorageDataType"
マスターアプリケーションの準備
アプリケーションが正しく機能するには、ユーザーの観点から、追加機能の可用性を確認し、UIの対応する部分を非表示にする必要があります。
- (BOOL) isStorageInfoAvailable { return [self _storageInfoScriptTask] != nil; } #pragma mark - Private - (NSUserAppleScriptTask *)_storageInfoScriptTask { NSUserAppleScriptTask *result = nil; NSError *error; NSURL *directoryURL = [[NSFileManager defaultManager] URLForDirectory:NSApplicationScriptsDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&error]; if (directoryURL) { NSURL *scriptURL = [directoryURL URLByAppendingPathComponent: StorageInfoScriptFileName]; result = [[NSUserAppleScriptTask alloc] initWithURL:scriptURL error:&error]; if (error != nil) { NSLog(@"No AppleScript \"%@\" task error: %@", StorageInfoScriptFileName, error); } } else { // , Sandbox NSLog(@"No Application Scripts folder error: %@", error); } return result; }
スクリプトが使用可能な場合、次のように呼び出されます。
NSUserAppleScriptTask * automationScriptTask = [self _storageInfoScriptTask]; if (automationScriptTask != nil) { [automationScriptTask executeWithAppleEvent:nil completionHandler:^(NSAppleEventDescriptor *resultEventDescriptor, NSError *error) { if (error != nil) { NSLog(@"AppleScript \"%@\" executing error: %@", StorageInfoScriptFileName, error); //TODO: GUI } else { NSString* resultString = [resultEventDescriptor stringValue]; NSLog(@"Result string:\n%@", resultString); // } }]; } else { //TODO: GUI }
簡単な例では、実行されたスクリプトから受け取った文字列をそのまま表示します。 アプリケーションインターフェイスを定型化するには、結果を解析し、必要な情報のみを表示する必要があります。
アプリケーションコラボレーション
その結果、次の作業スキームが得られます。
マスターアプリケーション
- 追加機能が利用できない場合、UI要素を非表示にします。
- スクリプトを展開する場合、Apple Script(特定の形式)がUIをアクティブにして実行します。
- Apple Scriptによって実行される機能で管理者アカウントデータの入力が必要な場合、ユーザーには標準の認証ダイアログが表示されます。AppleScriptがこの作業を行います。
拡張アプリケーション
- ユーザーが開発者のサイトからダウンロードする必要があります。 システムの機能の原理と、正しい操作のためにユーザーが実行する必要があるアクションをユーザーに説明する必要があるため、特別なサイトについて話します。 一部には、これはGUI拡張を介して実行できます。
- サンドボックスの外で作業しているという事実にもかかわらず、コンポーネントソリューションに共通のAppGroupを使用することをお勧めします。
- このコンポーネントは、Extension Managerとしてさらに広く表現できます。 一貫性のあるインターフェイスのおかげで、マスターアプリケーションは、共有フォルダーに拡張機能が表示されると拡張できます。拡張機能は、説明ファイルと構成と共に追加できます。
- コピーされたApple Scriptには、任意のbashコマンドを受け入れて実行する一般的なタスク関数(bash_script)が含まれている場合もあります。 しかし、このアプローチは大きなセキュリティホールを開き、App Storeに公開する前にマスターアプリケーションに拡張機能を含めることを義務付けます。
結論
アプローチの利点:
- アプリケーション機能拡張
- 拡張機能の構成可能性
短所:
- ユーザビリティの観点からは不適切です。 ユーザーから追加のアクションが必要です-サードパーティのアプリケーションをダウンロードします。
- 潜在的なセキュリティホールと追加チェックの必要性、フォーマットの一貫性。
この記事では、開発者向けのSandboxの製品機能の制限に対するソリューションを提供します。 将来的には、ユーザーから状況がどのように見えるかを説明します。 他の回避策を見つけた場合、コメントで共有していただければ幸いです。