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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

iPad

iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

iOS

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

Xcode

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

Q&A

解決済

1回答

938閲覧

【Objective-C】カメラで撮った写真の位置情報付与

chai_mitsuya

総合スコア18

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

iPad

iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

iOS

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

Xcode

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

0グッド

0クリップ

投稿2017/08/18 22:59

編集2017/08/20 05:29

###前提・実現したいこと
Objective-cでiPadアプリを作成しています。
標準カメラを使用して撮った写真に位置情報を付与して保存しようしたところ、
写真にメタデータを付与するところでエラーが発生しました。

###発生している問題・エラーメッセージ

2017-08-19 07:37:12.742 xxxxxApp[505:166141] Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates. warning: could not execute support code to read Objective-C class data in the process. This may reduce the quality of type information available. 2017-08-19 07:37:40.488 xxxxxApp[505:166141] -[__NSDictionaryI setObject:forKeyedSubscript:]: unrecognized selector sent to instance 0x1750c1f0 2017-08-19 07:37:40.494 xxxxxApp[505:166141] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI setObject:forKeyedSubscript:]: unrecognized selector sent to instance 0x1750c1f0' *** First throw call stack: (0x245db91b 0x23d76e17 0x245e12b5 0x245deee1 0x2450a238 0x24a93 0x28ff0693 0x2e001e7b 0x2e0169bb 0x2e047a2b 0x2c0c7117 0x162e39 0x155b6b 0x15a655 0x2459db6d 0x2459c067 0x244eb229 0x244eb015 0x25adbac9 0x28bbf189 0x23907 0x24193873) libc++abi.dylib: terminating with uncaught exception of type NSException

###該当のソースコード
こちらのサイトを参考にさせて頂きました。→http://dev.classmethod.jp/smartphone/iphone/uiimagepickercontroller-exifgps/
サンプルソースも実行したところ同様のエラーが発生しました。

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { // モーダルビューを閉じる [self dismissViewControllerAnimated:YES completion:nil]; // 静止画の参照を取得 UIImage *image = info[UIImagePickerControllerOriginalImage]; // カメラを起動した場合、カメラロールに保存する。 if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) { // メタデータの参照を取得 NSMutableDictionary *metadata = info[UIImagePickerControllerMediaMetadata]; // この行でエラーが発生します。↓↓ metadata[(NSString *)kCGImagePropertyGPSDictionary] = [self GPSDictionaryForLocation:self.locationManager.location]; // カメラロールに保存 ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init]; [assetsLibrary writeImageToSavedPhotosAlbum:image.CGImage metadata:metadata completionBlock:^(NSURL *assetURL, NSError *error) { if (error) { NSLog(@"Save image failed. %@", error); } }]; [self dismissViewControllerAnimated:YES completion:nil]; } // イメージビューに写真を表示する。 _editImageView.image = image; // 次画面に渡すキャプションを設定 [Image sharedManager].image = image; } // GPS情報の作成 - (NSDictionary *)GPSDictionaryForLocation:(CLLocation *)location { NSMutableDictionary *gps = [NSMutableDictionary new]; // 日付 gps[(NSString *)kCGImagePropertyGPSDateStamp] = [[FormatterUtil GPSDateFormatter] stringFromDate:location.timestamp]; // タイムスタンプ gps[(NSString *)kCGImagePropertyGPSTimeStamp] = [[FormatterUtil GPSTimeFormatter] stringFromDate:location.timestamp]; // 緯度 CGFloat latitude = location.coordinate.latitude; NSString *gpsLatitudeRef; if (latitude < 0) { latitude = -latitude; gpsLatitudeRef = @"S"; } else { gpsLatitudeRef = @"N"; } gps[(NSString *)kCGImagePropertyGPSLatitudeRef] = gpsLatitudeRef; gps[(NSString *)kCGImagePropertyGPSLatitude] = @(latitude); // 経度 CGFloat longitude = location.coordinate.longitude; NSString *gpsLongitudeRef; if (longitude < 0) { longitude = -longitude; gpsLongitudeRef = @"W"; } else { gpsLongitudeRef = @"E"; } gps[(NSString *)kCGImagePropertyGPSLongitudeRef] = gpsLongitudeRef; gps[(NSString *)kCGImagePropertyGPSLongitude] = @(longitude); // 標高 CGFloat altitude = location.altitude; if (!isnan(altitude)){ NSString *gpsAltitudeRef; if (altitude < 0) { altitude = -altitude; gpsAltitudeRef = @"1"; } else { gpsAltitudeRef = @"0"; } gps[(NSString *)kCGImagePropertyGPSAltitudeRef] = gpsAltitudeRef; gps[(NSString *)kCGImagePropertyGPSAltitude] = @(altitude); } return gps; }

###試したこと

  • NSInvalidArgumentExceptionでググったものの解決には至りませんでした。Objective-C、iOSについては疎いため、見るべきところ、調べる方法など知識不足です。申し訳ありません。質問について情報が不足している場合は追記いたします。

###補足情報(言語/FW/ツール等のバージョンなど)

  • Version 8.3.3 (8E3004b)
  • iOS 9.3.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

info[UIImagePickerControllerMediaMetadata] は NSMutableDictionary ではなく
NSDictionary ですので、値を設定しようとするとエラーになります。

metadata を得ている行を、

NSMutableDictionary *metadata = [info[UIImagePickerControllerMediaMetadata] mutableCopy];

などとして NSMutableDictionary にすれば動くのではないでしょうか。

投稿2017/08/21 07:00

daisuke7

総合スコア1563

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問