Realmを使ってみる

Realm is a mobile database: a replacement for SQLite & Core Data

新しいiOSアプリのデータストアはRealmを使ってみることにした。過去のiOS開発だとCoreDataを使ったりSQLite+FMDBを使ったりしていて、CoreDataは二度と使いたくない感じだったし、SQLiteは初期データを入れたDBファイルを使うプロジェクトでは便利だったけど今回はそういう要件もないので新し目の技術にした。

で触ってみているけどこれはだいぶ便利なのではないだろうか。なにがいいってモデルと別にスキーマを管理しなくていいとこがいい。永続化されるデータをほぼモデルそのものと考えることができる。APIも(RealmSwiftだと)rubyライクというか、まっとうなSwiftライブラリだということかもしれないけど、納得感が高い。

ひたすらありがたいなこれはーと思いながら実装している。


XCode7でビルド関連の名前にカッコやスペースを使っているとリンクに失敗する

アプリ申請を控えているのでアップデートしないつもりがうっかりしてXCode7を入れてしまい、仕方がなく7での開発をしているときにぶち当たった問題。

Adhocビルドをアーカイブして配信しようとすると、

warning: (armv7) /Users/…/BuildProductsPath/Adhoc-iphoneos/libPods-JockeyJS.a(Jockey.o) unable to open object file: No such file or directory

みたいな感じのwarningが大量に出て、どうやらCocoapods含め使っているライブラリ全部で出てる様子。ビルド設定をあれこれ変えても変わらず、同様の設定でwarningが出ないビルドターゲットやプロジェクトとの差もよくわからないという中で見つけた情報がこれ。

hundreds of warnings during Archive in Xcode 7 · Issue #4237 · CocoaPods/CocoaPods

we had build schemes named things like
App Name (Debug)
App Name (App Store)
And we were getting the errors as well, removing the parenthesis fixed it for us as well.

僕のプロジェクトではschemeの名前を「anyApp(dev)」みたいにしてたののビルドで問題がおきてたのでカッコを取り除いたらwarningが出なくなった。


ビルドターゲットを効率的に複製する方法が知りたい

XCodeのプロジェクトでアセットとか設定が異なる別ビルドをつくるために現行のビルドターゲットを複製して新しいビルドターゲットをつくるんだけど、そうするとターゲットの関連ファイルのファイル名とかが「<現行のターゲット名称> copy」とかになってそれらを正しい名前に修正しするとがいちいちだるい。ぜったい他にいい方法がありそうなんだけどいまさっと調べた感じだとなさそうだった。これほんとにないんだろうか。


XCodeプロジェクトに「Resources」というFolder referenceを作るとiOSシミュレータでのアプリ起動に失敗する

XCodeで新規プロジェクトをつくってとあるアプリのプロトタイプをつくっていたら、突然ビルド後に「Unable to run app in simulator」というエラーが出るようになって困った。

試行錯誤してわかったのは、

  • プロジェクトに「Resouces」というFolder referenceを作ると、以後アプリ起動できなくなる
    • エラーは「LaunchServiceErrorDomain, Code=0」だったり「NS POSIX ErrorDomain, Code=22」だったりいろいろっぽい
    • Folder referenceじゃなくてGroupだったら問題ない
    • 「Resources」 iOS/OSXのアプリコンテナのディレクトリで使用される名前なのでそれと衝突する名前だとだめっぽい
  • 一度上記の症状になると「Resouces」のreferenceを削除しただけではエラーは消えない
  • ~/Library/Developer/Xcode/DerivedData内の該当プロジェクトのビルドフォルダを削除してから再度ビルドすると治る

ということらしかった。