通过粘贴板的 changeCount 来判断是否要获取粘贴板内容,从而减少复制粘贴的弹窗。
/// 用于记录粘贴板的 changeCount,防止多次弹出系统复制窗
var changeCount = -1
/// 用于记录粘贴板内容
var clipboardDict: [String: Any] = [:]
/// 获取粘贴板内容
private func getClipboardData() {
// 根据当前粘贴板内容是否更新决定获取
if UIPasteboard.general.changeCount != changeCount {
changeCount = UIPasteboard.general.changeCount
// 获取粘贴板内容:{ @"text/plain": 纯文本 , @@"text/html": HTML }
clipboardDict = BUDriveTool.getClipboardDict()
}
let string = BUDriveUtil.convertDictionaryToString(dict: clipboardDict)
print("pasteboard string:(string)")
}
BUDriveTool.h
#import <Foundation/Foundation.h>
@interface BUDriveTool : NSObject
/// 获取粘贴板内容字典
/// { @"text/plain": 纯文本 , @@"text/html": HTML }
+ (nonnull NSDictionary <NSString *, id>*)getClipboardDict;
@end
BUDriveTool.m
#import "BUDriveTool.h"
#import <CoreServices/CoreServices.h>
@implementation BUDriveTool
+ (nonnull NSDictionary *)getClipboardDict {
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
// 先带默认字符串,获取到纯文本或者 HTML 时替换
NSMutableDictionary *content = [[NSMutableDictionary alloc] initWithDictionary:@{@"text/plain": @"", @"text/html": @""}];
NSArray<NSDictionary<NSString *, id> *> *items = pasteboard.items;
// 纯文本
NSString *text = pasteboard.string;
if (text && ![text isEqual:NSNull.null]) {
[content setObject:text forKey:@"text/plain"];
}
// HTML
for (NSDictionary *item in items) {
NSString *html = [item objectForKey:(NSString *)kUTTypeHTML];
if (html && ![html isEqual:NSNull.null]) {
[content setObject:html forKey:@"text/html"];
break;
}
NSData *archiveData = [item objectForKey:@"Apple Web Archive pasteboard type"];
if (archiveData && ![archiveData isEqual:NSNull.null]) {
NSError *error = nil;
id webArchive = [NSPropertyListSerialization propertyListWithData:(NSData *)archiveData
options:NSPropertyListImmutable
format:NULL
error:&error];
NSData *webResourceData = [[webArchive objectForKey:@"WebMainResource"] objectForKey:@"WebResourceData"];
html = [[NSString alloc] initWithData:webResourceData encoding:NSUTF8StringEncoding];
if (html && ![html isEqual:NSNull.null]) {
[content setObject:html forKey:@"text/html"];
break;
}
}
}
return content;
}
@end