Hatena::Groupiphone-dev

iOS プログラミングメモ

2013-05-31 (Fri)

CocoaPods とワークスペース 18:07  CocoaPods とワークスペース - iOS プログラミングメモ を含むブックマーク

CocoaPods で pod install するとワークスペースができますのですよ。

でまあ 第4回 iphone_dev_jp 勉強会 の時の懇親会のあとの飲み会の時にちょっとした CocoaPods の話になって「CocoaPods 使ってないのもったいなすぎワロタ」って言われた時に、「ワークスペースとか使ったことないし良くわかんない謎システムだから怖い」って感じで話したくらいにはワークスペースというやつに縁がないので、CocoaPods とワークスペースの関係について調べてみます。

ワークスペースって何者

まず Xcode のワークスペースなんですが、no title に完結に書いてありました。

  • 複数のプロジェクトを一つのwindowで開ける
  • そのビルド結果をworkspace内で参照し合える
  • 他のプロジェクトを参照した場合、ビルド時にそのプロジェクトもビルドし直してくれる
no title

これも同じことかな。

  • If one project depends on the products of another in the same workspace, Xcode can detect this and automatically build the projects in the correct sequence.
  • Because all the files in one project are visible to all the other projects in the workspace, you don’t need to copy shared libraries into each project folder separately.
Create a Workspace to Work with Multiple Related Projects

Apple による Xcode の紹介のところにもちらっと書いてある。

Xcodeのワークスペースの特長は、デベロッパの集中を維持させることです。

Xcode - Apple Developer

新しくワークスペースを作ったら空っぽの画面なので、なんなんだろうと思っていたのですが、xcodeproj をドラッグ&ドロップするとそのプロジェクトがワークスペースに入る。でもって複数のプロジェクト間で参照しあえると。

CocoaPods ではどうなっているか

pod install すると、単純に既存のプロジェクトにライブラリ群がそのまま追加されるんだと思いきや、これがもう全然違う。違い過ぎてビビる。pod install すると新しく Pods ていうディレクトリを作ってくれて、その中に Pods.xcodeproj ていうプロジェクトが自動で作られる。ライブラリはそん中に入るわけ。

で、既存のプロジェクトとの橋渡しにワークスペースが活用されると。うひゃー、すごいな。

Pods プロジェクトは、Podfile に書いたライブラリを使えるようにした libPods.a ていうバイナリをビルドすることができる。既存のプロジェクトはその libPods.a に静的リンク(でいいんだっけ?)されているので、Podfile に書いたライブラリが自由に使えるようになると。

既存のプロジェクトにはライブラリのヘッダファイルとかは追加されなかったり、libPods.a のパスがワークスペースから開いた時と違うので単体でビルドしたい場合はちょっと工夫が必要そうに見える。けど特にそのようなことをする必要はないか。

(追記)

ちょっとだけ間違っていました。既存のプロジェクトへの変更は、libPods.a のリンク追加以外に Pods.xcconfig ていうファイルが追加されていた。このファイルの中に、Pods でインストールしたライブラリのヘッダファイルへのパスが書いてあって、そのお陰で import できるようになってるみたい。これはいいね。

git について

話は変わるけど、CocoaPods でインストールしたファイルってリポジトリに入れない方がいいんですよね。

→ 岸川神が教えてくれました!

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20130531

2013-05-29 (Wed)

ついに CocoaPods 使い始めた 21:20  ついに CocoaPods 使い始めた - iOS プログラミングメモ を含むブックマーク

この前の 第4回 iphone_dev_jp 勉強会 の時の懇親会のあとの飲み会の時にちょっとした CocoaPods の話になって「CocoaPods 使ってないのもったいなすぎワロタ」って感じだった。

なんていうかまあそんなにアプリを作りまくるわけじゃないし、普通にファイル持ってきて置くだけで動くし困ってないから良かったんだけど、CocoaPods を使うと Framework とか自動で設定してくれるらしくてなかなか感銘を受けたのでせっかくだし手を出してみようと思いました。

RubyGems で提供されているらしいので、コマンドラインから簡単にインストールできる。コマンド打ったあと5分くらい反応がないかも。なんか時間かかった。

$ gem install cocoapods
Building native extensions.  This could take a while...

.....

Successfully installed cocoapods-0.20.2
19 gems installed
Installing ri documentation for i18n-0.6.1...
Installing ri documentation for multi_json-1.7.4...
Installing ri documentation for activesupport-3.2.13...

unrecognized option `--encoding'

For help on options, try 'rdoc --help'

なんかエラーが出た。Mac に含まれている rdoc のバージョンが古いんだろうなきっと。ドキュメントはいらんので、-d オプションをつけてもう一度やってみたら正常終了した。

$ gem install -d cocoapods

インストールした後にセットアップを実行するらしい。

$ pod setup
Setting up CocoaPods master repo
Setup completed (read-only access)

なんかいっぱい入ってきた!!

$ ls ~/.cocoapods/master/
.git/       Emoticonizer/ MLPAutoCompleteTextField/ SMAccessibilityOverlay/
.gitignore  ErnKit/       MLPSpotlight/             SMCalloutView/
.travis.yml ErrorKit/     MLScreenshot/             SMGridView/
.....

ひとまずセットアップはここまで。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20130529

2013-05-28 (Tue)

[] MapSearch 15:31  MapSearch - iOS プログラミングメモ を含むブックマーク

せめて一週間に一回くらいは勉強を兼ねてサンプルコード読んで感想を書いて人気ブログになってアフィリエイトでウハウハとか思ってたのに、もう一ヶ月も間が空いてしまった。そんなバカな。てかここにアフィリエイトなかったかも。

というわけで今日は MapSearch です。5月17日にアップロードされたサンプル。

iOS6.1から MKLocalSearch ていうクラスが追加されて住所とか地名とかの情報を使って地図の検索ができるようになったっていうサンプルみたい。そうかそうか、そういえば以前は検索なんてできなかったのか。

f:id:ktakayama:20130528154420p:image:w200 f:id:ktakayama:20130528154414p:image:w200

coffee って入力すると coffee 店が見つかるらしいけど、そういうのは日本の地図では対応していないらしくてなんもひっかからない。寂しい。こういうの POI っていうらしくて木下さんが紹介していた。

さて難しいことは置いといて、MapSearch のコードを読んでみるのが目的なので読もう読もう。…さっそく画面遷移に関して疑問が。UIStoryBoardSegue を継承したクラスを作って、そのインスタンスを作ってから perform 実行してるんだけど、なんでだろうか。テーブルの画面ですでに MapViewController のインスタンスを生成して保持してるからっぽいなあ。地図は読み込み遅そうだから使いまわしたかったのかな。確かにこのアプリの場合は2つの画面を行ったり来たりするだけだから、なんども初期化するのは無駄だしいいかも。細かい所だけど凝ってる。

↓ のコード。viewDidLoad 内で DetailSegue (UIStoryBoardSegueを継承したクラス)のインスタンスを作って、tableView didSelectRowAtIndexPath の時に呼び出してる部分のこと。

検索の部分はシンプルでわかりやすかった。検索するんだったら、このコードそのまま使うといいんじゃないかなあ。基本的に - (void)startSearch:(NSString *)searchString; の中で完結してそう。

MapViewController の方は単にリストで保持された MKMapItem にポコポコとピンを立ててるだけで特に思うところはなかった。

終わり。

ちなみに、サンプルコードは以下の RSS で最新情報をチェックしてます。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20130528