Apple Scriptを使用してMacストアでホストされているアプリケーションの機能を拡張する方法

MacストアでのモデレートにはSandboxのサポートが必要だったため、5年が経過しました。 MacOSとSandboxの機能は徐々に拡張されていますが、公式のAppleストアでの公開を希望する開発者は、このOSを使用する能力がまだ限られています。 この問題は、ユーティリティとシステムアプリケーションにとって特に深刻です。









サンドボックスは、macOSをより安全にし、悪意のある、潜在的に危険なアプリケーションからユーザーを保護するように設計されています。 理論的には、これは合理的な予防策ですが、実際には、基本的な機能を実行するためにユーザーデータを必要とする多くのアプリケーションは制裁の対象となります。 この記事では、Sandboxとの互換性を維持しながら、アプリケーションにそのような関数を実装する方法を説明します-おそらく、この経験は公式市場で作業する他の開発者に役立つでしょう。



MaCleaner Xシステム監視ユーティリティを使用する場合、パートナーも同様のニーズに直面しました。 MaCleaner製品ライン全体は、Mac App Storeを通じてのみ配布されます。



MaCleaner Xの特徴的な機能は、タッチバーのサポートとカスタマイズされたデザインです。アプリケーションはMacモデルを自動的に検出し、各デバイスに特別なインターフェイスオプションを提供します。 ただし、これに加えて、現在、ユーザーがプログラムで見たい機能や、Mac Store以外で配布されているユーティリティに馴染みのある機能を高度なバージョンで実装するよう取り組んでいます。



まず第一に、これらは次のとおりです。





解決方法



まず、プロセス全体がどのスキームに従って行われるかに従って、一般的な用語で概説します。





サンドボックスの外部でこの操作を実行するには、次のmacOS機能を使用します:Apple Scriptを使用して機能の拡張をサポートするアプリケーションは、〜/ Library / Application Scriptsフォルダーにある場合、サンドボックスの外部でこれらのスクリプトを実行できます。 Sandboxをサポートするアプリケーションは、スクリプトをこのフォルダーに単独でコピーすることはできません-これはAppleモデレーターによって抑制されています。



したがって、次のような一連のアクションがあります。



  1. Application ScriptsフォルダーのApple Scriptを使用して拡張機能をサポートするマスターアプリケーションの実装。
  2. Mac Storeでのアプリケーションのモデレートパッシングと公開
  3. 拡張アプリケーションの準備。 彼のタスクには、必要なスクリプトをマスターアプリケーションを使用して共有フォルダーにコピーすることが含まれます。 これを行うには、交換が行われる共通のAppGroupが必要です。
  4. 独自のサイトで拡張アプリケーションを公開します。






例として、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 }
      
      





簡単な例では、実行されたスクリプトから受け取った文字列をそのまま表示します。 アプリケーションインターフェイスを定型化するには、結果を解析し、必要な情報のみを表示する必要があります。



アプリケーションコラボレーション



その結果、次の作業スキームが得られます。



マスターアプリケーション



  1. 追加機能が利用できない場合、UI要素を非表示にします。
  2. スクリプトを展開する場合、Apple Script(特定の形式)がUIをアクティブにして実行します。
  3. Apple Scriptによって実行される機能で管理者アカウントデータの入力が必要な場合、ユーザーには標準の認証ダイアログが表示されます。AppleScriptがこの作業を行います。


拡張アプリケーション



  1. ユーザーが開発者のサイトからダウンロードする必要があります。 システムの機能の原理と、正しい操作のためにユーザーが実行する必要があるアクションをユーザーに説明する必要があるため、特別なサイトについて話します。 一部には、これはGUI拡張を介して実行できます。
  2. サンドボックスの外で作業しているという事実にもかかわらず、コンポーネントソリューションに共通のAppGroupを使用することをお勧めします。
  3. このコンポーネントは、Extension Managerとしてさらに広く表現できます。 一貫性のあるインターフェイスのおかげで、マスターアプリケーションは、共有フォルダーに拡張機能が表示されると拡張できます。拡張機能は、説明ファイルと構成と共に追加できます。
  4. コピーされたApple Scriptには、任意のbashコマンドを受け入れて実行する一般的なタスク関数(bash_script)が含まれている場合もあります。 しかし、このアプローチは大きなセキュリティホールを開き、App Storeに公開する前にマスターアプリケーションに拡張機能を含めることを義務付けます。


結論



アプローチの利点:





短所:





この記事では、開発者向けのSandboxの製品機能の制限に対するソリューションを提供します。 将来的には、ユーザーから状況がどのように見えるかを説明します。 他の回避策を見つけた場合、コメントで共有していただければ幸いです。



All Articles