监听macOS的剪贴板

tags:swift, macos

对剪贴板的支持是提高用户使用体验的一个重要因素。经常,我们的应用需要监听剪贴板的内容变化,并做出相应的反应。

在iOS上这个目的可以直接通过订阅 UIPasteboardChangedNotification 来完成,而在macOS上,苹果没有提供现成的 API。

不过,实现起来也不是很麻烦。我们可以写一个剪切板的监听器,实现这个目标。

监听器实现

import AppKit

class Clipboard {
  typealias Hook = (String) -> Void

  private let pasteboard = NSPasteboard.general
  private let timerInterval = 1.0

  private var changeCount: Int
  private var hooks: [Hook]

  init() {
    changeCount = pasteboard.changeCount
    hooks = []
  }

  func onNewCopy(_ hook: @escaping Hook) {
    hooks.append(hook)
  }

  func startListening() {
    Timer.scheduledTimer(timeInterval: timerInterval,
                         target: self,
                         selector: #selector(checkForChangesInPasteboard),
                         userInfo: nil,
                         repeats: true)
  }

  func copy(_ string: String) {
    pasteboard.declareTypes([NSPasteboard.PasteboardType.string], owner: nil)
    pasteboard.setString(string, forType: NSPasteboard.PasteboardType.string)
  }

  @objc
  func checkForChangesInPasteboard() {
    guard pasteboard.changeCount != changeCount else {
      return
    }

    if let lastItem = pasteboard.string(forType: NSPasteboard.PasteboardType.string) {
      for hook in hooks {
        hook(lastItem)
      }
    }

    changeCount = pasteboard.changeCount
  }
}

使用

需要在应用启动的时候创建监听器,并启动之。可以在appdelegate中完成:

class AppDelegate: NSObject, NSApplicationDelegate {
    
   let clipboard = Clipboard()
    
    func applicationDidFinishLaunching(_ aNotification: Notification) {
  clipboard.startListening()
  clipboard.onNewCopy { (content) in
            print(content)
    }
}

这样只要用户复制了文本到剪切板中, onNewCopy 就会自动触发,打印出复制的内容了。

以上的实现只监听了String 类型,如果需要监听其他类型也可以简单改造之。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    爱运动爱学习阅读 15,648评论 3 114
  • —— 龍茶館 (一) 冬日 你翩翩而至 是否如你 我也是这城市的候鸟 身体在不断奔跑 灵魂却无处栖身 阳光穿透了皮...
    龍茶館阅读 90评论 0 2
  • 11.24 天气:晴 心情:高兴 这么快,特种兵第训练第五天了。作业完成不费力了,知识学习也越来越起劲了。 柔情老...
    耿丽云阅读 71评论 0 0
  • 下班很累想活动一下,和同事打羽毛球,结果我用力过猛把球打到楼层的间隔上了,傍晚的风吹的很舒服,我们在草坪上...
    小芳姑娘2012阅读 252评论 1 4
  • 换个态度就是换种活法,人生就会不同凡响。我仍然在路上寻找属于自己的欢喜,寻找花样年华生命里最珍贵的树洞。 如果不去...
    风裁你岸阅读 625评论 0 0