運営中
Bookil
iPadとiPhoneのためのPDFリーダー。
何を解いているか
PDFは溜まりますが、増えるのはファイル名の一覧です。表紙も、どこまで読んだかも、リストからは見えません。一度閉じたPDFに戻らなくなるのは、読む気が失せたからではなく、探せないからです。
なぜ作ったか
自分たちがiPadで読むために作り始めたサイドプロジェクトです。既存のPDFアプリはリーダーとしては十分でも、蔵書として並べる部分が弱い。Bookilは表紙を生成して本棚に並べ、読書の進捗をファイルとは別に持ちます。ファイルを削除して取り込み直しても、続きのページから開きます。 PDFを読む機能は無料のまま置く方針です。プランも広告もアップセルも入れていません。
設計の判断
PDFKit を外し、ページを画素として持つ
表示をPDFViewに任せると、描かれた画素はフレームワークの内側で完結します。 BookilはCGPDFDocumentでページを1枚の画像に焼き、セピアやコントラストをその画素へ適用してからページャに載せています。 保険としてPDFKitを併存させる道は採らず、importごと外しました。 代償として、入力フォームを持つPDFは開きません。
描画層の置き場所。PDFView に任せる案を捨て、画素をアプリが持つ側へ振った 読書の位置をファイルの外に置く
読書の位置はPDFのファイルではなく、アプリ側のデータベースに持っています。 ファイルを削除しても履歴は消えず、同じPDFを取り込み直せば続きのページから開きます。 ファイルの実体と読書の記録を切り離す代わりに、書庫としての連続性を優先しました。
進捗の置き場所。ファイルを消しても履歴が残るよう、値で結んで切り離した 解像度は落とさず、並列で速くする
表示を速くするために解像度を落とす選択はしていません。 ページを横帯に分割し、並列で描いて1枚に合わせる形にしています。 等倍で焼いたうえで待ち時間を詰める方向に振ったので、拡大しても文字が甘くなりません。
同じ画素数のまま並列に描く経路と、電力・熱でバンド数を絞る条件
提供形態
- 対応プラットフォーム
- iOS / iPadOS
- 動作要件
- iPadOS 18.4 以降 / iPhone
- 価格
- 無料(PDF数の上限なし)
- 配布
- App Store
- 対応言語
- 14言語
- 取り込み
- iOSの共有メニュー(ファイル、Safari、メール、クラウドドライブなど)
- プラットフォーム
- iOS
- iPadOS
開発の記録
Bookilを作るなかで書いた記事です。
iOS・macOS@AppStorage のキー衝突を User Script Sandboxing 有効のままビルドで検知するSwiftUI の @AppStorage は同じキーを別の型で共有してもコンパイラが咎めません。Bookil の開発中ブランチで踏んだキー衝突を題材に、型安全ラッパーや SwiftLint では塞げない理由と、Xcode の User Script Sandboxing を有効に保ったまま Pre-action と Run Script の役割分担でビルドを失敗させる仕組みを書きます。iOS・macOSPDFの表紙サムネイル生成をMediaBoxからCropBoxに揃え直した書籍リーダー Bookil の開発中ブランチで、一部の PDF だけ表紙サムネイルが見開き(横長)になっていた問題を直しています。原因は印刷入稿由来の PDF が持つ MediaBox と CropBox の差をサムネイル生成側が考慮していなかったこと。修正の判断と、crop≠media な fixture をコードで生成して回帰テストにする方法を扱います。iOS・macOSBookilで漫画の見開きをページ送りで読ませたくて描画を作り直しているiOS の PDFKit は「ページ送り」と「見開き表示」を同時に成立させられません。書籍リーダー Bookil で見開きの読み心地を作りたかった結果、描画層を自前で持つ方針に振って今もその開発を進めています。PDFKit の制約と、判断の軸を扱います。
ほかのプロダクト
同じプラットフォーム向けに作っているものです。
