iOS

昔作ったiPadアプリをSwiftでiOS 8なユニバーサルアプリに作り直した

約4年前、Objective-Cの修行のためにオープンソースなテキストエディタアプリ「Edhita」を作りました。(どうせ練習用だし…と適当に名前を付けたことを非常に後悔しています。)
今までほぼ放置しても何とか使える状態でしたが、iOS 8になり、ついに動かなくなってしまいました。

というわけで、今度はSwiftの修行のために、iOS 8用に作りなおしてリリースしました。
ついでに、

  • Markdownのプレビュー機能
  • エディタとブラウザのデュアル表示
  • 全画面表示(横画面の時にTableViewを非表示にする。バグあると思う)

を追加しました。
無料ですのでよろしければどうぞ。

App Storeで表示

また、引き続きオープンソースですので中身に興味のある方はどうぞ。
お役に立ちましたら、スターよろしくお願いします★

tnantoka/edhita

やったこと

古いアプリをなんとか動くようにする

アップデートの挙動をシミュレータで試したいため。(古いアプリを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の省略

とかやると、「Command failed due to signal: Segmentation fault: 11」でBuildできない。なんだこれ?

は動く。やらないけど。

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のバグだと思う。

だらだら書きましたが、こんな感じです。
それでは。

Dropbox APIのアプリ名を変更する方法

相変わらず、Dropbox APIの日本語情報は少ないですね。
結構使われてるように見えますが、なぜなんでしょう?
というわけで、ほんのちょっとした情報ですが、ブログに書いておきます。

アプリ名(App name)は、StatusがDevelopmentの間は管理画面で自由に変えられますが、
Productionになると変更できなくなります。
(App folder nameなど他の項目は変更できるものが多い。)

今回諸事情でリリース後にアプリ名を変更することになり、少し困りました。
フォーラムを検索すると、サポートに問い合わせればわりと簡単にやってくれるもよう。

https://www.dropbox.com/developers/contact から、”I want to change…”という厨二病のようなメッセージを送ってみたところ、1日後には変更してくれてました。
迅速なサポートで、ありがたいです。

アプリ名を変更したやつはただいま(Appleさんの)レビュー待ちです。
リリースされたらまた宣伝します。

「Xcode 5 徹底解説 for iOS/OS X」買った

発売以来、主にその大きさから購入をためらっていた(電子書籍化を待っていた)んだけど、この週末読む時間が取れそうだったので、ついに買った。


Xcode5徹底解説 for iOS/OSX

ちゃんと読み込んでものにすれば、アプリの開発効率がかなりあがりそうなので、手を動かしつつ、目を通していこうと思う。

それにしてもIT系の書籍はもう電子書籍デフォルトでいいんじゃないかと。
DRMフリーなら、紙より高くてもいいから!(自炊する手間や置く場所を考えればちょっとぐらい高くても電子書籍の方がいい)

広さ的な意味で住環境が劣悪な日本でこそ、電子書籍はもっと輝くはず!
そんなに本置けない!!

とはいえ、いろいろ事情があったりして難しいものもあるんですかね。
その場合は、こういう理由で電子書籍当面出ないよ!とか告知してくれると諦めがついて購入しやすい気がします。

 

UIViewControllerのinitではviewをいじらない方が良い

いや、考えれば当たり前なんですが、眠気と闘いながら書いてたりすると、背景色とかinitで設定しちゃってたり…。

例えば以下のようにAppDelegateからViewControllerを設定しているとします。

AppDelegate.m

こちらが問題のないViewController。

(問題のない)ViewController.m

出力されるログは以下のように、(1)-(I)-(2)-(II)-(3)の順になり、想定通りです。

2014-05-17 14:46:56.865 init[1497:60b] AppDelegate – (1)
2014-05-17 14:46:56.867 init[1497:60b] ViewController – (I)
2014-05-17 14:46:56.867 init[1497:60b] AppDelegate – (2)
2014-05-17 14:46:56.868 init[1497:60b] ViewController – (II)
2014-05-17 14:46:56.870 init[1497:60b] AppDelegate – (3)

次に問題のあるViewControllerの場合。initでself.view.backgroundColorを操作しています。

(問題のある)ViewController.m

ログが(1)-(I)-(II)-(2)-(3)の順で出力され、先ほどの例と変わってしまっています。

2014-05-17 14:49:21.885 init[1516:60b] AppDelegate – (1)
2014-05-17 14:49:21.886 init[1516:60b] ViewController – (I)
2014-05-17 14:49:21.887 init[1516:60b] ViewController – (II)
2014-05-17 14:49:21.887 init[1516:60b] AppDelegate – (2)
2014-05-17 14:49:21.889 init[1516:60b] AppDelegate – (3)

これは、init内でself.viewにアクセスしたことにより、そこでviewが読み込まれてしまい、発生した差異です。

多くの場合、問題は起きないと思いますが、いざハマると解決に時間がかかりそうな気がします。

気をつけよう…。

XcodeでアプリをValidateしたら「The bundle is invalid. ~ with public」と言われた

昨日、アプリのアップデートを申請しようとした時、

The bundle is invalid. New apps and updates submitted to the App Store must be built with public

というエラーが出て、Validateが通りませんでした。
おそらくエラーメッセージが途中で切れており、意味がわかりません^^(この前のiTunes Connectメンテナンスでこうなってしまったんでしょうか…。)

なんとなく、Xcodeが古くてpublicじゃないXcodeと判断されちゃってる?と思い、Xcode 5.1からXcode 5.1.1にアップデートしたら、解消しました。

本当の原因はわかりませんが、やはりこういうトラブルを避けるためにも、できるだけ最新版で作業したいところですね。

1 2 3 7  Scroll to top