ラベル Objective-C の投稿を表示しています。 すべての投稿を表示
ラベル Objective-C の投稿を表示しています。 すべての投稿を表示

2015年10月9日金曜日

起動せぬなら 殺してしまおう setupAVCapture:カメラアプリのレイアウトをシミュレータで確認する

どうも。へへへ。おはようございます。
只今絶賛不具合修正中ですが、個人的にちょっと衝撃的だったので、備忘録として投稿ー。

iOSのカメラアプリを開発しているのですが、ワタクシ、実機はiPhone 5sしかもってません。えへへ。だってお金ないもん。
でもXcodeのSimulatorでは、カメラが扱えない。
カメラアプリを起動すると、最初のスプラッシュスクリーンが表示されて、そこで止まってしまうんですね。カメラからの入力画像が表示されない。
だからカメラアプリの開発には、どうしても実機が必要になるのですが・・・。

ここで問題が。
iPadでシャッターボタンなどが表示されないよ、とアップル様からご指摘を受けました。
でも自分は実機持ってない。
・・・どうしよう。試せない。試せないと修正できない。うわー。

で、10分くらい悩んだ結果、はたと思いついた。
「カメラ機能を一時的に使えなくすれば、Simulatorでも動くんじゃね?」

やってみました。
いつもはこうしてるのを、
[self setupAVCapture];
こうしてみた。iPhoneの時だけsetupAVCapture動かしたるw
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {        [self setupAVCapture];    }

・・・動いた。SimulatorのiPadで。ほんとかよ。
まあ、もちろんカメラからの撮影機能とかは試せませんし、リリースする前に元に戻さなきゃならんのですが。
少なくとも、これでレイアウト崩れは再現と修正ができそうです。

やれやれ。

(最初からStoryboard使ってレイアウト作っとけばよかったな。次はそうしよう

2015年9月17日木曜日

滅びゆくものこそ美しけれ。:iOSのカメラロールに任意のアルバムを作成しようとしてハマった話

へいへいへい。みなさんこんばんは。おひさしぶりです。

今日はiOSのカメラアプリ開発で、ハマったことをメモ代わりにちょっとだけ。

ALAssetsLibraryを使って、デバイスのカメラロールにアプリの名前がついたアルバムを作成しようとしてたのです。

こちらの記事「iPhoneアプリ開発 芳名帳アプリ作成(6) -写真に保存-」を参考にさせて頂いたのですが・・・
うーん、説明は分かりやすいんだけど、まず、どうしてもアルバムが作れない。
なーんでーだろー?と思ってたら、

アルバム名にスペースが入ってた
・・・ソフト名「XXX Pro」をそのままアルバムの名前にしようと思ってたんですけど、・・・スペースの代わりにアンダースコア「_」にしたら、あっさり作成に成功。

ハマりポイントその1:アルバム名にスペースはいってた!

で、アルバムを作成できたのはいいんですが、今度はそこに写真を保存する方法がわからない。
それまでは、ALAssetsLibraryの「writeImageToSavedPhotosAlbum」でカメラロールに写真を保存してたわけですが・・・。
そもそもアセットとは何か、というのをロクに理解もせずに使っていたので、さて、アルバム指定するにはどうしたらよかんべ?となると、ちんぷんかんぷん。

アルバム名はわかってるんだから、「writeImageToSavedPhotosAlbum」にアルバム名を指定するオプションとかあるんじゃないのー?と勝手に考えてました。
ないない。そんなの。なかった。

結局は、
1. ALAssetsLibraryの「enumerateGroupsWithTypes:ALAssetsGroupAlbum」を使ってアルバムの一覧を取得
2. 目的のアルバムが見つかったところで、おもむろに「ALAssetsGroup」の「addAsset」を使って、「ALAssetsGroup」(アルバム)にAsset(写真)を追加
こんな流れで、ようやく指定したアルバムに写真を保存できました。

ハマりポイントその2:Assetってなんなのか良くわかってなかった

ま、ぐだぐだだったけど、なんとかできて良かった。
アルバムに写真を保存するところでは、「Quiita」さんのこの記事ios7,8でアルバム名を指定して画像を保存するが参考になったわけですが・・・
Swiftで書かれてて・・・ちょっと・・・難儀しましたねえ・・・
まあ、やってることは同じなんで、大変たすかりましたが・・・。
なんか、英語の資料を見ながらフランス語のレポートを作ってるような気分になりましたよ・・・。

・・・。
でも、今日配布がはじまったiOS9では、Asset Libraryはdeprecated(非推奨)となるそうな・・・。


The Assets Library framework is deprecated as of iOS 9.0. Instead, use the Photos framework instead, which in iOS 8.0 and later provides more features and better performance for working with a user’s photo library.
・・・せっかく覚えたのに・・・。
ちょっとね、なんだかなあ、ってオチですみません。
うん、寝よう。


2015年2月4日水曜日

TIFFか!TIFFか!TIFFなのか!!:iOSのカメラアプリでメーカー名などを写真のEXIFに埋め込む



えーと。こんばんは。

今日一日苦しんでた不具合がやっと解消されそうなので、愚痴を吐きます。げえーっ。

つい先日、Apple様のApp StoreにiPhoneアプリを公開した訳ですが。

ボスからまた連絡が。「このアプリ使えんの?」
いやー、使えますよ、やだなあえへへへ、と答えようとしたら、
「EXIF情報ないんだけど」

( ̄△ ̄;)

そ、そんなはずは・・・。
EXIF情報は、Android版を作ったときに散々やったしなー・・・
Commons Imagingちゃん口説き落とした: Exif情報のコピー

まあでも、そんなこと言ってても仕方ない。できてないもんはできてない。
で、確認してみましたら、

・・・。うん、確かに無いね。
いや、大事な情報の、「DateTimeOriginal」と「DateTimeDigitized」はきちんと保存されてる・・・されてるけど・・・
他の情報がほとんどない
・・・えええええ・・・。

NSDictionary作るときに、きちんとCGImageSourceCopyPropertiesAtIndexでコピーしたんだけどなー・・・。と思いつつ、コードをもいっぺん見てみると
NSMutableDictionary *EXIFDictionary = [[NSMutableDictionary alloc] init];
コピーしてねぇじゃん orz オイ俺!しっかりせえ!1
あかんわー。初期化して、箱だけ作って満足してるじゃんー。
慌てて修正。こんな感じに。
NSMutableDictionary *EXIFDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyExifDictionary]mutableCopy];
これで安心。ふー。
と思ったけど、・・・んー。なんか、メーカー名(「Apple」とか)、モデル名とか、あとは作成日付とか、そこら辺の情報がまだ保存されてないのよねー。
リファレンス(こちら)見て、関係ありそうなのはセットしてるんだけどなー。

