2014年7月23日水曜日

Wordpressに移行しました

嘘。移行しきれてないけどな。
アプリのサポートページとか。

http://nadegiri.main.jp/

基本的にもうこっち更新しませんので。

"Your app status is Removed From Sale"

"Your app status is Removed From Sale"

『お前のアプリは既に死んでいる(^ω^)』という表題のメールが。

なんか2chBuzzの2.0の審査したらいかがわCコンテンツがあったって言って1.0ごとリジェクトしたらしいのだが。
それは分かるとして、2.0審査リジェクトで添付されてきた画面のキャプチャが1.0のなんだが。

お前らちゃんと審査してねえだろ。

ResolutionCenterで抗議して終了。

2014年7月20日日曜日

審査前のvaridateエラー「The app references non-public selectors in 〜」

エラーでたー(´・ω・`)

The app references non-public selectors in Payload/○○○.app/○○○: number,setnumber:

なぜ毎回違うエラーがでるのか。
そしてまたsetNumberなんてメソッド使ってませんですことよ。
number型に何か入れてるところが問題なんだろうが分からん。

Status的にはPassed Validation with Warningsで一応通っているので今回は無視。

ワカンネ

2014年7月19日土曜日

設定言語の種類の取得方法

多言語対応で定数差し替えたい場合はNSLocalizedStringとか使うんだが、
今回は言語の種別そのものを取得する。

NSArray *languages = [NSLocale preferredLanguages]; 

NSString *currentLang = [languages objectAtIndex:0];


この変数にjaとかenとか入ってくる。
今回自分はjaとenの二種しか使わない。

・・・・というか、洒落た感じにしようと日本語非対応のフォントとか使うんじゃないね('A`)

2014年7月17日木曜日

『Your app, 2ch.Buzz, does not comply with the App Review Guidelines』

なにやらAppleからメールが来た。
リリース済みのアプリに問題が生じたらしい。

『Your app, 2ch.Buzz, does not comply with the App Review Guidelines』

Your app, 2ch.Buzz (642142667), does not comply with one or more App Review Guidelines.

For details, or to directly contact the App Review team, visit the Resolution Center in iTunes Connect.

Regards,

The App Review team


ですってよー。
RSS取得して表示するアプリだからいかがわしい記事が混じったらしい。
24時間以内に対応しろですと。

てか、審査中でもないのにどうやって検出してんだ?


2014年7月16日水曜日

100日連続ブログ更新しました ☆-(ノ゚Д゚)八(゚Д゚ )ノイエーイ

やったね(白目)

今年四月中旬のニート開始から、100日間連続更新を目標に100記事以上ブログを更新した。
まあ更新できない日ももちろんあったけれど、かならず前後の日で更新してなんとか100記事。
感動で涙が滲む。これ読んだ人も泣いていいよ?

ほぼ1ヶ月で一本ペースでアプリつくって、未だ収益化はみえず。

今日も2chBuzzに広告入れて審査だしたけどまたなんかリンク先がいかがわしいとかでRejectされてましたねなんか。
リリースできたのただの奇跡だろほんとアレ。

今後はまー、とりあえず毎日更新縛りプレイは解除してもいいかもとは思うけども、
ブログ更新ネタを作るために開発すすめないとエオルゼアから帰ってこれなくなりそうなので、
毎日更新はもうちょっとだけ続くんじゃ

名付けてブログ駆動開発。

完結編・StoryBoard上でUITabBarItemを選択した場合に必ずExecBadAccessで落ちる。





原因 → コーディングでした

//delegate
self.navigationController.delegate = self;
self.tabBarController.delegate = self;
この2行をテーブルビューのdidloadに入れてたんだけど、これがアカンかったらしい。
コメントにしたら落ちなくなった。

結局、
「UINavigationControllerとUITabbarControllerの制御はStoryBoadがやるのになに勝手に触ってんの^^;」
て話なんだろう。

おう。それは分かる。

違う。違うんだよそうじゃないだろ。
実際動かせないSegue接続とか、特定の画面遷移パターンのみexc_bad_accessでデバッグすら不能とか、起動即終了とか、解決方法を提示しない強制終了が多すぎるだろう。

できないこととできることをはっきりしろという。

よくある話ではあるけど、バックエンドがどこまで自動で面倒見てるのか理解してないと使い物にならんね。
道具は理解して使わないといけないのは基本中の基本だが、理解しなくて中途半端に使えるのに面倒見ないのはかえって敷居上がらないか?
StoryBoardって、画面の流れとか、見ればはっきり分かるのが利点なんじゃないかと思うんだけど。だよね?

ほんと5日間進捗ゼロとか客先だったらハゲ上がってるぞ

俺はStoryBoadを使うのをやめるぞー!!!!!!(2度目)

2014年7月15日火曜日

2014年7月14日月曜日

StoryBoard上でUITabBarItemを選択した場合に必ずExecBadAccessで落ちる。

StoryBoardにAppleが想定しない接続方法と不具合が同時に備わり俺が死ぬ。

未解決。調査中。3日はまってる。











タブ上の先頭のTableViewでcellを選択し、次の画面に遷移し、戻ってきて別のタブを選択するとexec_bad_accessで落ちる。
mainまで上がったところで落ちる。

( ´ー`)フゥー...な゛ん゛な゛の゛!?

2014年7月13日日曜日

いまさらながら、インデントのショートカット

control + I (大文字のi)ね。

あと関係ないけど、
option + command + c でコミット。

超便利。超今更。
こういうのに気づかない時はめっちゃ頭腐ってるということだと思う。
てことはずっと腐ってる。

2014年7月12日土曜日

短縮URL生成APIを呼び出す

ニュースリーダーアプリで記事読んだ後に、そのページをTweetする際に使用したい。

短縮URL生成サービスは、
・goo.gl
・bit.ly
のどっちがいいかなあと比較したところ、
Objective-cで取り扱いが簡単そうで、また使用回数の上限がなさそう?なbit.lyにした。
googleは一日の呼び出し上限がAPIキーごとに決まっているが、
bitlyは、接続元ごと(要するに端末ごと)に単位時間あたりで制限しているようなので、
今回の使用方法では無制限に使えると思う。

Objective-Cでの呼び出し方

[str JSONValue]を使わないパース方法

こんなもんかいな。

2014年7月11日金曜日

Google Analyrics にアプリのトレースがあがってこない場合に疑うべき?項目

Analyticsの設定を前回やったものの、アクセスログというかトレース情報が全く管理コンソールに表示されない(´・ω・`)

で、細かい項目一個ずつ見ていって怪しい項目を発見。

利用同意をしていない箇所があるようだ。
この画面の下方の


この欄。同意してないよって書いてあるので






同意して、保存。




アプリを起動すると正しく表示された。



2014年7月10日木曜日

iAdを有効化しようとしたがしかし

参考にしました
http://crunchtimer.jp/blog/ios/itunesconnect_iad_setteing.html

1)iTunesConnectでiAd管理画面?へ遷移するでしょ















2)はいどーん















半ギレ。
審査始まるまでに設定したいんですけどー?

昨日やっとけばよかった。てかやるの忘れた。ひーん。

2014年7月9日水曜日

Ad Banner view によるiAdの設置手順

iAdを設定したので手順。
広告の名称自体はiAdなのにコントロールの名称はAdBannerViewなんだよね。
iAd~って打って入力補完効かなくて若干、混乱するなど。

SSは省略。
事前に銀行口座の設定等は済ませてある。

参考
http://lab.dolice.net/blog/2013/03/16/iad-banner/

1)FWのインポート
  いつもどおりプロジェクト設定から追加。iAd。

2).hへのインポート・delegate設定
  これを先にやんないで画面に設置すると落ちるっぽい。てか落ちた。

3)AdBannerViewの設置
  画面にコントロールを貼り付け。

4)delegateメソッドの設定。
  しなくても画面には表示されるが、広告が受信されない状態で白枠表示してると
  審査リジェクトされるとのことなので、
  ・初期表示 → hidden
  ・受信OK → hidden解除
  ・受信NG → hidden
  で処理する。

以上。
なんかiTunes Connectで設定いる気がするんだが、
ちょっと調べてわからんかったのでそっちは別途。

2014年7月8日火曜日

『Google Analytics Services SDK』を使用する

こないだのmac people読んで、初めて存在を知った。
これ必需品じゃないのー?

