У меня есть простое приложение для реагирования, которое имеет некоторые функции для копирования HTML в глобальный буфер обмена, чтобы сохранить стиль. Ожидаемый результат: я копирую HTML и могу вставить его в другое приложение с неповрежденным стилем. Обратите внимание: я не собираюсь вставлять исходный код HTML, это легко сделать, просто скопировав строку.
Для iOS 13 я внес небольшую модификацию в родной модуль буфера обмена, чтобы изменить это от копирования обычного текста до копирования 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);
},
};
Кажется, весь код работает правильно, но в буфер обмена значения не копируются. Я не смог найти каких-либо известных ошибок в этом. Любые идеи?