【发布时间】:2020-12-15 14:46:53
【问题描述】:
我有一个简单的 react-native 应用程序,它具有一些将 HTML 复制到全局剪贴板的功能,以便保留样式。预期的结果是我复制 HTML 并可以将其粘贴到另一个应用程序中,并且样式保持不变。请注意,我不是要粘贴 HTML 源代码,这很简单,只需复制为字符串即可。
对于 iOS 13,我对 react-native clipboard native module 进行了小修改,将其从复制纯文本更改为复制 HTML。此代码在 iOS 13 上按预期工作,但自从更新到 14 后它似乎不起作用 - 剪贴板中似乎没有任何值。
CustomClipboard.m
#import "CustomClipboard.h"
#import <UIKit/UIKit.h>
#import <React/RCTBridge.h>
#import <React/RCTEventDispatcher.h>
#import <MobileCoreServices/MobileCoreServices.h>
@implementation CustomClipboard
RCT_EXPORT_MODULE();
- (dispatch_queue_t)methodQueue
{
return dispatch_get_main_queue();
}
RCT_EXPORT_METHOD(setString:(NSString *)content)
{
UIPasteboard *clipboard = [UIPasteboard generalPasteboard];
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
[clipboard setData:data forPasteboardType:(NSString *)kUTTypeHTML];
}
RCT_EXPORT_METHOD(getString:(RCTPromiseResolveBlock)resolve
reject:(__unused RCTPromiseRejectBlock)reject)
{
UIPasteboard *clipboard = [UIPasteboard generalPasteboard];
resolve((clipboard.string ? : @""));
}
@end
CustomClipboard.h
#import <React/RCTBridgeModule.h>
@interface CustomClipboard : NSObject <RCTBridgeModule>
@end
原生模块在JS中导入通过:
import { NativeModules } from 'react-native';
export default NativeModules.CustomClipboard;
并通过剪贴板模块暴露给应用程序的其余部分:
import NativeClipboard from './NativeClipboard';
/**
* `Clipboard` gives you an interface for setting and getting content from Clipboard on both iOS and Android
*/
export const Clipboard = {
/**
* Get content of string type, this method returns a `Promise`, so you can use following code to get clipboard content
* ```javascript
* async _getContent() {
* var content = await Clipboard.getString();
* }
* ```
*/
getString(): Promise<string> {
return NativeClipboard.getString();
},
/**
* Set content of string type. You can use following code to set clipboard content
* ```javascript
* _setContent() {
* Clipboard.setString('hello world');
* }
* ```
* @param the content to be stored in the clipboard.
*/
setString(content: string) {
NativeClipboard.setString(content);
},
};
所有代码似乎都运行正确,但没有值被复制到剪贴板。我还没有找到任何已知的错误。有什么想法吗?
【问题讨论】:
-
根据您的 cmets 和编辑,我更新了我的答案 - 请查看更新后的答案。
标签: ios objective-c react-native uipasteboard