※これはVOYAGE GROUP エンジニアブログ:Advent Calendar 2013の8日目です。
@TachibanaKaoruです。 今日はアドベントカレンダーの記事ということで、ちょっとクリスマスっぽいことをしてみますね。
スクリーンキャプチャーについて
iPhoneでは、ホームボタンと電源ボタンを同時に押すと、どんな画面でもスクリーンキャプチャーを撮ることができます。 ユーザーとしては、画面メモがいつでもとれて便利ですが、著作権のあるコンテンツを含むアプリのようなスクリーンキャプチャーをあまりとられたくないアプリなどではちょっと困ることもあるんですよね。
iOS7からは、ユーザーがスクリーンキャプチャーを撮ったときに、Notificationを受け取ることができるようになりました。 この新しいNotificationを使って、ユーザーがスクリーンキャプチャーを撮ったときに、自動的にその画像を加工するサンプルを作ってみました。
スクリーンキャプチャーの取得
まず、こちらのNotificationでスクリーンキャプチャーのNotificationを取得。
画像の取得と加工
画像は、AssetsLibraryを使って取得。 まずはカメラロールのALAssetsGroupをとってきます。
そして、その中の最後のインデックス値でenumerateAssetsAtIndexesをコールしてALAssetファイルを取得します。 このALAssetが、最後のスクリーンキャプチャーの画像アセットになります。
ただし、ここでちょっと問題が発生。 UIApplicationUserDidTakeScreenshotNotificationのNotificaionが発生してからすぐ写真をAssetsLibraryからとってこようとすると、まだスクリーンキャプチャーの画像ファイルが保存されていないので、画像がとれないんですよね。 AssetsLibraryの数が増えるまで監視しようかと思ったけど、面倒だったので2秒ほどsleepしてちょっと待機。
あとは、取得したAssetを加工して、UIImageWriteToSavedPhotosAlbumでカメラロールに保存するだけです。
このサンプルを使うと
ユーザーが撮ったスクリーンキャプチャーに加えて、クリスマス模様のはいったスクリーンキャプチャーが保存されます。
取得したAssetに重ねたのはこちらの画像です。
ちょっと残念だったのが、このNotificationは、自アプリ内でスクリーンキャプチャーを取得した場合にしかNotifyされないこと。 自分のアプリのなかでとったスクリーンキャプチャーを検知して加工することはできますが、他のアプリでとったスクリーンキャプチャーは検知できません。 すべてのスクリーンキャプチャーを加工するには、AssetLibraryを監視しておくしかなさそうです。
明日のAdvent Calendarはjewelさんです。