メーカー名とモデル名は、特に変更しないから、最初にmutableCopyで持ってきたもの使えばいいし。
変更したいのは撮影日時とデータ化日時だから、それはsetObjectしてるし・・・
[EXIFDictionary setObject:originalDateTime forKey:(__bridge NSString *) kCGImagePropertyExifDateTimeOriginal];
[EXIFDictionary setObject:originalDateTime forKey:(__bridge NSString *) kCGImagePropertyExifDateTimeDigitized];

EXIFのDictionaryに、他に関係してるエントリはないしなー・・・と思いつつ、ふと「TIFF Dictionary Keys」の方も覗いてみましたら。
const CFStringRef kCGImagePropertyTIFFMake;
const CFStringRef kCGImagePropertyTIFFModel;
const CFStringRef kCGImagePropertyTIFFDateTime;
あるやん あるある あるやんかー・・・
( ̄△ ̄;)

で、TIFFのディクショナリー追加して、
 NSMutableDictionary *TIFFDictionary = [[metadataAsMutable objectForKey:(NSString *)kCGImagePropertyTIFFDictionary]mutableCopy];
このエントリたちをsetObjectして・・・。
[EXIFDictionary setObject:originalDateTime forKey:(__bridge NSString *) kCGImagePropertyTIFFDateTime]; 
[TIFFDictionary setObject:Make forKey:(__bridge NSString *) kCGImagePropertyTIFFMake]; 
[TIFFDictionary setObject:Model forKey:(__bridge NSString *) kCGImagePropertyTIFFModel]; 
[TIFFDictionary setObject:Software forKey:(__bridge NSString *) kCGImagePropertyTIFFSoftware];
ビルドしてみたら。
ほい。
半日以上悩んでたのが、あっという間に解決しましたよ。
( ̄∇ ̄;)

ま、できたから良いとすっか・・・。


あと関係ないけど、kCGImagePropertyMakerAppleDictionaryって何に使うんだろな・・・。最初これが無いせいかと思って追加したけど、なーんも変わらなかった。しくしく。


2014年6月26日木曜日

転んでませんから。: 開発用iPhone 5s入手

みなさんこんにちは。
今日もいい天気ですね。

先日、iPhoneを入手しました。
機種変更じゃありません。
メイン回線のAndroidはそのままで、データ通信だけのプランで新規回線契約しました。

いや、なんだかんだ言っても、日本国内でのiPhoneのシェアはやはり無視できないですからね。
まあ、最初はエミュレータで開発の勉強をするつもりだったんですが・・・。
やはり自分で持っていないと、いまいち良さもわからないし、モチベーションも涌かないし。


キャリアはドコモです。
6月から新料金プランが発表されたとのことで、ドコモショップに相談に行ったんですよ。
そうしたら、若干料金が安くなるとのことで。
・・・計算してみたら、データ通信のみのプランで新規に回線契約して、iPhoneを割賦で購入しても、毎月の支払いは現状とそんなに変わらないらしい。

ついでに、これまで付けていたドコモサービスを、いくつか外してもらいました。それでさらにお安く。
nottvとか、はっきり言って存在すら忘れてた。

で、速攻、iPhone 5sをゲット(笑)。
もうすぐ新機種がでるのかもしれませんが、まあ、iPhoneにあまりこだわりありませんしね。
動きゃいいんですよ動きゃ。
でも色はゴールドにした(笑)。

ただ、データ通信の上限が、メイン回線とシェアなのがちょっと不安。5GB。
上限上回っても、自動的に1GB追加されるようにはしてあるんですけど。
まあ、これまで5GBを上回ったことなんてほとんどないから、大丈夫だとは思うんですが。


で、ついでにシェルカバーも購入。無駄にガーリー。



液晶保護フィルムも同時に購入したんですが、親切にもドコモショップのお姉さんが貼ってくれましたよ。ワタシあれ苦手なんで、助かりました。
最近、競争が厳しくなってきて、サービス向上に努めてらっしゃるんでしょうか(笑)。

さーて、実機も手に入れちゃったことだし、せいぜいObjective-C、頑張って勉強しましょうかね。