旅行計画アプリ「たびくる」で、作った旅程をテキストや画像として渡せるようにした。予定ごとの背景写真とメモ表示も加え、旅行中に予定の内容を確認しやすくしている。この記事では、2026年10月2日までに実装し、ビルドやSimulatorで確認した内容をまとめる。

旅行カードから旅程をすぐ開く

旅行一覧のカードを通常タップすると、Rootへ開く要求を通知し、Planタブの旅程を表示するようにした。開く要求や旅行IDの変化に合わせ、表示区分、日選択、sheetを初期化する。

iPhone Simulatorでは、カードから旅程へ進むこと、支払い表示中にカードを再タップすると旅程の1日目へ戻ること、別の旅行へ切り替えられることを確認した。削除選択モードや閲覧者での操作など、導線全体の受入には未確認の項目が残っている。

ShareLinkでテキストとPNGを共有する

旅程画面の共有ボタンに「テキストで共有」「画像で共有」を用意した。テキストは日別予定をプレーンテキストへ整形してShareLinkに渡す。共有用の出力は読み取り処理で、旅行の保存やCloudKit同期を発生させない。

画像はImageRendererで、幅390pt・2倍解像度・ライト外観の旅程カード風PNGを共有時に生成する。予定のない日が続く場合は、テキストと画像の両方で日付範囲にまとめた。16日間の例では、PNGの大きさが780×3701pxから780×1377pxになった。空の日を1日ずつ並べるより、実際の予定を探しやすくなる。

確認用プログラムでテキスト整形を調べ、Simulatorでは共有シートの起動と画像出力を確認した。メッセージアプリなどへの実際の送信は未確認で、PDF書き出しも実装していない。

「画像を保存」が出ない原因は用途説明だった

画像の共有シートに「画像を保存」が出なかった。調査すると、写真ライブラリへ追加するための用途説明がInfo.plistに入っていなかった。

Debug/Releaseのビルド設定へNSPhotoLibraryAddUsageDescriptionに対応する用途説明を追加し、生成されたInfo.plistにキーが入ることを確認した。その後、Simulatorで「Save Image」を選び、追加許可を与えると、PNGが写真ライブラリへ保存されることを確認できた。

確認時には同じ画像が2枚残っていた。保存操作が2回行われた可能性はあるが原因は確認できていないため、重複の理由までは断定していない。実機での写真保存も後続の確認対象である。

予定の背景写真は端末内で扱う

予定詳細に写真欄を追加し、PhotosPickerで選択・変更・削除できる実装を加えた。予定カードの背景に写真と暗いgradientを敷き、文字を白にしている。今回の写真は端末内保存で、CloudKitを通じた他端末への共有は後続段階に残した。

写真はImageIOで向きを補正し、最大辺1,600pxへ縮小する。EXIF・GPS情報を付けずにJPEGへ書き直し、1 MiB以下になるよう品質と寸法を調整する。640pxまで下げても上限を超える場合は保存しない。一覧用には480pxのサムネイルも作る。旅行payloadやCloudKit Schemaは変更していない。

確認用プログラムでは、向き補正、GPS・EXIF除去、大きな画像の縮小、壊れた入力の拒否を確認した。iPhone Simulatorでは、写真選択から詳細・予定カードへの表示、再起動後の復元、予定削除に伴う写真ファイル削除を確認した。保存画像は1600×1067px、約0.92 MiBで、GPS・EXIFがないことも調べている。

メモを予定カードから見つけやすくする

予定ごとのメモは既に保存できたが、詳細内の1行に埋もれ、カードでも小さく表示されていた。保存形式を変えずに、詳細シートの先頭へ4〜10行の独立したメモ欄を置き、カードではアイコン付きの枠で最大3行を表示するようにした。空の場合は、編集できる利用者に「メモを追加」を表示する。

写真の下にメモ欄を置くと、中サイズのsheetで画面外に隠れるため、写真より上へ移した。Simulatorでは、写真付きカードからメモを入力し、カードへの反映と再起動後の保持を確認した。

確認済みの範囲と残る受入

関連するworkspaceビルドは成功している。一方、写真の変更・削除ボタン、旅行削除時の写真削除、写真なしカード、ダークモード、文字拡大、閲覧者での表示、実機操作には未確認の項目がある。今回のメモ変更の2端末同期も未確認である。

調査中には、閲覧者でも予定詳細のメモ以外の一部欄を編集できる既存問題を記録した。閲覧共有は一時停止中だが、再開前に修正が必要である。写真のCloudKit共有と合わせ、端末内での確認を共有機能全体の完成と混同せず、残る受入を進める。