質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

2回答

1562閲覧

Deployment Target9.0でAVCapturePhotoOutputは使用できますでしょうか。

acid

総合スコア20

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/12/12 15:32

現在、swift3/Xcode8で
AVFoudationを使用してカメラアプリAとカメラアプリBを作成しています。
2つのカメラアプリの詳細は下記の通りです。
■カメラアプリA
Deployment Target9.0
AVCaptureStillImageOutputを使用。
■カメラアプリB
Deployment Target10
AVCapturePhotoOutputを使用。

今後カメラアプリAとカメラアプリBを混ぜ合わせたカメラアプリCを作成したいと
思っています。
カメラアプリCの詳細は下記の通りです。
■カメラアプリC
Deployment Target9.0
ユーザ様がiOS9ならば、アプリ側ではAVCaptureStillImageOutputを適用。
ユーザ様がiOS10ならば、アプリ側ではAVCapturePhotoOutputを適用。

さっそくDeployment Target9.0でコーディングしていったものの、
下記のようなエラーが表示されました。
イメージ説明
AVCapturePhotoOutputは、iOS 10以降でのみ利用可能ですという意味だと
思います。
Deployment Target10.0で、AVCapturePhotoOutputを
使用してカメラアプリCを作成すると、
現在iOS9のユーザ様は多分カメラアプリCを使って遊ぶことができないと思います。
また、Deployment Target10.0で、AVCaptureStillImageOutputの使用は
非推奨のため、今後いつAVCaptureStillImageOutputが使えなくなるのか
よくわからないため心配です。
質問です。
カメラアプリCを作成する上で、Deployment Target9.0で、
iOS9のユーザ様には、AVCaptureStillImageOutputを適用。
iOS10のユーザ様にはAVCapturePhotoOutputを適用するような
コーディングは可能でしょうか。

説明が難しくてすみません。
以上、よろしくおねがいいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

#available()で切り分けるとか

swift

1if #available(iOS 10.0, *) { 2 var b:AVCapturePhotoOutput? 3 // なんか処理 4} 5

投稿2016/12/13 04:51

fromageblanc

総合スコア2724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

acid

2016/12/14 12:43

アドバイス頂きありがとうございます。 頂いたコードを用いてコーディングしてみたものの、 質問欄の画像と同じエラーになりました。 コードの内容は下記の通りです。 (Deployment Target9.0でビルドしました) do { let videoInput = try AVCaptureDeviceInput(device: myCamera) as AVCaptureDeviceInput mySession.addInput(videoInput) if #available(iOS 10, *) { photoOutput = AVCapturePhotoOutput() mySession.addOutput(photoOutput) } else { myImageOutPut = AVCaptureStillImageOutput() mySession.addOutput(myImageOutPut) } Deployment Target9.0では、AVCapturePhotoOutputは使用できないようなので しばらくの間は、AVCapturePhotoOutputは使用しないほうがいいのかなと思えて きました。
guest

0

ベストアンサー

Swift2なのでSwift3の場合は適当に修正して下さい。

(その1) iOSのバージョンを調べる

NSProcessInfo.processInfo()を使います。

swift

1if (NSProcessInfo.processInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 10, minorVersion: 0, patchVersion: 0))) { 2 print("iOS 10.0.0 or later") 3}

10.0.0以上であればmajorVersionだけ調べればいいので、

swift

1if (NSProcessInfo.processInfo().operatingSystemVersion.majorVersion >= 10) { 2 print("iOS 10.0.0 or later") 3}

これでも大丈夫かと思います。

(その2) クラスの存在を調べる

バージョンを確認するよりも、クラスが存在するかどうか確認した方が確実かも知れません。

swift

1if let _ = NSClassFromString("AVCapturePhotoOutput") { 2 //AVCapturePhotoOutputの処理 3}

(その3) メンバ変数の対応

私の方法(その1、その2)はもちろんのこと、fromageblancさんの方法も、関数の外では使えないようなので、photoOutputの定義部分には適用できないですね。

ということで‥

(3-1) Anyを使う

使うときにキャストしないといけないことがあると思います。

swift

1class Hoge { 2 var photoOutput: Any? 3 4 func hoge() { 5 if #available(iOS 10, *) { 6 photoOutput = AVCapturePhotoOutput() 7 } 8 } 9}

(3-2) @available()を使う

ただし、ストアドプロパティには使えないようなのでタイププロパティにします。
(クラス名).(プロパティ名)でアクセスします。

swift

1class Hoge { 2 @available(iOS 10.0, *) //10.0以上でのみ定義される 3 static var photoOutput: AVCapturePhotoOutput! 4 5 func hoge() { 6 if #available(iOS 10, *) { 7 Hoge.photoOutput = AVCapturePhotoOutput() 8 } 9 } 10}

3-1も3-2も、未検証ですし、やり方としていいのか悪いのかも分かりません。

投稿2016/12/13 02:11

編集2016/12/15 01:24
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

acid

2016/12/14 12:27

アドバイスありがとうございます。 (その2)で、コーディングしてみたものの、質問欄の画像と同じエラーになりました。 コードの内容は下記の通りです。 (Deployment Target9.0でビルドしました) if let _ = NSClassFromString("AVCapturePhotoOutput") { //AVCapturePhotoOutputの処理 if #available(iOS 10, *) { photoOutput = AVCapturePhotoOutput() mySession.addOutput(photoOutput) } } Deployment Target9.0で、AVCapturePhotoOutputは使用できないということでしょうか。
fuzzball

2016/12/15 01:24

photoOutputの定義部分もバージョン分けしないといけませんので、その方法について(その3)を追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問