JRNPasteboardMonitor をつくりました
[JRNPasteboardMonitor] monitoring UIPasteboard changes even if your app state is in background. https://t.co/HmJov7VYk6
— CocoaPods (@CocoaPods) 2013, 10月 22
ペーストボード監視
ここ最近(といっても半年〜1年前位から)、辞書やURL共有のためのアプリでペーストボードを用いた他アプリとの連携が流行ってきているように思っていました。
というのも iOS では他アプリとの連携が Android などに比べて制限が厳しく、その中で Custome Scheme や Keychain Service などを用いて実装することが一般的です。
そのような環境下のなかで、ペーストボードのコピーイベントを元にしたN対1のアプリ連携が生まれて来たのは極めて自然な流れです。
そこで、ペーストボードの変更を監視しイベントを通知してくれるライブラリ JRNPasteboardMonitor を作りました。
使い方
以下のコードをペーストボードの監視を開始したい箇所に記述するだけです。 ハンドラ内には変更を検知した際のアクションを記述します。
[[JRNPasteboardMonitor defaultMonitor] startMonitoringWithChangeHandler:^(NSString *string) {
//action when pasteboard changes.
}];
監視を中止したい場合は以下のコードを記述します。
[[JRNPasteboardMonitor defaultMonitor] stopMonitoring];
また以下の実装内容で詳細は説明するのですが都合上、アプリが background に進入してから10分間しか変更を検知出来ません。 なので監視が終了する際の通知も受け取れるようにしました。以下のコードで監視終了のアクションを設定出来ます。
[JRNPasteboardMonitor defaultMonitor].expireHandler = ^{
//action when monitoring expired.
};
実装内容
JRNPasteboardMonitor は foreground と background にいる時で内側の監視アクションが違います。
- foreground
foreground にいる時は単純で、UIPasteboardChangedNotification を監視しているだけです。
- background
background にいる時は main loop が停止するため、上記の Notification が受け取れません。 なので background 進入の際に、毎秒ペーストボードの内容を監視し変更があれば通知する background taskを発行しています。 そして、この background task の有効時間が10分間と iOS で定められています。 これが上記の使い方で説明した、監視終了アクションを設定した理由です。
ユースケース
デモアプリを使って頂けると雰囲気が掴めると思います。 URLをコピーしたらそのままシェアしてくれるアプリや、調べたい単語をコピーしたらその意味を通知バーに出してくれたら便利ですね!
インストール
もちろん CocoaPods から。
pod 'JRNPasteboardMonitor'
今後の予定
iOS 7 の Background Fetch を使ってもっと便利にできないか考えています。