I\'m writing a custom keyboard for iOS and I\'d like to detect when the user copies some text. I\'ve read that you can use the NSNotificationCenter
along with
You cannot use NSNotificationCenter since the keyboard extension is a different process.
Cocoa includes two types of notification centers: The NSNotificationCenter class manages notifications within a single process. The NSDistributedNotificationCenter class manages notifications across multiple processes on a single computer.
Try this solution: https://stackoverflow.com/a/28436058/649379 which uses CFNotifications. Don't forget to enable App Groups to get access to the shared container.
More code here: https://github.com/cxa/AppExtensionCommunicator & https://github.com/mutualmobile/MMWormhole
My not a perfect but work enough solution. I already use it in keyboard.
@interface MyPrettyClass : UIViewController
@end
@implementation MyPrettyClass
@property (strong, nonatomic) NSTimer *pasteboardCheckTimer;
@property (assign, nonatomic) NSUInteger pasteboardchangeCount;
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
_pasteboardchangeCount = [[UIPasteboard generalPasteboard] changeCount];
//Start monitoring the paste board
_pasteboardCheckTimer = [NSTimer scheduledTimerWithTimeInterval:1
target:self
selector:@selector(monitorBoard:)
userInfo:nil
repeats:YES];
}
- (void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
[self stopCheckingPasteboard];
}
#pragma mark - Background UIPasteboard periodical check
- (void) stopCheckingPasteboard{
[_pasteboardCheckTimer invalidate];
_pasteboardCheckTimer = nil;
}
- (void) monitorBoard:(NSTimer*)timer{
NSUInteger changeCount = [[UIPasteboard generalPasteboard]; changeCount];
if (changeCount != _pasteboardchangeCount) { // means pasteboard was changed
_pasteboardchangeCount = changeCount;
//Check what is on the paste board
if ([_pasteboard containsPasteboardTypes:pasteboardTypes()]){
NSString *newContent = [UIPasteboard generalPasteboard].string;
_pasteboardContent = newContent;
[self tryToDoSomethingWithTextContent:newContent];
}
}
}
- (void)tryToDoSomethingWithTextContent:(NSString)newContent{
NSLog(@"Content was changed to: %@",newContent);
}
@end