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

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

レイ・アウトのiPhone6用ウルトラスリム・フレキシブルジャケットを約1ヶ月使ってみて

レイ・アウト iPhone6 (4.7インチ)用 ウルトラスリム・フレキシブルジャケット クリア RT-P7TC2/C

こいつです。

以前使っていたiPhone 5は最後の方ケース無しに落ち着いて、iPhone 6もそのつもりだった。
が、いざ使い始めてみると巨大化による落下の不安感が半端無かったので、ケースを買うことに。

材質で迷うこと小一時間。(一応全部使った経験有り)

  • シリコン → クリアがないし、安っぽい。
    TPU → 耐衝撃性はいいけど、野暮ったい。手触りがあんま好きじゃなかった。
    ハード → クリアだけど、ピッタリ合ってないとカタカタなったりして悲惨。

そんな中、レイアウトさんのページで、「特殊手法により、通常のシェルジャケットよりも柔らかく、しなやかに仕上げました。」という文言を発見。
http://www.ray-out.co.jp/products/p7tc2/

これだ!ということで衝動買い。

届いてみると見た目や手触りはポリカーボネイトだけど、確かに柔らかい、まがる。

で、約1ヶ月間使ってるけど、特に不満はない。
つけ始めはたまにずれるのを感じたこともあったけど、馴染んだのかなくなった。
予想通りポケットから何度か落としたけど、今のところ大きな傷はない。

まぁでも、結局ほぼハードと変わらないし、普通のハードでいいかな、という気もする。ちょっと高くなるし。

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

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

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

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

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

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

パーフェクトRuby on Rails片手に1つアプリを作った

まずは宣伝

作ったのは、Micloという1人用マイクロブログサービスです。
1人用ということで、SNS機能はありません。(が、投稿は全て公開されます。)

Heroku Buttonも付けたので、自分専用の環境をすぐ用意できます。

なぜ作ったか

僕はTwitterがわりと好きなんですが、つぶやく直前に「これ、Tweetするほどのことでもないよなぁ…。」と削除することがよくあります。
別に隠したいわけじゃないんだけど、わざわざ誰かのTLに投げ込みたいほどでもない。

また、tl;drという言葉がありますが、同じくToo long; Didn’t write.というのもやはりあると思います。
ブログにまとめるのは大変だけど、断片でもいいからつぶやいておけば、誰か(自分含む)の役に立つかもしれない。

というわけで、こそこそと気軽につぶやける用に作ってみました。

特徴

単なるマイクロブログだと芸がないので、ひとかたまりで発言できるようにしています。
つぶやく時に、「続き」を選択するとその前のつぶやきとおなじTopicになります。

あと、Markdownで書けます。

キーボードショートカットも一応あります。nで新規、cmd+enterで送信などです。

その他

デザインはほぼBootstrapそのままです。
オープンソースなので、気に入らない所とかあったら、プルリクエストしてもらえると喜びます!

パーフェクトRuby on Rails


パーフェクト Ruby on Rails

「パーフェクト〜」と言われると、ハードルが高いんじゃないかと思っちゃいますが、
実際は、「ステップアップ〜」や「レベルアップ〜」と言った感じで、(たぶん)中級者の僕にも大変わかりやすかったです。

むしろ初心者にこそオススメしたい一冊でした。
久々に、「Railsで何か作りたいなー」という気持ちにさせてくれました。ありがとうございます!

読みながら書いたメモなどはこちら。
http://miclo.org/u/tnantoka/t/3

Vue.js

どうせ何か作るなら今まで触ったことのないものを使ってみようと、Vue.jsを使ってみました。

これまでBackboneとAngularを少し触ったことがある程度なので、偉そうなことは言えませんが、Vue.jsはとてもコンパクトで手軽に使えると感じました。とにかくBindingがしたいんだよ!という人は是非。

また、今回は、できるだけRailsの機能を使う方針で書きました。
例えば、「formをsubmitしてJSONを持ってきて…」みたいな処理を自分で書きたくなかったので、
「remote: true」でRailsにやってもらって「ajax:success」を受ける、みたいな形でやりました。「disable_with」も使いたかったし。
結局そのせいで汚くなった部分もあるので、素直に自分でsubmitすればよかったかな、とも思っています。(が、汚さの多くはVue.jsがアップデートしていくうちに解消できそうな気がするので、そちらに期待しています。)

あと、今更ながらSlimも使ってみましたが、快適でした。Vueは結構HTMLの属性を書かなきゃいけないので、HTML風にも書けるSlimと相性がよかったです。

サーバ

VULTRで動いています。
キャンペーンで実質半額なので月2.5ドルです!安い!!(初回入金と同額を上乗せてくれる

これぐらいなら、なんとかAdSenseでやってけるんじゃないかと目論んでおります。
広告邪魔という人はオープンソースですので、自前で立てて消していただければと思います。(むしろ、そこまでして使ってくれたらありがたいです。)

今のところ大きな不満はないですが、やはりレイテンシが気になります。
※ Tokyoは転送量上限100GBで心許なかったのでLos Angelesにしましたが、pingすら200〜300msかかってて​悲しいです。

 

そんな感じで、よろしくお願いします。

Xcodeのグループとディレクトリ構成を同期させてくれるツール「Synx」

皆さんはXcodeのグループをディレクトリ構成と合わせますか?

僕は、使い捨てのプロジェクト以外は合わせるようにしています。
やっぱり、プロジェクト名のフォルダに全部突っ込まれてるよりは、ある程度分かれていたほうが見やすいですしね。
(Xcode上ではどちらでも変わらないけど、GitHub上などで見る時に効率が全然違う)

ただ、この「グループをディレクトリと同期させる作業」めんどくさいんですよね。
グループを作って、File InspectorのLocationからディレクトリ作って選択…。
数が多くなってくるとかなり手間だし、プロジェクトを作る度に毎回やらないといけません。

そんな悩みを解決してくれそうなのが、Synx。最近、GitHub上で人気のようです。

まずはインストール。SynxはRuby製のツールでgemとして提供されています。
導入は以下の1コマンドで完了です。

では、早速使ってみます。

synx1

このようにせっせと「Controllers」「Models」「Views」にグループ分けしたプロジェクトがあります。

treeコマンドでディレクトリ構成を見てみます。
グループ分けの甲斐虚しく、SynxExampleフォルダに全てのファイルが並列にある状態です。

ここでsynxの出番です。この程度のファイル数であれば処理は一瞬で終わります。

再度treeコマンドで確認してみます。

「Controllers」「Models」「Views」それぞれのディレクトリが作成され、ファイルが格納されています。
これは便利ですね!

他にも使い方があるようですが、今回はここまで。
実開発で使ってみて便利だったところや、ハマったところなどあれば、また共有したいと思います。

 

 

 

1 2 3 27  Scroll to top