【Swift4】iOSシミュレータでカメラとフォトライブラリが起動しない?試してみてわかったこと
この記事の概要
以前同様の問題が発生したためにteratailに投稿したことがあるのだが、ここでももう一度まとめておこうと思う。一応、2018/11/19に私が投稿したteratailの記事を貼っておくので、 興味のある方はご一読ください。iOSシミュレータでカメラとフォトライブラリが起動しない
(https://teratail.com/questions/159144)
目次
- この記事の概要
- 目次
- 実現したいこと
- 問題
- 解決策1:シミュレーターでうまく行かない場合
- 解決策2:実機でうまく行かない場合
- まとめ
- 参考文献
実現したいこと
Swift4のプロジェクトで、カメラ機能の実装を行いたいと思った。また、撮影した写真をアプリから呼び出せるようにアクションコントローラーを追記して、もしエラーが発生しているようなのであれば例外処理エラーでユーザーに知らせる、といった機能を実装するために、プロジェクトを作成した。そのためにSwiftで以下のようなコードを書いた。
class AddItemViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
(中略)
@IBAction func selectImage(){
let actioncontroller = UIAlertController(title: "画像を選択", message: "選択してください", preferredStyle: .actionSheet)
let cameracontroller = UIAlertAction(title: "カメラ", style: .default) { (action) in if UIImagePickerController.isSourceTypeAvailable(.camera) == true{
let picker = UIImagePickerController() picker.sourceType = .camera
picker.delegate = self self.present(picker, animated: true, completion: nil)
} else {
print("この端末ではカメラを使用できない") } }
let albumaction = UIAlertAction(title: "フォトライブラリ", style: .default) { (action) in if UIImagePickerController.isSourceTypeAvailable(.camera) == true{
let picker = UIImagePickerController()
picker.sourceType = .photoLibrary picker.delegate = self
self.present(picker, animated: true, completion: nil)
} else {
print("この端末ではアルバムを使用できない")
} }
let cancelaction = UIAlertAction(title: "キャンセル", style: .cancel) { (action) in actioncontroller.dismiss(animated: true, completion: nil) } actioncontroller.addAction(cameracontroller) actioncontroller.addAction(albumaction) actioncontroller.addAction(cancelaction) self.present(actioncontroller, animated: true, completion: nil) }
(中略)
@IBAction func selectImage(){
let actioncontroller = UIAlertController(title: "画像を選択", message: "選択してください", preferredStyle: .actionSheet)
let cameracontroller = UIAlertAction(title: "カメラ", style: .default) { (action) in if UIImagePickerController.isSourceTypeAvailable(.camera) == true{
let picker = UIImagePickerController() picker.sourceType = .camera
picker.delegate = self self.present(picker, animated: true, completion: nil)
} else {
print("この端末ではカメラを使用できない") } }
let albumaction = UIAlertAction(title: "フォトライブラリ", style: .default) { (action) in if UIImagePickerController.isSourceTypeAvailable(.camera) == true{
let picker = UIImagePickerController()
picker.sourceType = .photoLibrary picker.delegate = self
self.present(picker, animated: true, completion: nil)
} else {
print("この端末ではアルバムを使用できない")
} }
let cancelaction = UIAlertAction(title: "キャンセル", style: .cancel) { (action) in actioncontroller.dismiss(animated: true, completion: nil) } actioncontroller.addAction(cameracontroller) actioncontroller.addAction(albumaction) actioncontroller.addAction(cancelaction) self.present(actioncontroller, animated: true, completion: nil) }
問題
このプログラムをエミュレータで実行して、カメラを起動しようとしたところなぜかうまく行かない。どうしてだろう?console
> この端末ではカメラを使用できない
> この端末ではアルバムを使用できない
> この端末ではアルバムを使用できない
全くうまくいかないみたいだ...。
解決策1:シミュレーターでうまく行かない場合
驚くべきことだが、実はシミュレータではカメラは起動しない。 シミュレータ上でカメラを起動するとフリーズするケースがほとんどである。その一方で、アルバムはシミュレータ上ではうまくいく。
ただし新たな画像を撮影・保存できない関係で、使える画像はシミュレータにデフォルトで保存されている風景が数枚しかないので注意しておこう。
「自分で撮影した画像を使いたい!」という場合は、実機ビルドを使って試す方法を使おう。 実機でもうまくいかない場合は、下記の解決策2「実機でうまくいかない場合」を参照してください。
解決策2:実機でうまく行かない場合
色々と調べてみた。 まず初心者が陥りやすいポイントとしては、「info.plist」の不備であるらしい。 まず「info.plist」をダブルクリックして設定を確認してみる。[図1] info.plistをクリック |
「info.plist」は、Xcodeの左側にある。 非表示になっている場合もあるので、 その場合はページ上部にあるこの3つのボタンのうち、一番左のボタンを押すと良いだろう。 ボタンの色が青色になればサイドメニューが表示されるようになる。
[図2]サイドメニューを表示 |
「info.plist」に行くと、テーブル形式でずらずらと並んでいる。
[図3] info.plist |
一番下にある「supported interface~~~」のところにある「+」ボタンをクリックし、 一覧表から「Privacy - Photo Library Usage」「Camera Usage」をクリックする。
これで使えるようになるはずだ。
これが何を意味しているかと言うと、「このアプリはカメラを使いますよ〜」という使用用途をアプリに組み込む必要があるので、これがオフになっていると、必要な機能が使えないということがある。他にも位置情報を使うときにも、info.plist経由でここに記述が必要となる。
まとめ
シミュレータ上でカメラが起動できないのは納得であるが、アルバムの画像はもうちょっとバリエーションを増やしてほしいなー、自分で画像を数枚追加できたりしないのかなー、と思った。
Swiftに関しては、アップデートが高頻度で何回もされているので、次回アップデートでこのあたりの機能が修正されることを期待。
Swiftに関しては、アップデートが高頻度で何回もされているので、次回アップデートでこのあたりの機能が修正されることを期待。
コメント
コメントを投稿