Google Analytics Services SDK

設置参考

2chBuzz と News Center に設置しようと思う。

2014年7月7日月曜日

GoogleNewsのフィードは果たしてちゃんと取れるか

こちらを参考に
http://so-zou.jp/web-app/tech/web-api/google/search/news/parameter.htm#edition

「本家(US)版」で「日本語記事」を対象に「カテゴリー指定」でデータとろうとして、
データが取得できるのとできないのがあった。
パタメータの組み合わせ次第で取得に失敗し(件数が0とかじゃなくて)、
できない場合はtopにリダイレクトされてしまう。
まあ仕様なんでしょうけど。その仕様が調べても出てこんよ。

なので全部たたきゃあいいんだよ!

【ned指定しちゃだめなやつ】
「話題のニュース」

https://news.google.com/news/feeds?output=rss&cf=all&num=30&scoring=n&hl=ja&topic=po

の2点

【ned指定しないとだめなやつ】
「ビジネス」
「エンタメ」

の他、もろもろ。
どっちでも指定できないのも多い。「topic=a」(auto 車)とか。

他もろもろは多いので割愛するけど、
なんで東南アジアとかアフリカとかちょっとニッチなRSSは取得できるんだろうか。
中国指定の場合は取れなかった。
Google様のお考えはよくわからぬ。

2014年7月6日日曜日

StoryBoard上でtabの画像の設定

もうやり方古いかもしれない。
assetsとか今あるし。そっちは知らん。

・画像を30pix(非Retina)と60pix(Retina)で用意
・60の方はサフィックスとして@2xを付与
・双方プロジェクトに追加
・設定対象のタブを選択
・BarItemのimageに、サフィックスなしの名前を設定

これで、Retinaの場合60、非Retinaの場合30を自動的に読み込んでくれる。
いい加減非Retinaの対応切ってほしいんだけどなー。
無理か。iPadMiniまだ1世代前だもんなー。


2014年7月5日土曜日

StoryBoardのバグ?UITabBar上のUIViewControllerが呼び出せない件

キレそう。

UITabBarに一つのUIViewControllerがあり、
それぞれのタブをタップした場合に表示切り替えたいんですけどね。

こうしたいやん。
















でもこれやると、UIViewControllerが読み込めない。
タブをタップすると、Viewが真っ黒。viewdidloadも呼ばれない。
(おそらく、複数のUIViewControllerがrootviewに設定されているため)

できないなら繋げないようにしてくれよ、Xcodeさんよぉ。

だから、こう。rootviewが一つになるよう定義してみる。














動かしてみる → 陽性かくにん☆よかった!!

うん。意味わからん。
これだと画面の定義が重複するやん。
青いとこでいうと、1箇所修正したいと4箇所直さないかんやん。めんどいやん。

StackOverFlowとか見れてないけど、これどうするのが正解なんだろう。

Swiftとかやる前にStoryBoardの使い勝手なんとかして。

2014年7月4日金曜日

StoryBoard上での、UITabBarItemの並び替え

UITabBarの並び順ってどこで設定するっけ、って思ったんだが
普通にドラッグ&ドロップでできた。

以下の例では5つだけれど、5つ以上も設定&並び替え可能。
(実行時に表示されるのは4つ+(その他)で計5つ)



2014年7月3日木曜日

UITabBar上で、どのtabitemが選択されたか判別する

tabitemっていい方でいいんだっけ。tabbaritemかもしれん。

複数のタブが存在し、且つ各タブのUIViewControllerが同じクラスに紐付いている場合、
どのタブがタップされたか判別して表示切り替えたいわけですけど、どうするか。

以下自己流。ましな方法ないのかしらーとは思うが。

- (void)viewDidAppear:(BOOL)animated

{

    //方法1 vcのタイトルにフラグ値でも設定しておく。文字列でもよいか

    int mode1 = [self.tabBarController.selectedViewController.title integerValue];

   

    //方法2 vcのviewのtagを使う。数値。

    int mode2 = self.tabBarController.selectedViewController.view.tag;

}


今作っている奴はtitle使う方を採用している。StoryBoard使用。 tagつかうほうがわかりやすいとは思うんだけど。

2014年7月2日水曜日

HostGatorから一方的に返金された

あ…ありのまま 今 起こった事を話すぜ!

『おれはサーバー代金をPayPal支払いしたと思ったらいつのまにか返金されていた』

な… 何を言ってるのか わからねーと思うがおれも何をされたのかわからなかった

頭がどうにかなりそうだった…

V-プリカ使えないだとか写真付き身分証でのverificationだとかそんなチャチなもんじゃあ 断じてねえ

もっと恐ろしいものの片鱗を味わったぜ…







(  ゚д゚)ポカーン...

( ゚д゚)

こうして俺のアフィカスへの夢は潰えた。




2chBuzzで使ってるlolipopのプラン上げてそこにWordPressをホストしよう。うん。

キーワード登録型ニュースリーダーアプリ『NewsCenter』をリリースしました

おいィ?審査遅いよ!8日かかってるよ!?

リリースされました。









キーワード登録型っていっても、
ポイントは位置情報による「普段は見そうで見ない、ローカルニュースの閲覧」なんだけど。

今後、機能追加と英語版対応を急ぐ。

・新着ニュースの通知
・大分類(ジャンル)選択画面
・既読管理

