iOS
 Computer >> コンピューター >  >> プログラミング >> iOS

iPhone/iOSアプリからプログラムでスクリーンショットを撮影・保存する方法

プログラムによるスクリーンショット撮影の基本

iOSには、デバイスの画面をプログラムから直接キャプチャするための公式APIは用意されていません。ユーザーが手動でスクリーンショットを撮るには、サイドボタン(電源ボタン)と音量上げボタンを同時に押す方法が標準ですが、アプリ内で自動的に画面をキャプチャしたい場合は、UIViewのレンダリング機能を利用することになります。

処理の流れは以下の通りです。

  • keyWindowのレイヤーを取得する(UIApplication.shared.keyWindow!.layer
  • 画面のスケールを取得する(UIScreen.main.scale
  • ビューと同じサイズの画像コンテキストを新しく作成する
  • レイヤーをコンテキストに描画し、画像として保存する

実装手順

まず新規プロジェクトを作成し、メインのビューコントローラーに背景色を設定します。次にボタンを1つ配置し、アクションとしてクラスに接続しましょう。アクション内に以下のコードを追加します。

@IBAction func takeshot(_ sender: Any) {
    var image :UIImage?
    let currentLayer = UIApplication.shared.keyWindow!.layer
    let currentScale = UIScreen.main.scale
    UIGraphicsBeginImageContextWithOptions(currentLayer.frame.size, false, currentScale)
    guard let currentContext = UIGraphicsGetCurrentContext() else { return }
    currentLayer.render(in: currentContext)
    image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    guard let img = image else { return }
    UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil)
}

必要な設定と注意点

このコードを初めて実行する際には、「写真」ライブラリへの書き込み権限を求めるダイアログが表示されるので、許可してください。保存される画像は.jpg形式になります。

また、アプリのInfo.plistに「NSPhotoLibraryAddUsageDescription」キーを必ず追加してください。この記述がないと、権限ダイアログが表示されずにアプリがクラッシュする原因となります。

この処理は関数として切り出せば複数箇所で使い回せるほか、UIViewの拡張(extension)として定義しておくのも便利です。

動作確認

アプリを実行すると、次のような画面が表示されます。

iPhone/iOSアプリからプログラムでスクリーンショットを撮影・保存する方法

初回起動後に「take shot」ボタンをタップすると、写真へのアクセス許可を求めるアラートが表示されます。

iPhone/iOSアプリからプログラムでスクリーンショットを撮影・保存する方法

アクセスを許可した後、iPhoneの「写真」アプリを開くと、保存されたスクリーンショットを確認できます。

iPhone/iOSアプリからプログラムでスクリーンショットを撮影・保存する方法

補足:iOS 13以降の推奨実装

UIApplication.shared.keyWindowはiOS 13以降で非推奨(deprecated)となっています。現在のシーンからウィンドウを取得し、UIGraphicsImageRendererを使うことで、よりモダンかつ安全に同じことが実現できます。

if let window = view.window {
    let renderer = UIGraphicsImageRenderer(size: window.bounds.size)
    let screenshot = renderer.image { _ in
        window.drawHierarchy(in: window.bounds, afterScreenUpdates: true)
    }
    UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil)
}

新しいプロジェクトで実装する場合は、こちらの方法を採用することをおすすめします。

  1. iPhoneのiOSをダウングレードする方法【ベータ版・正式版それぞれの戻し方】

    iOSのアップデートは非常に魅力的です。iPhoneの機能を向上させる素晴らしい新機能が追加されるだけでなく、ほとんどのマイナーアップデートには、既知のバグや不具合を修正する多数の修正も含まれています。 しかし、iOSのベータ版は話が別です。ベータ版では、重要な機能が動作しなくなったり、アプリが正常に起動できなくなったり、バッテリー関連の問題が発生したりすることがよくあります。まれに、正式リリース版でも同様の問題が起こることがあります。 他のトラブルシューティング手段をすべて試しても解決しない場合(iPhoneのリセットは試しましたか?)、iOSのダウングレードが有効な解決策になる可能

  2. iOS 12のインストール方法|GM版・IPSWファイルを使った2つの手順を解説

    Appleは、待ち望まれていたiOS 12のリリース日を9月17日と発表しました。しかし、正式リリースまで待ちたくない方には、今すぐiOS 12のゴールドマスター(GM)版をインストールする方法があります。そのためには「Apple Beta Software Program」に参加し、お使いのデバイスを登録する必要があります。 正式版のiOS 12は約1週間後に一般公開される予定で、「スクリーンタイム」「Memoji」「Siriショートカット」、改善された通知機能など、多数の新機能が利用できるようになります。 ポイント:iOS 12は、古い機種から新しい機種まで、あらゆるiPhoneの応答速度