macOS 开发 - NSPasteboard


简述

剪贴板服务器在所有运行的应用建共享。它包含了用户剪贴或者复制的数据。

NSPasteboard 对象是一个应用处理剪贴操作的唯一接口。

NSPasteboard 对象同时用来在应用和 应用服务目录提供的服务之间传输数据。

一个剪贴板可以包含多个items, 你可以直接读写任何遵守 NSPasteboardWriting 和 NSPasteboardReading 协议的对象。这允许你不使用任何中介,直接去读写常见的item,如 URLs, colors, images, strings, attributed strings, 和 sounds


相关类

  • NSPasteboard
  • NSPasteboardItem

协议

  • NSPasteboardWriting
  • NSPasteboardWriting
  • NSPasteboardTypeOwner
  • NSPasteboardReading

使用

1、复制内容到剪贴板

复制文字

- (void)pasteString{
    
    NSPasteboard *paste = [NSPasteboard generalPasteboard];
    [paste clearContents];
    [paste writeObjects:@[@"123"]];
}
  • 复制前,最好清空剪贴板,否则可能复制失败。
  • 注意,并非
    [[NSPasteboard generalPasteboard] writeFileContents:@"123"];
  • 可以同时复制多个字符串,获取时,会换行分格输出所有。

2、获得剪贴板的文字内容

获得文字

  • 如果你拷贝的是文件里面的文字,剪切板里保存是刚复制的字符串,;
  • 如果你拷贝的是一个或多个的文件,文件夹, 这里就是文件或文件夹的名称
- (void)getPasteString{
    
    NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
    if ([[pasteboard types] containsObject:NSPasteboardTypeString]) {
        NSString *str = [pasteboard stringForType:NSPasteboardTypeString];
        
        NSLog(@"粘贴的文字:%@",str);
    }
}

3、获取剪贴板所有信息


- (void)getPasteboard{
    
    NSPasteboard *pb = [NSPasteboard generalPasteboard];
    
    NSLog(@"\n-\nname : %@, changeCount : %ld",pb.name,pb.changeCount);  // name : Apple CFPasteboard general, changeCount : 2479
    NSLog(@"types : %@",pb.types);
    
    
    NSArray *itemsArray = [pb pasteboardItems];
    NSLog(@"pasteboardItems : %@",pb.pasteboardItems);
    for (NSPasteboardItem *item in itemsArray) {
        NSLog(@"item.types : %@",item.types);
    }
    
    NSLog(@"--------------------------");
    
    
    NSArray *pbtypes = @[NSPasteboardTypeString, NSPasteboardTypePDF, NSPasteboardTypeTIFF,
                         NSPasteboardTypePNG, NSPasteboardTypeRTF, NSPasteboardTypeRTFD,
                         NSPasteboardTypeHTML, NSPasteboardTypeTabularText, NSPasteboardTypeFont,
                         NSPasteboardTypeRuler, NSPasteboardTypeColor, NSPasteboardTypeSound,
                         NSPasteboardTypeMultipleTextSelection, NSPasteboardTypeTextFinderOptions, NSPasteboardTypeURL,
                         NSPasteboardTypeFileURL, NSFileContentsPboardType, NSPICTPboardType];
    
    for (NSString *type in pbtypes) {
        
        if ([[pb types] containsObject:type]) {
            //如果你拷贝的是文件里面的文字,剪切板里保存是刚复制的字符串,;
            //如果你拷贝的是一个或多个的文件,文件夹, 这里就是文件或文件夹的名称
            
            NSString *str = [pb stringForType:type];
            NSData *data = [pb dataForType:type];
            NSArray *propertyList = [pb propertyListForType:type];
            
            NSLog(@"type : %@, str : %@, data : %ld,propertyList : %@",type,str,data.length,propertyList);
            
            if ([type isEqualToString:NSPasteboardTypeFileURL]) {
                [[NSWorkspace sharedWorkspace] openFile:[NSURL URLWithString:str].path];
            }
        }
    }
    
    return ;
    
}

NSPasteboardType 与 UTI

剪贴板打印出来的 type 类型,是APPKIT_EXTERN NSPasteboardType const, 实际是文件的 UTI 类型。

NSPasteboardType

  • NSPasteboardTypeString // public.utf8-plain-text , Replaces NSStringPboardType
  • NSPasteboardTypePDF // com.adobe.pdf, Replaces NSPDFPboardType
  • NSPasteboardTypeTIFF // public.tiff, Replaces NSTIFFPboardType
  • NSPasteboardTypePNG // public.png
  • NSPasteboardTypeRTF // public.rtf, Replaces NSRTFPboardType
  • NSPasteboardTypeRTFD // com.apple.flat-rtfd, Replaces NSRTFDPboardType
  • NSPasteboardTypeHTML // public.html, Replaces NSHTMLPboardType
  • NSPasteboardTypeTabularText // public.utf8-tab-separated-values-text, Replaces NSTabularTextPboardType
  • NSPasteboardTypeFont // com.apple.cocoa.pasteboard.character-formatting Replaces NSFontPboardType
  • NSPasteboardTypeRuler // com.apple.cocoa.pasteboard.paragraph-formatting, Replaces NSRulerPboardType
  • NSPasteboardTypeColor // com.apple.cocoa.pasteboard.color, Replaces NSColorPboardType
  • NSPasteboardTypeSound // com.apple.cocoa.pasteboard.sound, Replaces NSSoundPboardType
  • NSPasteboardTypeMultipleTextSelection // com.apple.cocoa.pasteboard.multiple-text-selection Replaces NSMultipleTextSelectionPboardType
  • NSPasteboardTypeTextFinderOptions // com.apple.cocoa.pasteboard.find-panel-search-options Replaces NSPasteboardTypeFindPanelSearchOptions
  • NSPasteboardTypeURL // public.url, Equivalent to kUTTypeURL
  • NSPasteboardTypeFileURL // public.file-url, Equivalent to kUTTypeFileURL
  • NSFileContentsPboardType // NXFileContentsPboardType
  • NSPICTPboardType // Apple PICT pasteboard type

关于 UTI:
UTI: Uniform Type Identifier,统一类型标识符
Mac 下的文件类型被定义为 UTI ,可以把它看成下一代的MIME类型。 HTML 文件的 UTI 是 public.html; Word 文档的 UTI 是 com.microsoft.word.doc

– Uniform Type Identifiers Overview
https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_conc/understand_utis_conc.html

中文
https://www.jianshu.com/p/d6fe1e7af9b6


使用 setData:forType: 方法会写入第一个 pasteboard item,不需要去创建 item, 如 :

[pboard clearContents];
[pboard setData:data forType:type];

4、剪贴板数据变化 changeCount

参考:https://stackoverflow.com/questions/5033266/can-i-receive-a-callback-whenever-an-nspasteboard-is-written-to

IOS 中可以通过 UIPasteboardChangedNotification 监听,macOS 目前没有监听变化的通知。

但如果你希望用户返回你的应用时,得知剪贴板是否变化,可以对比剪贴板的 changeCount 值。changeCount 记录了剪贴板变化的次数,可以在 windowDidBecomeKey 中对比上次的 changeCount。

我观察到本机上 changeCount 变化一般是隔两位,比如上次是 2821,下次改变后是 2823,不知道是什么原理。


参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程乐园

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值