とかかなー。まあすでに不具合もあるんですけども。
てか初回起動時に位置情報取れないバグに関しては審査で指摘されないのか(困惑

よく審査通したな。

2014年7月1日火曜日

PayPal使うとHostGatorの認証が一発で通らない模様

HostGatorの契約にクレカ使わないで、PayPal経由で契約してしまったせいで認証されなかったようだ。
情報追加して認証してくれってメールが届いた。

HostGator - Verification Requested

If you are unable to call us, you can instead respond to this ticket with a scanned copy of a Photo ID such as a passport, or drivers license. In addition to a photo ID, please include a scanned copy of the credit card that was used in your account purchase  (assuming you purchased a hosting account with a credit card). For security purposes you can mask off all the digits of the card number except for the last 4 digits.

こちらが参考。
ホストゲーターからの怪しいメールについて

実際怪しいから困る。

・写真付きの身分証のコピー
・クレカで契約した人はクレカな(下4桁以外かくしていいけど)
をこのメールに返信してな

って話らしい。
しかしまあ、PayPalつかって引き落とした後に「お前の支払情報、不審だからアカ凍結なw」
って来るあたり、Appleに匹敵する鬼畜だぞ。
じゃあ先に決済するんじゃねぇよ。

「悪用するやつが多いからすまんな」みたいな文も入ってたけど、
先に金払わせてから認証かけるあたり、課金しないで抜ける客を出さないような工夫と思われる。
小賢しいわ。でも逆に俺が業者なら絶対そうするなあ。

作業机のレイアウト変更。暑い。


片付けしてたら一日終わってしまった。
友人の影響を受けてモニターを縦2連にしてみる。まあ友人は4枚だけど。
重ねてみて、片方が23インチ・もう片方が22インチだったことを思い出した。
ぴったりにならねーじゃねーか!

Windowsのデュアルディスプレイが基本だけど、
下のディスプレイは入力切り替えて開発Mac用にする。
上で作業用音楽・動画流して、下で作業。

以前はMacBook、画面1、画面2と横にずらっと並べていたけれど
MacBook自体は棚に上げてしまっても問題ない(直接操作しない)ので片付けた。
昔MacMini用に買ったマウスとキーボードで操作するからどこにあっても一緒。

上のディスプレイ見づらいとは思うけど、左右チラチラ見るよりは楽じゃないかなー。
同じ姿勢のまま見れるってのが。

とりあえず新感覚を楽しんでみる。

・・・にしても、4枚も並べる気は起きないな。

凄く久しぶりに雑誌買った。MacPeople。




















これなー。
滅多に雑誌買わないんだけど。最後に買った雑誌はTarzanの腰痛特集だったような。
立ち読みすることはあっても買ったことはないMacPeoPle買った。
・iOS8
・Swift
・WordPress(←何故?)
とちょうど調べたい話題だったので。

にしてもまた勉強するの大変になりそうななー。SwiftといいiOS8といい。
「アプリ開発者の声」なんてページも実感持って読めるので面白かった。

2014年6月30日月曜日

バイト長で文字列を区切る

以下の場合は改行を挟むパターン。

NSMutableString *mstr = [NSMutableString stringWithString:cellTitleLabel.text];

for (int i = 0; i < [cellTitleLabel.text length]; i++) {
    NSString *temp = [cellTitleLabel.text substringToIndex:i]; 
    if ([temp lengthOfBytesUsingEncoding:NSUTF8StringEncoding] > DETAIL_TITLE_LENGTH_AS_BYTE)     {
        [mstr appendString:@"\n"]; 
        break; 
    }
}

審査で蹴られたアプリがiTunesConnectから削除できない

・・・っていって問い合わせフォームから投げたら、返ってきた。

You can delete an app from iTunes Connect if it has at least one approved version and is in one of the following states:

Prepare for Upload
Waiting for Upload
Invalid Binary
Developer Rejected
Rejected
Metadata Rejected
Developer Removed from Sale
Removed from Sale

If the option to delete the app is not available,
make sure that the app is removed from sale,
is not part of a Game Center group, and is not in review.

「delできるのは以下のステータスだよ」
「できないときは、AppStoreから強制削除された場合、ゲームセンターに追加されてる場合、レビュー中の場合じゃないか確認してね」

って感じか。

今の状態は「Waiting for Upload」かつ、
価格設定等すべて破棄した状態なので削除できないわけはないが、できないまま。

・・・バグじゃねえのかなコレ。
もっと問い合わせ増えれば見直されるかもしれん。
時間の無駄っぽいから今のところは諦める。

自作アプリの審査開始が遅い・・・7日経過

先週23日にアップロードしたNewsCenterがまだ審査開始にならない。

ふと気になって平均審査期間確認したが、
https://developer.apple.com/news/
・・・「5日以内に処理される確率 79%」のまま。

単に21%に引っかかってるのか、それとも何か問題があるのか。
気になる気になる。

てか大体審査待ちの間って何してんのかね。静的解析?


2014年6月29日日曜日

サーバーをレンタルしました。そしてWordPressをインストール。

厳正なる比較検討(10分)の結果、サーバーはHostGatorとた。

お値段と、評判と、アレゲなサイトをホストすることも可能な海外鯖ということで。
いや、健全なサイト作りますけどね、ええ。

導入→WordPressインストールまではこちらが参考になりそうです。
HostGator日本語ガイド
辿り着く前に決めちゃったけど。

ネットでHostGator調べても、ちょっと古い情報が多かったのが気になった。
(期間絞ってググれって話ですが)
曰く、コントロールパネルが日本語対応してる、とか
曰く、WordPressの簡単インストール機能はない、とか。

まあ英語で平気なんですけどね、俺らのApple様のお陰で慣れたよ。
簡単インストールがあるのは嬉しい誤算。
コンパネまあまあ見やすい。下の方行くとRailsのStartボタンとかあって、結構遊び甲斐はありそう。


















で、WordPressインストールしてみたんだけど、DNSが浸透していない(?)せいなのかWPのコンパネにアクセスできなかった。
ここまでで何か間違ってるとも思えないので一日寝かせることとする。

2014年6月28日土曜日

V-プリカが使えなくなっていた件。てか月額使用料には使えない件。

昨日、V-プリカ調達したっすよって書いたんですけど。
ムームードメインでの支払いしようと思ったら、「エラー このカード使えません」

(  ゚д゚)ポカーン

で、調べてたらでるわでるわ。

使い勝手が悪化したVプリカ
お二方とも、自分と同様にサーバー費的なものを支払おうとされて模様。
要するに、買い物とかには使えるけど期間利用料なんかの支払いには使えなくなったらしい。

・・・・ないわー。ホントないわー。マジないわー。
わざわざ買って使えないとかないわー。
VISAカードと同じようにつかえないんじゃん。
ドメインの更新にも使えないし、海外サーバーの契約にも使えない。つかえねーよ!?

↓このページ、TOPのどこから辿れるんだよw

3ヶ月以内に使わないと保管料引かれるし、ささっと使い切りたいところ。

何買おうかなああああああああああああああああああああああああああああああああああああああああああああああああああああああ?

2014年6月27日金曜日

サーバー代とか払う用にV-プリカを購入した。

V-プリカ
購入したっていっても前から何回か使ってるんですが、金額たりなそうなので足してきた、という話。

サーバー代やらシェアウェア代を払うのに、普段使いのクレカは使いたくない、
という人にピッタリなのがV-プリカ。

VISAのクレカとして使用できる仮想プリペイドカード。といえばいいものか。

→ 【追記】つかえなくなってましたー m9(^Д^)プギャー

SublimeText買うのに最初買ったんだよな。
・・・最近肝心のSublime使ってねえ。結構高いのに。

クレカ払いが便利でいいけど、海外の怪しい?サイトというか、とにかくAmazon以外でクレカ使いたくねえよ、という方におすすめ。

なんかミクさんデザインができてた。






可愛くても、物理的なカードをもてるわけではないので意味ないけれども。


2014年6月26日木曜日

WordPressとWordPress.comの違いとか。

暇になったので、流行りもんのWordPressを使ってみようと思う(遅い)。

WordPressとは?
→ オープンソースのブログソフトウェア。CMSとしての利用も多い。

WordPress.comって要するにWordPress公式かと思ってたが違った。
.comの方はWordPressを使ったレンタルブログサービスだ。

WordPress公式はhttp://wordpress.org/ね。
無印と.comはなにが違うんじゃって記事はやっぱり.comの記事にあった。

.comの方はカスタマイズに制限があるというか、豊富なアドオンが使えないようなので
無印をインストールして使用していこうと思う。

が、サーバーを借りないと行けないな。検討中である。
またサーバーが増えてしまう。めんどい。

2014年6月25日水曜日

ソーシャル関連 調査メモ

後々、アプリに実装したいAPI類。

【カウンター(コメント件数取得)】
Facebook
http://graph.facebook.com/<取得対象のURL>
→ シェア数が取得できるようだ。
  FBだと、シェア数、Like数、コメント数とかあるけど、
  どれが人気記事の指標としてふさわしいか?

Twitter
http://urls.api.twitter.com/1/urls/count.json?url=<取得対象のURL>

はてなブックマーク
http://api.b.st-hatena.com/entry.count?url=<取得対象のURL>

【特定ページのコメント取得】
https://graph.facebook.com/comments/?ids=<取得対象のURL>

Graph APIで新コメント欄の返信機能を扱う

 

2014年6月24日火曜日

今後の開発計画

マジで書くことなくなった。
作りかけてたものが一段落しちゃったのでやる気ゼロだ。
だので、今後の予定をちょっと書き出しながら整理する。

① アプリ「2chbuzz」
  → 広告入れたい。広告入れたいけど、操作性というかUI損ねたくないので形が難しい。
   どうしたもんか。

② アプリ「News Center」
  → メインで拡張していきたい。新着件数とFBコメント・tweet表示したい。
    API調べないと。あとこれも広告。

③ アプリ「SSS Cam」
  → 正直どうしようもない。ただデフォカメラ準拠を網羅できたので
    なんか別のネタカメラアプリか何かに転用して、収益化を図る。

④ アプリ「半角カタカナ変換」
  → かなりどうでもいいが、結構レビュー書いてくれてるので
    要望機能の追加とUIの整理等はする。広告は要らんだろ。
    競合多い中、使ってもらえればOK。

⑤ WordPressの勉強
   → ツールの使い方とホスト先の検討、このブログの移行。
    PHP触らないでどこまでできるもんなのか?
    アドオンもいっぱいあるみたいなので楽しみだ。
    向こう一週間はコレをやる。 

2014年6月23日月曜日

オブジェクトのクラスの判別

オブジェクトの型が何が分からない場合、isKindOfClassで検証できるようだ。
まあ何の型が入ってるか分からない場合ってあんまないけど、
以下の場合、tempにArrayが入ってるか、Arrayの1要素のDictionaryが直接入ってくるか、
外部からのデータ文字列に依存するためこのような方法になった。

                if ([temp isKindOfClass:[NSArray class]]) {
                    _feedDataItems = temp;
                }else{
                    _feedDataItems = @[temp];
                }



2014年6月22日日曜日

カメラアプリ「SSS Cam」がリリースされました








逆になぜ審査通ったのか。
カメラアプリ「SSS Cam」がリリースされました。

静音カメラとして開発したものの「デフォの音ならないと駄目だよ」 つって審査蹴られてた例のアレ。
音出すようにしてしまったら他に目立った機能もなく、
「デフォルトのカメラアプリと機能差殆ど無いから審査NG」とか
言われるのを覚悟していたが問題なくリリースされてしまった。

い、いいのか?まあ自分はもちろんありがたいが。
今回は有料アプリとしてみた。あまり売れないと思うけども。
カメラアプリというジャンル自体はたぶんiOS端末で開発する限りなくなることはないから、
後々に役に立つことに淡い期待を抱く。

・・・まあ工数分くらい回収できると一番いいけれども。
 

2014年6月21日土曜日

UINavigationbar上のフォント等の設定

設定するのが面倒だ・・・。
フォントなどなど弄りたければ、label作って入れ替える。

    UILabel *title = [[UILabel alloc] initWithFrame:CGRectZero];
    title.font = [UIFont boldSystemFontOfSize:FONTSIZE_HEADER];
    title.textColor = COLOR_TITLE;
    title.text = @"Mews";
    title.textAlignment = NSTextAlignmentCenter;
    [title sizeToFit];
    self.navigationItem.titleView = title;

2014年6月20日金曜日

UITableView上のTextFieldで入力中にキーボードで隠さないようにする

TextField上で編集する際にキーボードが表示され、覆いかぶさってしまうことの回避方法。
表示中のみtableにinsetを設定する。

<UIEdgeInsetsの参考>
http://runlooprun.wordpress.com/2011/02/20/uiedgeinsets/

         #define INSET_KEYBOARD 260.0f                //キーボード+予測変換欄の高さ
         #define INSET_BAR 60.0f                      //NavBarの高さ
        //編集開始時
        UIEdgeInsets insets = UIEdgeInsetsMake(INSET_BAR, 0.0f, INSET_KEYBOARD, 0.0f);
        _keywordTableView.contentInset = insets;
        _keywordTableView.scrollIndicatorInsets = insets;
        //編集終了時
        UIEdgeInsets insets = UIEdgeInsetsMake(INSET_BAR, 0.0f, 0.0f, 0.0f);
        _keywordTableView.contentInset = insets;
        _keywordTableView.scrollIndicatorInsets = insets;

2014年6月19日木曜日

UIBarButtonItemのフォントサイズ変更

UIBarButtonで、『<』『>』とか『ー』『+』をボタン画像代わりに使用しているので、
大きさをあわせるためにフォントサイズを変更。

    //特定のボタンのサイズを変更
    [_backButton setTitleTextAttributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:20.0]}
                               forState:UIControlStateNormal];
    //ボタン全部一括で設定したければこっち
    [[UITabBarItem appearance] setTitleTextAttributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:20.0]}
                                  forState:UIControlStateNormal];

