Получение уведомлений UIPastboard (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

У меня была та же проблема. В соответствии с документацией по классу UIP-каталогов для свойства changeCount (акцент мой):

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

Я прочитал это для обозначения того, что мое приложение будет получать уведомления 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]];
  }
}