Получение уведомления UIPasteboard (generalPasteboard) в фоновом режиме - PullRequest
11 голосов
/ 21 ноября 2010

Есть ли способ сделать это? Я регистрирую свой объект для 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 Ответ

11 голосов
/ 15 марта 2011

У меня была такая же проблема. Согласно документации UIPasteboard Class для свойства 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]];
  }
}
...