30

TLDR: iOS アプリとその拡張機能の間でリアルタイムのメッセージまたは通知を送信することは可能ですか?

App Group同じ一部であり、同じ CoreData (SQLite データベース) を共有する拡張機能を使用して iOS アプリを作成しています。アプリと拡張機能から CoreData を使用してデータベースの読み取りと書き込みを行うことができます。どちらも同じコンテンツを共有します。

私の質問は次のとおりです。アプリと拡張機能の間でメッセージまたは通知を送信して、必要に応じて更新するように相手に通知することは可能ですか?

通知を送信しようとしNSNotificationCenterましたが、アプリ/拡張機能から「送信」されません。共有グループに書き込んNSUserDefaultsでリッスンしようとすると、同じ問題が発生しNSUserDefaultsDidChangeNotificationます。これはアプリ内で機能しますが、拡張機能は何も受け取りません (起動され、同じを共有していることがわかっている場合NSUserDefaults)。物事を同期させる方法はありますか?

4

4 に答える 4

33

TLDR:いいえ、しかしハックがあります

拡張機能の有無にかかわらず、iOS アプリには真のプロセス間通信はありません。NSDistributedNotificationOS X から iOS への移行はまだ行っていません。

一部の拡張タイプでは、URL を開きNSExtensionContext、それらを使用して、URL を処理するアプリにデータを渡すことができます。これにより、アプリが前面に表示されますが、これはあなたが望むものとは思えません。

ただし、必要なものを取得できるハックがあります。

  • ユーザーの既定値に書き込む代わりに、アプリ グループ ディレクトリ内のファイルに書き込みます。
  • ファイルを直接書き込むだけでなく、ファイルへの調整NSFileCoordinatorされた書き込みを行うために使用します。
  • NSFilePresenterファイルへの変更を知りたいオブジェクトに実装し、必ず呼び出す[NSFileCoordinator addFilePresenter:someObject]
  • presentedItemDidChangeオプションのメソッドをファイル プレゼンターに実装します。

このすべてを正しく行うと、アプリまたは拡張機能のいずれかからこのファイルに書き込むことができpresentedItemDidChange、もう一方の拡張機能で自動的に呼び出されます。おまけとして、もちろんそのファイルの内容を読み取ることができるので、任意のデータをやり取りできます。

于 2014-11-19T18:48:25.967 に答える
8

ホスト アプリとアプリ拡張機能の間で汎用の双方向通信を行う別の方法として、MMWormholeを試してください。

http://www.mutualmobile.com/posts/mmwormhole https://github.com/mutualmobile/MMWormhole

これは CFNotificationCenter のかなり軽量なラッパーであり、「Darwin」通知を使用してプロセス間通信 ( IPC ) を行います。

アプリの共有コンテナーを使用してペイロードをやり取りし、ファイル自体を作成する必要さえカプセル化します。

クラス (およびレポ内のサンプル アプリ) はうまく機能しているようで、非常に反応が良いです。

これも役立つことを願っています。

于 2015-05-11T06:00:10.657 に答える