昔作ったiPadアプリをSwiftでiOS 8なユニバーサルアプリに作り直した
約4年前、Objective-Cの修行のためにオープンソースなテキストエディタアプリ「Edhita」を作りました。(どうせ練習用だし…と適当に名前を付けたことを非常に後悔しています。)
今までほぼ放置しても何とか使える状態でしたが、iOS 8になり、ついに動かなくなってしまいました。
というわけで、今度はSwiftの修行のために、iOS 8用に作りなおしてリリースしました。
ついでに、
- Markdownのプレビュー機能
- エディタとブラウザのデュアル表示
- 全画面表示(横画面の時にTableViewを非表示にする。バグあると思う)
を追加しました。
無料ですのでよろしければどうぞ。
また、引き続きオープンソースですので中身に興味のある方はどうぞ。
お役に立ちましたら、スターよろしくお願いします★
やったこと
古いアプリをなんとか動くようにする
アップデートの挙動をシミュレータで試したいため。(古いアプリをbuildした後、新アプリをbuild)
自動テストで担保しろよという話かもしれませんが、何のテストも書いてなかったのでorz
実機でストアから入れて…でもできるんですが、面倒。
嫌々ながら動くように頑張りました。
汎用的な機能をPod化
今回は以下の4つを切り出しました。
この方針は正解でした。
大きいアプリを1つ作るより、4+1の小さなものを作るほうが楽。
(それSwiftで書き直してないやん、という話は置いといて)
アプリ本体の実装
ここで、ようやくSwift。
上で作ったものや他のPodを利用しながら作っていきます。
古いアプリで作ったデータをそのまま使えればとりあえずOK、という方針であんまり詰め込みすぎないように。
Pod分離+Swift化により、コンパクト(数百行)に実装できました。
感想とか
Xcode 6.0.1の情報。
UISplitViewControllerがiPhoneにも対応
わーい、とか思ったけど、テストのパターン増えた。(iPad、iPhoneに加えてPlusも必要になった。)
とはいえ分岐は少なくて済みそうだったので、ユニバーサルにしてみた。
あたりまえだけど、iPhoneだとDetailViewControllerのViewは表示するまで読み込まれないので、viewDidLoad:でいろいろやると変数がなくて落ちたりするので注意。
Master-Deatailのテンプレートを見ると、DetailViewControllerは「Show Detail Segue」なるもので表示されてる。
コードで書く場合はiPhoneように自分でpushしたりする必要がある。っていうかStroyboards使えということですね。
UIAlertController
messageをnilにすると、タイトルが太字にならない。空白なら太字になる。
無駄にスペースが入るけど、それはnilにしても同じ。
あと、タイトルなしは特にiPhoneでの見た目が残念になるのでやめておいたほうがいい。
enumの省略
1 |
if self.splitViewController?.preferredDisplayMode == .Automatic { |
とかやると、「Command failed due to signal: Segmentation fault: 11」でBuildできない。なんだこれ?
1 |
if label.textAlignment == .Center { |
は動く。やらないけど。
MFMailComposeViewController
2014-10-09 15:37:12.370 Edhita[36937:4381303] viewServiceDidTerminateWithError: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 “The operation couldn’t be completed. (_UIViewServiceInterfaceErrorDomain error 3.)” UserInfo=0x7f993d335380 {Message=Service Connection Interrupted}
2014-10-09 15:37:30.497 Edhita[36937:4381372] <MFMailComposeRemoteViewController: 0x7f993d24ced0> timed out waiting for fence barrier from com.apple.MailCompositionService
というエラーと共に、シミュレータでメール画面が勝手に閉じる。
実機なら大丈夫だった。
CocoaPodsのplistの出力場所
Pods/Pods-acknowledgements.plist
から
Pods/Target\ Support\ Files/Pods/Pods-acknowledgements.plist
になった。
(Podfileでtarget指定している場合は、Pods/Target\ Support\ Files/Pods-Edhita/Pods-Edhita-acknowledgements.plistとかになる。)
CocoaPodsのtarget
途中で変えると、
ld: library not found for -lPods-Edhita
でbuildできなくなった。
Build Phasesでlib-podsだけにすれば行けた。
(今回ははじめtarget ‘Edhita’ doの中に入れてて途中で外に出した。)
WebViewの表示領域がどんどん小さくなっていく問題
WebViewのwidth, heightに小数点を設定すると表示領域が小さくなっていくという問題に遭遇した。(frameは正しい値だけど右端がどんどん黒くなっていく)
似たような構成作っても再現しなかったので、原因不明。
EditorViewの実装が悪いっぽい。
ひとまずceil()して済ませたけど、ちゃんと原因調べて直したい。
https://github.com/tnantoka/edhita/blob/master/Edhita/Views/EditorView.swift#L73
Swift
まだ慣れない。
気づけば「[self.view addS」ぐらいまで書いて補完されなくて、あ、Objective-Cじゃなかったって気づく。
1日でリリースされた(!)
金曜日に申請して土曜日にリリースされた。正直これが一番心に残ったw
英語のほうをRebuild for iOS 8.って書いたので、単にbuildしなおしただけと思われた?(作りなおしたというつもりで書いた。)
もしくは、iOS 8のみ対応だとテストする時間があんまりかからないから優先されるとか。
TODO
- Gistへの投稿(個人的に欲しいので)
- SFTP(要望有りのため。素のFTPは昔サポートしてたけど、rootViewControllerを差し替えるというとんでもない実装がされてあったので、AdMobのアップデートに合わせて消した。本アプリ唯一のメンテ。)
- アクティビティコントローラ使う(なぜメールだけにしたのか)
- テスト(っていってもモデルの機能はほとんどFCFileManagerに任せてるから、そんなに書くとこないかも?)
- 回転した後にTableViewがNavBarの下に隠れることがあるの解消。EDHFinderのバグだと思う。
だらだら書きましたが、こんな感じです。
それでは。
最近のコメント