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

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年10月5日月曜日

iOS9のいじわるー。:iOS9でcanOpenURLを使ってみた

こんばんわ。お久しぶりです。
なんか寝つけないので、ブログでも更新してみんとす。

ついこの間リリースされた「iOS9」で、カスタムURLスキームを使って別のアプリを呼び出そうとしてたんですよ。
でも、iOS9には痛い目に遭っているので(詳しくはまたいずれ)、今度は事前によーく調べてからにしようかなーと、検索してみましたら、こちらの記事がヒット。

【追記】iOS9でcanOpenURLを有効にする方法

えっなになに・・・「iOS9でcanOpenURLが使えなくなった」・・・。
ダメじゃん。きー!とか思ってたら、対処方法も書いてあった。ふんふん。
「Info.plist」に「LSApplicationQueriesSchemes」のキーと、アプリで許可するカスタムURLスキーマを登録すればいいらしい。

ふんふん。
で、このinfo.plist、XcodeでProperty Listとして値を編集することもできるようですが(というかこっちがデフォルト)、最近Xcodeがすっごく重くなってまして。

一度Property List表示で編集しようとしたら、画面が乱れてしまいました・・・
(;_;)
仕方ないので、Open AsのSource Listでソースとして開いて編集。
これなら問題ないやね。
というか、ワタシはもともとSGMLやらXMLのヒトなので、こっちの方がやりやすかったりする。

で、端末にカスタムURLスキーマを設定した自社アプリがあればそっちを起動するし、なければApp Storeのダウンロードページを表示するようにしてみた。

んー。上手くいかない(笑)
・・・最初は「canOpenURL」で分岐させてたんだけど、上手くいかないー。
ちょっと悩んだけど、もっと単純に考えたらあっさりできました。
要はデバイスのアプリをまず開いてみて、失敗したらストアに飛ばしゃいいのよ。うん。

NSURL *url_store = [NSURL URLWithString:@"https://アプリストアのURL"];
NSURL *url_device = [NSURL URLWithString:@"CustomURLSchema://"];
if ([[UIApplication sharedApplication] openURL:url_device]) {
        NSLog(@"OK");
} else {
        [[UIApplication sharedApplication] openURL:url_store];

}

この、何でもめんどくさく考える癖、直さなきゃな。
ということで、おやすみなさーい。










2015年8月2日日曜日

サンプルはあくまでサンプルである:Mapbox iOS SDKを使ってOpenStreetMapを表示する

やー、まいにちマイニチ蒸し暑くていやになっちゃいますねー、こんばんは。
というわけで今夜もファミレスに逃げてきましたよ。

今日はMapboxを試してました。
自分を自分好みにカスタマイズして公開できるという、素敵なウェブサービスです。

OpenSreetMapがベースだし、iOSやAndroidのSDKもあるし、ずっと試してみたかったんですよねー。
モバイルアプリを作るからには、地図は使いたい!
でもAPI制限のことを考えるとGoogle Mapはどうも気軽に使いにくいというかー。

途中、ちょこちょことつまづきましたが・・・Mapboxのサンプルを見ながら、なんとかiPhoneアプリまで作成。
といっても地図をiPhoneに表示させるだけですけど。

一つ、はまった点があったので、備忘録としてメモメモ。

サンプル通りにコード書いて、実機で確認しようとビルドすると「RMFoundation.h」が無いと怒られました。
もちろん、ファイルがあるのは確認済み。あっれー?おっかしーいーなー。

色々検索したところ・・・一つ前のバージョンのSDKにすればいいみたい。
ここを参考に、バージョン1.6.0に戻しました。
「'RMFoundation.h' file not found in 1.6.1 #631」

以下のようにpodfileに書いて、pod installを実行。
無事バージョン1.6.0に戻り、ビルドも通りましたとさ。
pod 'Mapbox-iOS-SDK', '1.6.0'
で、とりあえず作ったのがコレ。地図のスタイルはすっごくシンプルにしてみた。

地図のデザインは、Mapbox側で色々といじれるみたいなので、これから楽しみ!




2015年7月10日金曜日

日本語でおk!?:iOSでEXIFのUserCommentに日本語を設定しようとすると、途中で切れる

こんにちは。ぷんぷん。怒っています。

今日は朝からXcodeくんと戯れていました。
カメラアプリです。
撮影した写真に、メタ情報を埋め込もうとしていたのです。ええ、EXIFのUserCommentですね。

AndroidではCommons Imagingを使って、さくっと行きましたので、まあiOSでも問題ないだろうと。
こんな感じで。
UserComment = @"そんなこといったって、だめだもんはだめだで、しゃーがないべさ。ほだら。だば、あきらめてしごとしてくんろ。ほりほり。わーったか?ほーり。";
[EXIFDictionary setObject:UserComment forKey:(__bridge NSString *) kCGImagePropertyExifUserComment];

で、ビルドして、実機でテスト。
アプリで撮った写真をMacに転送し、コマンドラインからexiftoolを実行して、UserCommentを確認しましたら・・・。
User Comment: そんなこといったって、だめだもんはだめだで、しゃーがないべさ。ほだ
途中できれとるがな
なんでやねん。
EXIFのUserCommentに文字数制限なんかあったか?・・・まああるかもしらへんけど、そんな長い文字列とは思えへんしー。
ネットで検索したら、日本語と英語が混じってる時は、途中で切れることもあるとか書いてあるけど、・・・今回、全部日本語やしー。
ううう。

