読者です 読者をやめる 読者になる 読者になる

yoneapp@iPhoneアプリ開発

標高ワカールやニュースアプリ・スタートアップの支援を行うiOS&Railsエンジニアのブログ

PR表示をかわいいフォントで表示している例

f:id:yoneapp:20160311161741p:plain

iOSアプリの共通機能をライブラリを使って逃がす

はじめに

同じ機能があるアプリを2〜3も作ってると結構メンテナンスが辛い。共通機能を小まめにライブラリ化して、ライブラリを更新するだけで両方が更新される状況を作りたい。

ただ、両方のコードを全て共通化させて楽をするというのは上手く行かなさそうなので、あくまで小さいパーツに切り分けて、操作は各アプリで違ってくるという考え方良いと思っています。

CocoaPodsによる、外部ライブラリの利用と作成 | Developers.IO を読んでライブラリを作ってみます。

結構簡単にできました。今回は複数のアプリで使っていたTableViewControllerをライブラリに逃がしてみました。

try! Swift 文化を調和させる で学んだDataSourceの外出しを試してみました。ちょうど、最後の方のスライドの上に外出しした部分をライブラリにした具合ですね。

ライブラリを更新して、複数のアプリでpod updateすれば修正が全てに適応されます。ライブラリコードを固めることで良くも悪くも、自由度が下がり保守コストが下がります。

何はともあれCocoapodsの設定ファイルを作る

ライブラリは作成済み前提です。以下の様なコマンドを実行します。

$ pod spec create XXX

作成されたXXX.podspecを適切に編集する。

プライベートなCocoaPodsのSpecsを作成してデプロイ

githubで空っぽのCocoaPodsSpecsを作成してから作業する。

$ pod repo add yoneapp https://github.com/yoneapp/CocoaPodsSpecs
$ pod repo push yoneapp --allow-warnings --verbose

Podfileを書き換える

source 'git@github.com:yoneapp/CocoaPodsSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'

use_frameworks!
platform :ios, '8.0'

target 'YYY' do
  pod 'XXX'
end

自分のライブラリ内で外部ライブラリを使う

Pod::Spec.new do |s|
  ...
  s.dependency 'PullToRefreshSwift', "= 2.0.0"
end

ios - How to import Alamofire/AFNetworking in my custom cocoapod - Stack Overflow

まとめ

今回作ったライブラリは公開できなさそうなんだけど、自前コードをライブラリ化する癖をつけておけば Motivation based library abstraction のようにライブラリを公開出来る日が来るんじゃないかなと思いました。

try! Swiftで学んだこと

私のスキル的に、1発表に対して実際に取り込めるのは1〜2個が限界なので、学んだことが少ないのは申し訳ない。

一番学んだことは、海外からの出席者が居るカンファレンスなんだから英語出来たほうが良かったねということ。HiNative Trekの今月のテーマが「カンファレンスでの会話」らしいので受講を開始しました。

続きを読む

Realm + 高さが可変するTableViewの考察

iOS Realm Swift Objective-C

f:id:yoneapp:20160229102101p:plain

何度か、Realm + 高さが可変するTableViewにチャレンジしてみて、自分の中で最終的にこんな感じかなと思ったのでサンプルを作成してみました。アドバイス頂けると嬉しいです。

GitHub - yoneapp/RealmTableViewSample

高さを計算する処理が重く、バックグラウンドに逃したいがRealmはスレッドをまたげないのでバックグラウンド処理において、どう書けばいいのかについて悩み続けています。

ここに至った経緯を記します。現在、四個目です。

一個目

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat にて text.boundingRectWithSize を使用して高さを計算する。もちろん text.boundingRectWithSize をMainThreadで実行すると重い。

二個目

バックグラウンドで text.boundingRectWithSize を実行する。もちろん、Realmを使っているので落ちる。また、上手くごまかせたとしてもデータが書き換わった時に対処しにくい。

三個目

全てのデータをRealmから取り出し、普通のオブジェクトにしてしまう。この場合、Realmの遅延評価による高速性を犠牲にする。また、データが何千件もある場合に処理に時間が掛かる。更新にも時間がかかる。

四個目

仮想のCellを作成して、そこで高さ計算を行う。Realmオブジェクトに識別子を付け、仮想のCellと結びつける。仮想のCellの計算が終わってない場合は、仮のセルを表示しておく。

仮想のCellは、現在表示されてるCellのプラスマイナス5個ぐらいを常にバックグラウンドで計算するようにする。

実際にRealmのデータが削除された場合でも、データがない場合は仮のセルが表示されるのでクラッシュせずに動作します。

五個目

RealmのSlackで質問させて頂いた所、複雑なことをしなくても UITableViewAutomaticDimension で解決できるとアドバイス頂きました。実際の所、高さ計算はそんなに重くないようでした。estimateHightを合わせて使えば、計算されるセルの数も限定できるので簡単に実装することができそうです。

WIP@iOSとRialsのエンジニアがMacをリセットする手順書 2016

リセット前

  • DropBoxでバックアップ
  • 写真をiCloudでバックアップ
  • Keychainのバックアップ
  • ssh keyのバックアップ
  • プリンタ設定のバックアップ

リセット後

  • ESET Cyber Securityをインストール
  • Time Machineの設定
  • DropBoxの復旧(設定よりネットワーク、バンド幅のアップロード速度を制限しないに変更する)
  • Google日本語入力をインストールする
  • Power Nap を有効にする
  • 写真を復元する
  • Chromeのインストール
  • 1Passwordの復旧
  • ssh keyの復旧
  • Keychainの復旧
  • Towerの復旧
  • cd toの復旧
  • Charlesの復旧
  • Asset Catalog Creator Freeの復旧
  • SimPholders2の復旧
  • RecordItの復旧
  • プリンタ設定の復旧
  • XcodeとかRailsは使う前までに適当に入れておく

プログラムに最適なフォント『Ricty』を超簡単にインストール[Mac限定] - 酒と泪とRubyとRailsと

defaults read com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks
defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 4
defaults read com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks

WebからiOSアプリを開く技術調査

iOS

URLSchemeでアプリの有無によって挙動を変える(iOS9対応版) | astone.jeez.jp によると、現在はURLに応じて上手く切り替えるのは、うまく動かない可能性が高いようだ。

SmartNews(SmartBanner)

最もスマートな純正ソリューションだが、WebViewで表示されないのが痛い

f:id:yoneapp:20160223004428p:plain

続きを読む

WIP@ディープリンク調査

ディープリンク版カオスマップを作ってみた Deeplink Landscape JAPAN 1.0 | ディープリンク.jp がとても参考になると思います。ディープリンクは多少、バズワード的というか色々なパターンがあるので、それを知った上でどのように組み合わせるかが大切そうです。

ディープリンク(deep link)とは | ディープリンク.jp も参考になります。

URLスキーム・独自ディープリンク実装に代わる、Universal Links(iOS 9で導入)でより良いUXを実現 - Qiita

関連ソリューション

AppsFlyer - Mobile App Tracking & Attribution Analytics

WARP(ワープ) | Deep link Solution 従量課金

Circuit(サーキット) - ディープリンク最適化ソリューション 問合せ

Lindle