🌏

【個人開発 x iOS】世界各国の旅行先を提案してくれるアプリ「次世界のどこいく?」をつくった 🗺️

2023/01/24に公開

kamimi です。こんにちは。

今年3つ目のiOSアプリを作ったので、その紹介と技術的な話とか書こうと思います。最小機能に絞っていることが大きいですが、1ヶ月に3つリリースできたのは過去の自分に比べたらだいぶ頑張ったと思います。

さて3つ目ですが、作るモチベーションはこちらの日本バージョンと同じく、行ったことがない場所を旅行先として提案してほしい、ということでした。

https://zenn.dev/kamimi01/articles/35021705fae1db

その名も 「次世界のどこへいく?」 です。笑

「アプリ名もうちょっと良いのなかったんですか?」

・・・わかるよ。以下略。日本バージョンの方に返答を書いてます。笑

こんな機能

できることは2つです。行ったことのある国を記録できます。そして行ったことのない国をランダムで表示します。後者がメインの機能です。日本バージョンと違うところは、表示された国の場所をマップで表示するところです。国がありすぎて「それどこですか?」という国が多かったからです。笑

https://twitter.com/kamimi_01/status/1617638009343717376?s=20&t=B7-96Ce6z6GtyReiaAkDqA

私は今11カ国行っています。このルーレットで行く国を決めたい!ところですが、実際行くときは治安とか場所とか気にしてから行く予定です。笑

インストール方法

App Storeのリンクはこちらです。

https://apps.apple.com/jp/app/次世界のどこいく/id1667179734?l=ja

さっき書いたけど日本バージョンもあるよ。笑

https://apps.apple.com/jp/app/次日本のどこへいく/id1665806389?l=ja

制作過程

自分のメモとしても制作過程を残しておきます。
こちらも制作時間は大体8時間くらいだったと思います。

使用した技術

  • Swift
  • SwiftUI

やっぱりSwiftUI好きです。

ライブラリは

  • Lottie

を使ってます。

実装

日本バージョンと違うのは、ルーレット側のUIが少し違うところ、あとデータの取得元です。

UIに関しては、MapKitのinit(coordinateRegion:interactionModes:showsUserLocation:userTrackingMode:)を使用して、国の首都の位置を表示しています。

表示する領域は1,000kmがちょうどいい感じだったので、固定でそうしました。
国によってはそれだと収まりきらなかったり、小さくてどこだかよくわからなかったりしたので、改善の余地はありますね。🤔

struct TravelRecordScreen: View {
    @State private var region = MKCoordinateRegion(
        center: CLLocationCoordinate2D(latitude: 49.75,  // ルクセンブルク大公国
                                       longitude: 6.16666666),
        latitudinalMeters: 1000 * 1000,
        longitudinalMeters: 1000 * 1000
    )
    
    var body: some View {
        Map(coordinateRegion: $region)
    }
}

次にデータの取得元になります。日本バージョンのアプリでは、47都道府県をソースコードにべた書きでしたが、国の方はそうもいきません。300近くあるので無理ゲーだと勝手に判断しました。笑

ということで、REST Countries というAPIを利用させていただきました。

https://restcountries.com/

今回使用したAPIは1種類だけですが、通貨とかも取得できるようです。
ちなみに地図を表示すると言うアイディアは、このAPIからヒントを得ました。レスポンスに緯度・経度らしき値があったので、「あ!これ使えば地図が表示できる!」と思い至ったのでした。

滅多に変わらないデータなのに毎回リクエストするのはUX的にもREST Countriesの人にも申し訳ないので、初回リクエストでUserDefaultsに全てを突っ込んでいます。なのでアプリをアンインストールしない限りはリクエストは飛びません。選択されたかどうかのデータも含めて、全てを突っ込んでいます。

以下の記事を参考にカスタムクラスをData型に変換しました。感謝感激・・・🙏🏻

https://yamatooo.blog/entry/2020/11/29/083000

課題はチェックをつけ外しするたびに全てのデータを取り出して削除して保存し直しているので、読み書きのパフォーマンスが良くないことです。でも正直、アプリを使っている上ではあまり気にならなかったのと、UserDefaultsの方が(私の)実装速度が他より早かったのでこれを選びました。

以上です。

リポジトリはこちらです。機能要望もしあればぜひ。

https://github.com/kamimi01/WorldTravelRoulette

審査

こちらも多分OKされるかなと思っていました。想定通り一発approveをもらいました。わーい。わーい。

おわりに

日本バージョンと同じですが、やっぱりルーレット画面(旅行先を決める画面)のUIがちょっと微妙だと思うのです。。直していきたい。
あとこちらのアプリは国数が多いので、地域ごとに国を表示したり、ルーレットを回す地域を限定できるといいなあと思ってます。

3日くらいしか休みがない場合、いきなりアフリカの国が出ても、行き帰りの飛行機で終了してしまいますし。。笑

とはいえ、私自身はたとえ行けない国が出てきたとしても楽しんで使っています。
個人的な趣味で元々世界地図を眺めるのが好きなので、色んな国名を知る機会になっていて楽しいんです。一人で永遠とルーレットを回せます。笑

よければ皆さんもこのアプリで「この国知ってる!」を増やしてみてください。😄

Have a nice trip!! 🛫

Discussion