5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ゆめみAdvent Calendar 2018

Day 16

[macOS][Swift4.2] Distributed Notifications でアプリ間通信

Last updated at Posted at 2018-12-15

Macアプリでコマンドラインツールやアプリを内包してサブタスクとして起動している時などに本体アプリと通信を行いたい時がある。
DistributedNotificationCenter を使用すればアプリ間通信が可能になる。

スクリーンショット 2018-12-12 18.45.38.png

サンプルコードは以下に配置。
https://github.com/atsushijike/DistributedNotifications

  • Xcode10.1
  • Swift4.2

送信側

NotificationCenter と同じようにpostするのだが、 post(name:,object:)post(name:,object:,userInfo:) を使うと受信側アプリを前面にしないとobserveされなかったりするので、 postNotificationName(_ name:,object:,userInfo:,deliverImmediately:) を使用する。

userInfo には field.stringValue を"Message"キーで入れている。

PostApp/AppDelegate.swift
    @IBAction func post(_ sender: NSButton) {
        let userInfo: [AnyHashable : Any]? = field.stringValue.isEmpty ? nil : ["Message" : field.stringValue]
        DistributedNotificationCenter.default().postNotificationName(NSNotification.Name("DistributedNotifications.Post"), object: nil, userInfo: userInfo, deliverImmediately: true)
    }

但し、Sandbox対応アプリで userInfo を含むとエラーになるので注意
https://developer.apple.com/library/archive/documentation/Security/Conceptual/AppSandboxDesignGuide/DesigningYourSandbox/DesigningYourSandbox.html

With App Sandbox, you cannot include a userInfo dictionary when posting to an NSDistributedNotificationCenter object for messaging other tasks. 

受信側

NotificationCenter でobserveするときと同様に addObserver(_ observer:,selector:,name:,object:) する。

ObserverApp/AppDelegate.swift
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        DistributedNotificationCenter.default().addObserver(self, selector: #selector(distributedNotificationsPost), name: NSNotification.Name("DistributedNotifications.Post"), object: nil)
    }

userInfo に含まれる"Message"を label に表示。

ObserverApp/AppDelegate.swift
    @objc private func distributedNotificationsPost(notification: Notification) {
        if let message = notification.userInfo?["Message"] as? String {
            label.stringValue = message
        }
    }
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?