Получение уведомления UIPasteboard (generalPasteboard) в фоновом режиме

Есть ли способ сделать это? Я зарегистрировал свой объект для UIPasteboardChangedNotification во время запуска, но при отправке его в фоновый режим и открытии (например) Safari и копировании некоторого текста мой обработчик никогда не вызывается. (Сейчас я использую только симулятор).

Я использовал оба:

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(pasteboardNotificationReceived:) 
    name:UIPasteboardChangedNotification 
    object:[UIPasteboard generalPasteboard]];

а также:

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(pasteboardNotificationReceived:) 
    name:UIPasteboardChangedNotification 
    object:nil ];

зарегистрировать мой обработчик.

1 ответ

У меня такая же проблема. Согласно Справочной документации по классу UIPasteboard для changeCount собственность (акцент мой):

Всякий раз, когда изменяется содержимое монтажной панели, в частности, при добавлении, изменении или удалении элементов монтажной панели, UIPasteboard увеличивает значение этого свойства. После увеличения числа изменений UIPasteboard публикует уведомления с именами UIPasteboardChangedNotification (для дополнений и модификаций) и UIPasteboardRemovedNotification (для удалений).... Класс также обновляет счетчик изменений, когда приложение повторно активируется, а другое приложение изменило содержимое монтажной панели. Когда пользователи перезагружают устройство, счетчик изменений сбрасывается в ноль.

Я прочитал это, чтобы означать, что мое заявление получит UIPasteboardChangedNotification уведомления, как только мое приложение было повторно активировано. Внимательное чтение показывает, однако, что это только changeCount это обновляется, когда приложение повторно активировано.

Я справился с этим, отследив картон changeCount в моем приложении делегата и размещения ожидаемого уведомления, когда я нахожу changeCount был изменен, когда приложение было в фоновом режиме.

В интерфейсе делегата приложения:

NSUInteger pasteboardChangeCount_;

И в реализации делегата приложения:

- (BOOL)application:(UIApplication*)application
    didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
  [[NSNotificationCenter defaultCenter]
   addObserver:self
   selector:@selector(pasteboardChangedNotification:)
   name:UIPasteboardChangedNotification
   object:[UIPasteboard generalPasteboard]];
  [[NSNotificationCenter defaultCenter]
   addObserver:self
   selector:@selector(pasteboardChangedNotification:)
   name:UIPasteboardRemovedNotification
   object:[UIPasteboard generalPasteboard]];

  ...
}

- (void)pasteboardChangedNotification:(NSNotification*)notification {
  pasteboardChangeCount_ = [UIPasteboard generalPasteboard].changeCount;
}

- (void)applicationDidBecomeActive:(UIApplication*)application {
  if (pasteboardChangeCount_ != [UIPasteboard generalPasteboard].changeCount) {
    [[NSNotificationCenter defaultCenter] 
     postNotificationName:UIPasteboardChangedNotification
     object:[UIPasteboard generalPasteboard]];
  }
}
Другие вопросы по тегам