ちなみに、全部英語だったら、長い文字列でもいいのかなー?
というわけで、以下の文章でテスト。

NSString *UserComment = @"Can I set Exif UserComment String in such a way? I cannot understand why apple doesn't pass Japanese Characters. Are they jerous about Japanese Food? Sushi? Tenpura!?";
・・・きれてなーい。きれてないよー?

もうね、これ、日本語があかん、というやつなのかなー・・・。
まあ引き続き調査はしますが、あまりに腹がたったので記事にしました。ぷんすか。

(オチなし)

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年12月17日水曜日

Xcode 6でプロジェクト名を変更する:「Manage Schemes」

こんにちは。おひさしぶりです、おほほほ。

最近、ちょこちょことiPhoneアプリの開発など続けていまして。ええ、地道に。
で、ようやく「これなら公開してもいいかなー?」くらいになったので、公開の準備を進めることにしました。

・・・。もしかしたらアプリ自体よりめんどくさいかもしんない。
個人じゃなく、会社として公開しようとしてるんですが、会社用のDeveloper's Program購入するときに、会社のD-U-N-S® Numberとやらが必要なんだとか。
https://developer.apple.com/jp/support/ios/D-U-N-S.php
なんかもー、めんどくさいこと多くてしょげちゃう。しょぼん。

まあ検索したら、ラッキーにも「だんずなんばー」は登録されてたので、問題はなかったんですが。
今日はまったのは、この先。

現在作っているXcodeプロジェクトの名前です。
・・・まさかこれほど早く正式版になるとは思ってなかったので、「サンプル云々」の名前をつけていたのですよ。どーせ書き直しになるよ、ははは、ってくらいに思ってて。

この辺の記事を参考にさせていただいて、プロジェクト名は割と簡単に変更できたのですが。
Xcode 4でプロジェクトの名称変更

実際にRunしてみると、・・・あれ。エラーがでる。ビルドできない。
へ、変更前の名前のファイルを参照してる・・・そりゃないわ・・・。
しかも、どこを修正したらよいかわからない・・・。

で、いろいろ試したり、検索した結果、Manage Schemesという画面で設定できるとわかりました。
[Product] > [Scheme] > [Manage Scheme]を選択。


で、新しいスキームを作成。作成は画面左下の[+]をクリック。
古いスキームは削除しちゃいました。


再度、実機でテストしてみると、・・・今度は問題なくビルド、実行できました。
はー、焦ったー。

でも、よく考えたら、右上に[Autocreate Schemes Now]ってボタンがあるねんな・・・。
こっちやったほうがよかったかしら?

ま、動くから問題なし。ほほ。





2014年8月19日火曜日

やたっ サンプル動いた。:iOS用カメラアプリへ第一歩

やー暑い。こんにちは。
ごぶさたです。

通常業務と並行して、iPhoneアプリの勉強をちょこちょこしていたのですが。
教科書も2/3くらい進んだところで、「あーもーいーやー」と面倒くさくなってしまいました。

振り返れば、Androidのカメラアプリを作った時も、ある程度基本を覚えたら、いきなりサンプル動かしたんだっけ。

ということで、サンプル作ってみました。





どや。うごいたで。

・・・や、このサイト 参考にして、コードパチパチ手入力しただけなんですけどね。

コピペじゃないですよ。手入力ですよ。ここ大事です。

どうせ最初だから、自分で打ち込んでるコードの意味は分かってないんですが。

それでもパチパチ入力していけば、
「あ、ここ、さっきと同じ書き方だな」とか、
「ほうほう。これ、もしかしてこういうことか・・・?」って、だんだん分かってきますからね。

コピペだとショートカットキー二回押せばお終いですからね。何も頭に残らないですね。


それにしても、まあ確かに、EclipseでAndroidアプリ作るよりは簡単(やり方さえ分かれば)だなあって思いましたよね。

まず、実機検証が簡単ですよね。
ふつーにMacに繋いで、Xcodeで実機として登録しておけば、Runしただけでさくっとアプリが動きますもの。うひゃあ簡単。

実弾(現金)使ってAppleに開発者登録しなけりゃならないとか、
実弾(現金)使って高いiPhone購入しにゃならんとか、それなりに障壁はありますが、
まあそこは、さすが金の力。
一旦実弾ぶっ放しておけば、あとはスムーズに行きますね。

あと、StoryBoardってファイルでUIの部品を作らなきゃならないかなあと思ってたんですが。
サイトの記事通りに*.hファイルと*.mファイルにコードを書いていけば、それでとりあえずは動く。
まあレイアウトはショボイ以前の問題なんですが。

これはちょっと驚き。
StoryBoardでビジュアルレイアウトを弄らないと、何も作れないと思ってた。


ま、これで勢いが付いた感じがするので、気は楽になったかな。
少なくとも、恐れるに足らず、と思えるようになりましたよね。
(そんなこと言ってて多分明日あたりは「コレどうやんのー!」って泣いてると思うけど)