iOS 粘贴板优化,防止 App 多次弹窗

726 阅读1分钟

通过粘贴板的 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