2014年6月18日水曜日

日付の文字列のフォーマットを変更する


"Fri, 13 Jun 2014 21:08:14 GMT" → "2014/06/13 (Fri) 21:08:14" と変換したい。


まあ、日付文字列→日付→日付文字列の変換。
これだけでもめっちゃ面倒・・・。
ましな方法ないんだろうか。

NSDateFormatterを使用する際にnilが帰ってきてしまったため、
フォーマット文字列の指定を最初疑ったが原因はロケールの指定だった。

<日付のフォーマット指定の参考>
http://technical-iphone.blogspot.jp/2010/05/blog-post_06.html


    NSString* dateStr = @"Fri, 13 Jun 2014 21:08:14 GMT";
    dateStr = [dateStr stringByReplacingOccurrencesOfString:@" GMT"
                                                 withString:@""];
    NSDateFormatter* fmtToDate = [NSDateFormatter new];
    [fmtToDate setDateFormat:@"EEE, dd MMM yyyy H:mm:ss"]; //Fri 13 Jun 2014 21:08:14
    [fmtToDate setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    [fmtToDate setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PST"]];
    
    NSDate* date = [fmtToDate dateFromString:dateStr];
    
    NSDateFormatter* fmtToStr = [NSDateFormatter new];
    [fmtToStr setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; // Localeの指定
    [fmtToDate setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PST"]];
    [fmtToStr setDateFormat:@"yyyy/MM/dd (EEE) HH:mm:ss"];
    
    dateStr = [fmtToStr stringFromDate:date];

2014年6月17日火曜日

静音カメラの審査レビュー変遷

俺氏「静音カメラアプリ作った」
 ↓
林檎「デフォルトでシャッター音が出ないアプリはNG。古事記にもそう書いてある。」
 ↓
俺氏「マナー時には音鳴らないように、非マナー時は音選べるようにしました」
 ↓
林檎「デフォの音以外が鳴るアプリはNG。」
 ↓
俺氏「じゃあ普通の音が鳴るようにします。」
 
これもうデフォルトのカメラと変わらんからまた蹴られるんじゃねーかな(白目

なんか、AppStoreで配布されてるアプリ見て、
「こんなの俺でも作れるわwwww楽勝っしょwwww」
つって作ってみたら審査通らないケースが多い。

まあ審査基準が変わってるんだろうが、それならAppStoreのアプリも取り下げさせろよ。
よっぽど問題ある(エロとか)場合しか取り下げられないみたいだが。

ネタに便乗するんじゃなくて、本当にクリエイティブな仕事をしないと駄目そうだ。

明日から本気出す。明日からね。

2014年6月16日月曜日

100記事更新を達成したので記念

( ・∀・)ノ このブログの公開記事数が、100件になりました。

だからなんだつっつー話ですけれども、継続できたのはいいことだ!
ほとんどアクセスないけどな!

もともとは、自作アプリのサポートURLに設定するサイトが必要だから、という理由で作ったこのブログ。
当初は全く更新も続かず、どうしたもんかと思ったけれど。
まあ家でプログラミング自体あまりしていなかったからネタが無いのは当たり前・・・
というのは言い訳だろうなあ。
今は自宅で自作アプリの開発に注力しているので、
8月くらいまでは毎日更新したいところだけどいい加減ネタのストックは尽きた(´・ω・`)

だがしかしネタがないということは開発が足りないということだ!!

何か作る → ネタができる → ブログ書く → ネタ尽きる → なんか作る

_人人人人人人_
> 永久機関 <
 ̄Y^Y^Y^Y^Y ̄

とりあえず、来月の100日連続毎日更新を次の目標に頑張ろう。
それが済んだらWordPressに移行したいけどね。

Segue実行の可否を判断

というかSegueは「実行する」という表現でいいものか。
cellをタップして画面遷移する際、中の設定値により遷移していいか判断する処理。

//Segue実行可否
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier
                                  sender:(id)sender{
    
    UITableViewCell *cell = sender;
    UITextField *cellTextField = (UITextField*)[cell viewWithTag:2];
   
    if ([cellTextField.text isEqualToString:@""]){
        LOG_CURRENT_LINE(@"%d", NO);
        return NO;
    }else{
        LOG_CURRENT_LINE(@"%d", YES);
        return YES;
    }
}

2014年6月15日日曜日

ナビゲーションバーへのボタン追加

ナビバーの右端にボタンを追加する場合。

    UIBarButtonItem* button = [[UIBarButtonItem alloc]
                               initWithTitle:@"Edit"
                               style:UIBarButtonItemStylePlain
                               target:self
                               action:nil];
    
    self.navigationItem.rightBarButtonItem = button;


複数ボタンを追加したい場合、rightBarButtonItemsに配列で設定可能。

2014年6月14日土曜日

@から始まる表現(コンパイラディレクティブ)の入力補完

こんなんあるんだね。
@入力したら出てきた。


ArrayとDictionaryの初期化はたまに使うけれど。

この入力補完昔はなかったよねえ?
気づいてなかっただけだったらアホす(´・ω・`)

2014年6月13日金曜日

SyntaxHighlighterの設置手順

書くことねえ!
書くことねえってことはアプリの開発を怠って酒ばっか飲んでいるということだ!
書くことないので、遡ってブログのSyntaxHighlighterの設置手順をば。

参考・Bloggerでの手順
http://naichilab.blogspot.jp/2013/04/blogger-syntax-highlighter.html


① 対象の言語選択選んでDL
  http://www.way2blogging.org/widget-generators/syntax-highlighter-scripts-generator

② お好みの配色を選ぶ
  http://alexgorbatchev.com/SyntaxHighlighter/manual/themes/

③ ちょっとカスタマイズ
  http://wada811.blogspot.com/2012/02/bloggersyntaxhighlighter.html

④ Bloggerでの参照設定
  http://naichilab.blogspot.jp/2013/04/blogger-syntax-highlighter.html

⑤ 投稿。指定のタグで囲む。
  <pre class="brush: objc">
     ここに任意のソースコード
  </pre>

なお、指定タグは都度コピペするの面倒なので、
「タグ」の変換候補に各環境で登録しておくと便利。

2014年6月12日木曜日

2chまとめリーダー「2chBuzz」がリリースされました









えー、リジェクト14回、1年半にも渡る永き戦いを終え、ついに。

拙作、2chまとめリーダー「2chBuzz」がリリースされました。

・・・リリースされんじゃねーかよ!諦めてたよ!なんなんだよ!
なにがなんでもリリースさせない感を感じていたけど(レビュー文から)
やっぱり審査基準変わるのかね?定期的に審査投げてたらついに通った。

いやーつかれました。
でもこれからサーバー側改善せんと。

2014年6月11日水曜日

reverseGeocodeLocationでエラー「Error Domain=kCLErrorDomain Code=8 "The operation couldn’t be completed. (kCLErrorDomain error 8.)"」

reverseGeocodeLocationでエラーになった。

Error Domain=kCLErrorDomain Code=8 "The operation couldn’t be completed. (kCLErrorDomain error 8.)"

原因は、渡したlocationがNilだったため。
    _locationManager.delegate = self;
    [_locationManager startUpdatingLocation];
とかするの忘れてたze。

[_geocoder reverseGeocodeLocation:_locationManager.location
                        completionHandler:^(NSArray *placemarks, NSError *error) {
                            
                            if (error) {
                                //こっちに落ちて取得できない
                                LOG_CURRENT_LINE(@"%@", error);
                            } else {
                                if (0 < [placemarks count]) {
                                    CLPlacemark *p = [placemarks objectAtIndex:0];    
                                    //いろいろやる


                                }else{
                                    LOG_CURRENT_LINE(@"(取得できませんでした)");
                                }
                            }
                        }];

2014年6月10日火曜日

Google News APIについて調べ中。






ニュースリーダー作成中につき、調査中。

ニュース検索の方法
http://www.crystal-creation.com/web-app/tech/web-api/google/search/news/#rss-feed
→ 結果はRSS(xml)で取得

ニュース検索のジャンルのオプション
http://www.crystal-creation.com/web-app/tech/web-api/google/search/news/parameter.htm

ニュース検索のオプション詳細(非公式)
blog.slashpoundbang.com/post/12975232033/google-news-search-parameters-the-missing-manual
→ 取得件数・ソートの制御可能な模様。

ついでにGoogleトレンド
http://www.crystal-creation.com/web-app/tech/search-engine/google/trend/
→ ・・・廃止済みのようだ。リンク先404。

商用利用可能か調べた方がよさそうな。
クレジット表記のみで大丈夫だといいけれど。



2014年6月9日月曜日

validate時のエラー「Code Sign error: No codesigning identities found 〜」

またもや審査Up時にエラー。

Code Sign error: No codesigning identities found: No codesigning identities (i.e. certificate and private key pairs) that match the provisioning profile specified in your build settings (“SSSCam”) were found.

まあコードサインが一致しませんですよ、って話なんだけどどこ確認しても間違ってない。
itunesconnectでアプリのID確認してDistributionプロファイル確認して、
プロジェクトの設定見なおしても治らない。

四時間かかって発狂したあたりで気分転換にPC再起動してもう一度itunesconnect確認したら、
・・・provisioningとかいろいろできてなかった。てか消えてた?
全部作り直して解決。

なんで消えたか全く分からん。Firefoxでやってたんだけどなんか変にキャッシュされたんだろうか?
次からは念の為にsafari使うようにしよう・・・。回避できるか分からないけど。

2014年6月8日日曜日

NSDataからNSStringへの変換

最初エラー出してしまった。
init alloc がnewでかけるようになったから間違ってしまった。

誤った方
                NSString *xmlStr = [[NSString new] initWithData:data
                                                         encoding:NSUTF8StringEncoding];
エラーログ
[__NSCFConstantString initWithBytes:length:encoding:]: unrecognized selector sent to instance 0x3ab93320

正しい方
                NSString *xmlStr = [[NSString alloc] initWithData:data
                                                         encoding:NSUTF8StringEncoding];

2014年6月7日土曜日

アプリ審査に関する雑記。

SSS Camという静音カメラアプリの審査リジェクトに関してちょいと不思議なことが。

最初は普通に審査リジェクトされていたんだけど、
(音が全く出ないのはダメってことで)
3回目の審査中にInReviewのまま、リジェクトされず審査チームから電話がかかってきた。

で珍しく個々の機能について、「これは駄目」「ここはこう変えて」と指摘された。
修正して再UPしてほしいとのこと。

うーむ、なんでいつも通り文面で返してこないのだろうか。
なにか文面にするとまずいのかと勘ぐってしまう。

2014年6月6日金曜日

起動直後に「Terminating app due to uncaught exception 'NSUnknownKeyException'」

アプリ起動直後に即死、
エラーメッセージは「Terminating app due to uncaught exception 'NSUnknownKeyException'」。

自分の場合の原因は、前回記事のコピペしたクラスに存在しないIBOutletをStoryBoardが参照していたため。

NSUnknownKeyExceptionって、「不明なキーで例外発生した(´・ω・`)」って意味だが分かりづらいな。
まあなんでも文字列キーで紐付けてるからそうっちゃそうだろけど。

2014年6月5日木曜日

ビルドエラー「linker command failed with exit code 1」

・・・何回おんなじビルドエラーでググっているんだ。
しかも前これブログ書いてないかいな。

類似のクラスを作成するため、ソースコード(.h、.m)をコピー。
リネームしてプロジェクトに追加。

で、ビルドするとエラー「linker command failed with exit code 1」。
なにやら、「duplicate symbol _contentsType 」と言われている。

要するに、元々のクラス内で適当に作成した変数がグローバルになってしまっていて、
バッティングしてしまったらしい。大量に。あほす。

新しく作った側の変数をリネームしまくって対応完了。


2014年6月4日水曜日

アプリ審査「Your app requires additional review time」だそうな

アプリの審査がIn Reviewになったまま、5日が経過。

審査完了(NGかもだが)メールがスパム扱いで拾えてないだけかと思ったがそんなこともなく。
そわそわしていたらメール来た。

"Your app requires additional review time"
 We are currently reviewing an app that you submitted for inclusion on the App Store, and want to let you know that the review process will require additional time. We apologize for the delay and will provide you with an update on the status of your app as soon as possible.

もうちょっとだけ続くんじゃみたいな話しか。
珍しい。課金でちょっと調子こいた値段にしてるからかな?

2014年6月3日火曜日

Git管理下からコピーして新しいプロジェクトを作成(svn export的な)

Git管理にあるフォルダを管理外してコピーする方法。
コピー新規で新しいプロジェクト作るのに使用。 
 
$ git checkout-index -a -f --prefix=export/
 
実行したフォルダにexportフォルダが作成され、中にコピーされる。 
好きにリネームして、またgit initで管理追加。
 
あと git archiveってすると固めた状態で出力できるみたい。
 
 
<参考>
gitでsvn export的なことをやる

2014年6月2日月曜日

ループ中でのreverseGeocodeLocationはできない模様


assetsを取得して中身全部なめて座標データから地名取得して配列にぶっこみたい。
で、実行すると全部ループ回りきったあとにreverseGeocodeLocationが一回だけ実行される。
(´・ω・`)

基本的にやりたかったことは以下↓

    for (ALAsset* asset in self.photos) {
        
        ALAssetRepresentation *representation = [asset defaultRepresentation];
        NSURL *url = [representation url];
        
        LOG_CURRENT_LINE(@"%@", url);
        
        CLLocation *location = (CLLocation *)[asset valueForProperty:ALAssetPropertyLocation];
        
        // 逆ジオコーディングの開始
        [_geocoder reverseGeocodeLocation:location
                        completionHandler:^(NSArray *placemarks, NSError *error) {
                          
                            LOG_CURRENT_LINE(@"ここがどう頑張っても先頭の一回しか実行されない");
                            
            if (error) {
                
                LOG_CURRENT_LINE(@"%@", error);
                
            } else {
                if (0 < [placemarks count]) {
                    
                    // ログ出力
                    LOG_CURRENT_LINE(@"%@", url);
                    CLPlacemark *p = [placemarks objectAtIndex:0];
                    
                    NSString *country = [p.addressDictionary objectForKey:@"Country"];
                    NSString *state = [p.addressDictionary objectForKey:@"State"];
                    
                    [_stateMuDic setObject:state
                                    forKey:state];
                    
                    LOG_CURRENT_LINE(@"%@", _stateMuDic);
                    
                }else{
                    
                    LOG_CURRENT_LINE(@"(取得できませんでした)");
                }
            }
        }];
        
        cnt++;
    }



途中にdispatch_semaphore_waitとか挟んでむりやり同期する方法もためしたけどうまくいかず。

でstackoverflowで調べてみたらやっぱ同じことしてる人いた。
reverseGeocodeLocation Only Executes Completion Block Once
→ (`・ω・´)短いスパンで呼び出してはダメってAppleのドキュメントにかいてあるよ

・・・だそうな。えええええぇぇぇぇぇぇぇ・・・・・。
げ、原文読むのしんどい。

2014年6月1日日曜日

Objective-Cにおける非同期処理についてちょいと調べた

まあ例によってまだ良くわかってないので調べ中なんですけど。
非同期処理を実装したい場合の方法について。
(厳密な用語として「非同期処理」と括っていいのかわからないけど、
「A処理の実行結果が取得された後にB処理を実行したい」というケース想定)

① dispatch_queueを使用する

dispatch_queue_createの第一引数は任意の文字列(const char)。
他の処理と重複してはいけないのかと最初思ったが、そうでもないようだ。

<参考>
http://fernweh.jp/b/grandcentraldispatch/
http://objective-audio.jp/2009/09/grand-central-dispatch-queue.html

dispatch_queue_t sub_queue = dispatch_queue_create("com.nadegiri.development", 0);
dispatch_async(sub_queue, ^{
    //実行したい処理
    [self hoge];
});

② NSNotificationを使用する

こっちの方がブロック構文とかなくて簡潔かなあ。

<参考>
http://qiita.com/EntreGulss/items/0fbfa1b75eebf075da4d


んで。
結局まだ問題解決してないんですけどね。
「ループ中で非同期処理を実行しても最初の一回しか実行されない」という。
やれやれ。難しいなあ・・・。

2014年5月31日土曜日

画像関係の用語の整理(UIImage、NSImage、CGImage、CGImageRef)



整理できてないけどね。

画像関係でいろいろなFW・クラスが登場するので軽く情報収集。
まあよくわかりませんな。iOSはほんと内部でFWがバラバラなのでわけわからん。
自分がよくわかってないだけで実は非常に合理的な設計だったりするんだろうか。




【UIImage】
 Framework /System/Library/Frameworks/UIKit.framework https://developer.apple.com/library/ios/documentation/uikit/reference/UIImage_Class/Reference/Reference.html
A UIImage object is a high-level way to display image data. Image objects are immutable, so you cannot change their properties after creation.

【NSImage】
 macで使うものでiOSでは使わないんじゃね?
Framework /System/Library/Frameworks/AppKit.framework
 The NSImage class is a high-level interface for manipulating image data. You use instances of this class to load existing images, create new images, and draw the resulting image data into your views. Although you use this class predominantly for image-related operations, the class itself knows little about the underlying image data. Instead, it works in conjunction with one or more image representation objects (subclasses of NSImageRep) to manage and render the image data. For the most part, these interactions are transparent. 
NSImageクラスはは画像データ操作の高度なインタフェースです。 このクラスのインスタンスを画像の読み込みや新規作成や描画結果のviewへの書き込みに使えます。 このクラスは画像に関わる操作に圧倒的ですが、画像データの基礎知識に乏しいです? サブクラスのNSImageRepあるからそっち使ってね。 イミフ。

【CGImage】
  Framework ApplicationServices/ApplicationServices.h https://developer.apple.com/library/ios/documentation/graphicsimaging/Reference/CGImage/Reference/reference.html
The CGImageRef opaque type represents bitmap images and bitmap image masks, based on sample data that you supply.
 CGImageRef 不透明型は あなたの提供した ビットマップ画像やビットマップ画像マスク を 表す CGImageはCGImageRefだよ、でいいのか

【CGImageRef】
An opaque type that encapsulates bitmap image information 
「ビットマップ画像情報を内包した不透明型です」
ヘッダで定義したフォーマットの型をOpaqueにして構造体定義を実装側によせると直しやすいよ!ということらしい
http://d.hatena.ne.jp/white_wheels/20110817/p3


後半に続く

2014年5月30日金曜日

緯度経度から地名を取得する

・・・でググってもMKReverseGeocoder使う方法ばっかり出て来て困った。
 
MKReverseGeocoderはdeprecated扱いで、
CoreLocationのCLGeocoderを使用すればよいみたい。
(MKReverseGeocoderはグーグルマップ使ってみたいですね)


        CLGeocoder *geocoder = [CLGeocoder new];

        [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
            if (error) {
                LOG_CURRENT_LINE(@"%@", error);
            } else {
                if (0 < [placemarks count]) {
                    
                    // ログ出力
                    CLPlacemark *p = [placemarks objectAtIndex:0];
                    
                    NSString *country = [p.addressDictionary objectForKey:@"Country"];
                    NSString *countryCode = [p.addressDictionary objectForKey:@"CountryCode"];
                    NSString *name = [p.addressDictionary objectForKey:@"Name"];
                    NSString *state = [p.addressDictionary objectForKey:@"State"];
                    NSString *street = [p.addressDictionary objectForKey:@"Street"];
                    NSString *thoroughfare = [p.addressDictionary objectForKey:@"Thoroughfare"];
                    
                    cellLabel.text = street;
                    
                }else{
                    
                    LOG_CURRENT_LINE(@"(取得できませんでした)");
                    cellLabel.text = @"(取得できませんでした)";
                }
            }
        }];

       

2014年5月29日木曜日

StoryBoardの警告「Unsupported Configuration: Prototype table cells must have reuse identifiers」

StoryBoardで3つのtableviewを持つ画面を設計したら警告出た。

「Unsupported Configuration: Prototype table cells must have reuse identifiers」

なにかというと、それぞれのtableViewCellにユニークなidentifierを設定していないため。

ちゃんと設定しなおせば消える。
間違ったままだと当然、cellが呼び出せないのでアプリ起動時にまっちろなセルが表示されることになる。

<参考>
Xcodo Unsupported Configuration…エラーの原因と解決方法

2014年5月28日水曜日

審査NG「10.6: Apple and our customers place a high value on simple, refined, creative, well thought through interfaces.」で食い下がった結果

2chBuzzってまとめブログリーダーの件なんですけど。

リジェクト理由が以下。
10.6: Apple and our customers place a high value on simple, refined, creative, well thought through interfaces. They take more work but are worth it. Apple sets a high bar. If your user interface is complex or less than very good it may be rejected Thank you for your reply.

なるほど分からん。のでResolution Centerで食い下がった結果。
(以下の自分の質問は中学英語で。)

自分)よく分からん。具体的によろしく。
林檎)Your app does not contain any native iOS features, rather, a collection of web views. 
   It maybe appropriate to add native iOS features to your app and resubmit a new binary.
   (WEB表示するだけのアプリとかあかんで)

自分)確認したいんだけど、アプリのコンセプトは問題ないよね?
   カテゴリ分けしてるし人気順にソートしてるし十分機能的で便利だよ。
林檎) We are not able provide feedback on app concepts or features
   (アプリのコンセプトに関しては回答不能やで)

自分) UIが悪いってこと?
林檎)It would be appropriate to remove all pornographic content from your app and resubmit a new binary.
   (エロ削除しろや)

最初っからそう言えよ・・・一年前は同様の指摘の場合、画面のSS添えてこのURLだめっすよみたいな具体的な指摘だったんだが。

案の定、審査担当者か審査基準が変わっているような。

2014年5月27日火曜日

丸いUIButton(UIView)を作成する

ボタンの枠の設定する方法。
枠ないのがiOS7の基本だけど、あったほうがわかりやすい場面も多い。はず。

正方形のボタンに対して、辺の半分の値をcornarRadiusに設定すると円にできる。


//角丸の半径を設定 
twitterButton.layer.cornerRadius = 20.0f

//枠線の色
twitterButton.layer.borderColor = [[UIColor whiteColor] CGColor];

//枠線の幅 
twitterButton.layer.borderWidth = 1.5f; 


<参考>
開発初心者の為のCALayerチュートリアル

2014年5月26日月曜日

ブロック構文のエラー『Incompatible block pointer types・・・』

ブロック構文の記述でエラーメッセージ。
・・・まあ、例によってコピペしてきたら動かなかったわけですけども。

Incompatible block pointer types initializing 'void (^__strong)(struct ALAssetsGroup *, BOOL *)' with an expression of type 'void (^)(ALAssetsGroup *__strong, BOOL *)'

型が不正、という指摘なのだが・・・
structを外してしまえばエラーは消えるけれど、それで正常に動くかはまた当然別問題で。

他の皆様の解決方法は、
http://stackoverflow.com/questions/6944033/incompatible-block-pointer-types-initializing-voidstruct-alassetsgroup-b

・・・やっぱstruct外しただけか。不安だなー。

2014年5月25日日曜日

Storyboardでnavigationをもつ画面のつなぎ方

久々に嵌った。Storyboard発案者は可及的しめやかに爆散すべき。

c(`Д´と⌒c)つ彡 ヤダヤダ

navigationをもつViewをStoryboardでデザインしていて、
(tableViewのセル選択で次のtableViewへ遷移)
つなぎ方誤ってエラーになった。

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Push segues can only be used when the source controller is managed by an instance of UINavigationController.'

間違ってやったやり方はこう。
(tableViewの間にnavigation挟んでた)









んで、正しいやり方がこう。
(頭にnavigationを挿入)










こういう勘違いをするあたり、自分の公式リファレンスの読み込みの足らなさを自覚。
でも、動かなくなるようなデザインの仕方を許容しないようにしてほしい。Storyboard。

2014年5月24日土曜日

今更ながら、アプリ審査が厳しすぎると思う件

泣き言である。
今日現在、2件のアプリが初回の審査でリジェクトされてリリースできないでいる。

ひとつは、静音カメラの「SSS Cam」。現状のリジェクト理由は、

PLA 3.3.8

We found that your app auto-disables the shutter sound of the camera when a photo is taken, which does not comply with the iOS Developer Program License Agreement:

Section 3.3.8: Any form of user or device data collection, or image, picture or voice capture or recording (collectively "Recordings"), and any form of data, content or information collection, processing, maintenance, uploading, syncing, storage, transmission, sharing, disclosure or use performed by, through or in connection with Your Application must comply with all applicable privacy laws and regulations as well as any related Program Requirements, including but not limited to any notice or consent requirements. In particular, a reasonably conspicuous audio, visual or other indicator must be displayed to the user as part of the Application to indicate that a Recording is taking place.

Specifically, apps are not allowed to mute the camera shutter sounds via in app settings. This is only permissible via the iOS Settings or the slider on the side of the device.

要するに、「シャッター音は鳴らないとだめだよ。」「iOSの設定か端末のスイッチで無効にする以外だめだよ。」という。
・・・いや、他所のアプリで静音カメラなんぞ大量にあるじゃないか。


もうひとつは、2chまとめリーダーの「2chBuzz」。
一年前に作成したもののアプリ審査で12回程蹴られて一度諦めたが、
今月ダメ元で審査にアップロードしてみた。審査担当者とか審査基準変わってる可能性あるし。

で今回のリジェクト理由は、
 We found the following issues with the user interface of your app:

Did not include iOS features. For example, it would be appropriate to use native iOS buttons and iOS features other than just web views, Push Notifications, or sharing.

These examples identify types of issues discovered in your app but may not represent all such issues. It would be appropriate to thoroughly evaluate your app to address these types of issues.


・・・UIがヘボいということか?
前回12回とリジェクト理由変わってんじゃねーか。
(前回は、「いかがわしいサイトを含むな」「単なる固定RSSフィードリーダーはダメだ」など)


審査が厳しいのはまあいい。
ただ、「修正しても理由を変えて審査NG」「他所のアプリと同じ機能でも審査NG」は
本当にかんべんして欲しい。理不尽だ。

2014年5月23日金曜日

退職後の年金・健康保険手続きまとめ。

一応、独立(個人事業主でエンジニア)を目指し退職したので、
備忘も兼ねて、手続き関係軽くまとめ。

① 健康保険

国民健康保険に新たに加入するか、元の会社の健康保険を任意継続するか選べますが、
試算したところ金額変わらなかったのでとりあえず任意継続。
あとから国保にするのは簡単だけど、任意継続は今のタイミングでしかできないので
迷ったら任意継続しとくとよろしいそうな。

任意継続の申請を郵送すると、書留で新しい健康保険証と納付書が送られてくる。
初回の納付期限は発送から10日後くらいだった。
自分のような「任意継続したいんだけど退職翌日から長期旅行しちゃうぜ」って人は
申請を郵送するタイミングを考慮してないと、書留が受け取れなくてまずい。

② 国民年金

居住市の国民年金課で、厚生年金から切り替え(というか国民年金への加入)の手続き。
印鑑と年金手帳と離職票持っていく。
離職票じゃなくて「退職日時が分かる書類」ならなんでもいいみたいなんだけど
(自分も会社発行の退職証明書を持っていった。コピーだけ提出した。)
「離職票持ってきたら、無職期間の納付免除とか後納とかできる場合があります」
と教えてくれた。
・・・けど持って行ってなかったのと、納付記録ややこしくなると信用できないなんかアレなので普通に納付。損したかも。
実際の納付に関しては後日納付書郵送されるとのこと。引き落としにしよう。

あと、過去に年金の未納分がある(前々職に就く前)のだけれど、年金事務所に後納申し込みを郵送した。
けど、市の窓口でもできたかもな。二度手間だったか。


あとは、税務署への開業届の提出だけか。
無職といえど、案外忙しいもんだ。

2014年5月22日木曜日

MacBook Proを外部ディスプレイのみで使用する(クラムシェルモード)

MacBook Pro、15インチあるとはいえ開発環境を使うには広いディプレイのほうがいいですよね。

で外部ディスプレイつなぐわけですが、
そのままデュアルでも使えますが、大きさ違うのも使いづらいので
ノートのディスプレイを無効にして外部のみ使用したいと思います。

方法としては「MacBookのディスプレイ閉じる」だけなんですけど、
そうするとキーボード側から放熱できないので嫌だ。と。
んじゃあ、「ディスプレイ閉じてると認識させる」ようにする方法ですが、
パームレストに磁石おくといいようです。

置き場所は機種によって違うそうな。
MacBook Pro 2008 late では以下のとおりです。
(見づらいですけど。)


2014年5月21日水曜日

自作アプリ「半角カタカナ」を更新しました。





<<紹介ページ>>
http://nadegiri.blogspot.jp/p/blog-page.html


2年前のGWにつくったやつですけどね。
久々に更新しました。今更iOS7対応など。

やはり無料且つ広告なしなだけあって好評です。
大したものじゃないんですが需要あるんですねー。33,000 DLくらいですよ現在。

てか、更新内容に「無職になったよ☆(ゝω・)vキャピ」て書いたら
 『お仕事探し頑張って!!』『良い仕事見つかるといいですね!』とか
星5評価いっぱいついてて・・・つらい!

ありがとうございます、お陰で巴術士の仕事見つかりました。

・・・W杯終わるまでは仕事しないんじゃないかな。

2014年5月20日火曜日

文字列定数はどこに定義すべきか?

最初の頃はかなり悩んだんですけど。文字列定数を定義する場所。
オレオレ開発方式で見出した方法は以下の通り。

① 画面の表示文言・メッセージ文言などUI系
  → Localizable.strings に定義。
    ローカライズすることを前提に最初っからここに作成する。
    これはもう一択かな。

② ハッシュのキーなどにする定数など
  → クラス内で使うならクラスの先頭に適当。
    最初は抵抗あったけど、#defineで。
    constつかう場合と本当はどっちがいいか検討したい。
    でもAppleの組み込みクラスでも#defineガンガン使ってるからいいんでねえかな。

③ 自作Utilクラスなど、インポートさせた先で参照したい定数など
  → 「extern NSString* const」を使用。
    インポートされた場合、インポートした先から参照可能になる。
    ヘッダと本体でそれぞれ定義いるから面倒だけど。

//hoge.h

extern NSString* const ext_str;


//hoge.m

NSString* const ext_str = @"hoge";



こんなところだろうか。

2014年5月19日月曜日

iPhoneシミュレータのスクリーンショットの撮り方

例によってAppStoreにアップロードするようのSSの撮り方なんですけど。

昨日は急いでたのでちゃんと調べないで、適当に撮って枠切り詰めてサイズ合わせてたんですけど手間すぎ。
で、正しい(?)やり方です。

1.ツールいらないやり方

  慣れたらすぐできるからそんな手間じゃない。
  ① ctrl + cmd + c で撮影(クリップボードへ保存)
  ② 「プレビュー」を起動してctrl + n で「クリップボードから新規作成」を実行
  ③ 適宜保存

2.ツール使うやり方

  iOS-Simulator Cropper
  ステータスバーをトリムするか、とか
  シミュレータの皮の部分は要るか、とかいろいろ設定可能。


今後はCropper使おう。
昔ちょっと使ってたけど、OS入れなおしてから入れるの忘れてたZE。


2014年5月18日日曜日

UIColor生成ツール「UIcolor Code Generator」







UIColorをピッカーで生成するツール。

UIcolor Code Generator

UIColor * color = [UIColor colorWithRed:0/255.0f green:66/255.0f blue:153/255.0f alpha:1.0f]; 



2014年5月17日土曜日

appname-Prefix.pchに定義しておくと便利なデバッグマクロ

デバッグのログ関数とかいちいち書くの面倒なので。
appname-Prefix.pchにいつも最初に定義しておくと楽です。

//ログ 関数名・行数の表示
#ifdef DEBUG
#   define LOG_CURRENT_LINE(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#   define LOG_CURRENT_LINE(...)
#endif

//ログ 変数の表示
#ifdef DEBUG
#   define LOG_V(var) NSLog(@"%s=%@", #var, var)
#   define LOG_I(var) NSLog(@"%s=%d", #var, var)
#   define LOG_F(var) NSLog(@"%s=%f", #var, var)
#   define LOG_B(var) NSLog(@"%s=%@", #var, var ? @"YES":@"NO" )
#else
#   define LOG_V(var)
#   define LOG_I(var)
#   define LOG_F(var)
#   define LOG_B(var)
#endif

iPhoneシミュレーターでの日本語フォントの設定

Xcode付属のiPhoneシミュレータでAppStore用のSS撮ったりするわけですけど、
なんかフォントおかしいわけですよ。

それの直し方なんですけど。
シミュレータの言語設定で、デフォルト英語のところを日本語に変更します。
下記SS参考に順に選択です。
てか英語設定でも自動できれいなフォントにしてくれんかね。




2014年5月16日金曜日

UITabBarItemのTintColorを変更する

調べるにの案外時間かかってしまった。
UITabBarItemのTintではなく、UITabBarのselectedImageTintだそうだ。
うん、わからん。

[[UITabBar appearance] setSelectedImageTintColor:[UIColor redColor]];



2014年5月15日木曜日

UITexeViewで入力文字数を取得する

デリゲートの設定をお忘れなく。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range  replacementText:(NSString *)text {

    countLabel.text = [NSString stringWithFormat:@"%d文字", (int)textView.text.length];
    
    return YES;
}





最初に半角カタカナ変換アプリ作った時、デリゲートを理解していなくてこれすら実装できなかったという・・・。

2014年5月14日水曜日

” valid provisioning profile for this executable was not found.”のエラー

実機実行時に
” valid provisioning profile for this executable was not found.”
とエラーになってしまい起動できなくなった。

文字通りprovisioningに設定するものが間違っているとの指摘だけど、
見なおしても何もおかしくない。はて。

という場合、Run時に適用するschemeで、標準のDebugではなくReleaseを適用するようになっていたため、
確認すべきところを間違っていた・・・。というオチだった。

Releaseで動作確認して、審査でprovisioning変更して、それっきりだったからなー。

2014年5月13日火曜日

iOSアプリの多言語対応

多言語対応をする場合、効率的な作業手順は

① 文字列定数のLocalizableファイルへの切り出し
② プロジェクト設定から、ローカライズ
③ Localizableファイル、xibファイルの各言語毎の翻訳(文字列の置き換え)
 
実際やってみたところ、とにかく弄るファイルが増えるので、
・「xibファイルが増えるととにかく面倒なのでできるだけ翻訳対象から外す」

・「できるだけアプリが完成に近づいてから多言語対応する」
ってのがポイントだろうか。

(参考)
Xcode 5でアプリを多言語対応するまでの全スクリーンショット

各環境で試験するには、
多言語対応した iPhoneアプリを各言語環境で簡単にデバッグする方法

2014年5月12日月曜日

AVCaptureDeviceを使用したカメラアプリでのズームの実装

標準のカメラアプリ同様、スライダーでのズームを実装した。

- (IBAction)setZoom:(id)sender{
   
    AVCaptureDevice* videoCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
   
    NSError* error = nil;
    if ([videoCaptureDevice lockForConfiguration:&error]) {
       
        [videoCaptureDevice rampToVideoZoomFactor:_slider.value    //UISlider
                                                                 withRate:5.0];               //ズーム速度
       
        [videoCaptureDevice unlockForConfiguration];
    } else {
        NSLog(@"%s|[ERROR] %@", __PRETTY_FUNCTION__, error);
    }
}

2014年5月11日日曜日

iOS端末上に隠しファイルを保存する(Objective-C)

「Objective-C」「隠しファイル」で検索しても全然ヒットしなかったのでタイトルにがっつりキーワードを埋めていくスタイル。

結局やり方は簡単で、Macと同じなんだけれど。

ファイル名の先頭に『.』(ドット)を付与することで、隠しファイルにできる。

開発中のカメラアプリで、設定ファイルのplistをDocumentフォルダ下に保存しているのだけれど、
同じフォルダに撮影した画像を保存する場合がある(ユーザーが覗く可能性がある)ため、
設定ファイルを誤って消されたり壊されたりされないために設定した。

iExplorerで確認した限り、うまくいっているようだ。
また、MacにDocumentフォルダを移動してきても、隠しファイルになっていた(そりゃそうだ)

2014年5月10日土曜日

iOSデバイスの本体の向きの取得、画像ファイルへの設定方法

カメラアプリを作成していて、やたらめったら嵌ったためまとめ。
縦向き・横向きでもきちんと本体向きを維持して画像を保存したかったが難儀した。
デバイスの回転がロックされている場合、簡単には向きが取得できなかった。

・・・なんかデバイスの向きとUIの向きとカメラの向き別らしいんすよ。

デバイスの向きの取得方法

案① 普通にデバイス情報から取得

※回転ロック時は検知できない
   デバイスの向きの設定と取得の方法

案② Notificationを使用して検知・通知

※回転ロック時は検知できない
   iPhone, iPadの画面の向きを検出する方法まとめ
   UIDeviceOrientationからAVCaptureVideoOrientationを決める

案③ モーションセンサーを使って取得する

MotionOrientation
  多分これが一番確実だと思います(棒
  本体の回転角度からどの向きになっているか取得するライブラリ。
  Apache Licence2.0だそうです。
  実際に取り込んでみて、回転ロック時・非ロック時に期待の挙動となることを確認できました。
  

画像ファイルへの設定方法

以下を参考に、Exif情報に向きを付与します。
iPhoneやiPadで撮影した画像を他のデバイスで見ると自動で回転してしまう場合の対処法



Exif情報の扱いは過去記事参照で。

switch (orientation) {
        case UIDeviceOrientationPortrait:
            LOG_I(UIDeviceOrientationPortrait);
            [metadataAsMutable setObject:[NSNumber numberWithInt:1]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            LOG_I(UIDeviceOrientationPortraitUpsideDown);
            [metadataAsMutable setObject:[NSNumber numberWithInt:3]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        case UIDeviceOrientationLandscapeLeft:
            LOG_I(UIDeviceOrientationLandscapeLeft);
            [metadataAsMutable setObject:[NSNumber numberWithInt:8]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        case UIDeviceOrientationLandscapeRight:
            LOG_I(UIDeviceOrientationLandscapeRight);
            [metadataAsMutable setObject:[NSNumber numberWithInt:6]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        default:
            LOG_I(orientation);
            break;
    }