旅行に役立つ地図掲示板アプリ「BulletinMap」について

「BulletinMap」とは

「BulletinMap」とは、投稿を地図上に直接投稿できる、新しいタイプの掲示板スマホアプリです。

この掲示板では、投稿を地図上のピンとして表示します。このアプリを使うことで、現在地付近で投稿された口コミを効率よく収集できるようになります。

iOS:https://apps.apple.com/us/app/bulletinmap/id1490799799?l=ja&ls=1

Android(ベータ版):https://play.google.com/store/apps/details?id=com.bulletinmap.gpstestt

開発動機

旅行中に、電車の待ち時間のような短い時間で現在地付近のおすすめスポットの情報を効率よく収集したいと思ったことが、開発のきっかけになっています。

私は目的地を決めずに電車旅行することが多いのですが、とある鉄道駅を題材にした位置ゲーを弄っていることが多いです。そのゲームには駅ごとに掲示板機能がついており、ユーザによってその駅付近の見所や飲食店といったようなおすすめ情報が書き込まれています。私は旅行中にこの掲示板機能を使うことで、旅行の質を高めることができました。この経験から、旅行中に周囲のおすすめスポット情報を効率よく知ることができたら、旅行の質を高められるのではないかと考え、このアプリの開発を決めました。

プログラミング経験は高校の時にC言語を少しかじっていた程度で、SwiftやPHPを本気で勉強し始めたのはMacを買った2019年7月ごろです。そこから12月に初めてiOS版のBulletinMapをリリースして、そこから就活の合間に少しずつ改良していきました。

アプリの使用方法

初期設定

初回起動時では、ユーザ登録画面が最初に表示されます。ここで、ユーザ名とユーザID、パスワードを入力してください。ユーザ名とユーザIDは、閲覧画面などで他のユーザに公開されます。ユーザIDは、他のユーザとかぶっているものは利用できません。また、パスワードは機種変更後のデータ移行でのみ使用します。パスワードを紛失すると、機種変更後の引き継ぎができなくなるので注意してください。

全てを入力したら、メイン画面(地図と投稿が表示される画面)に遷移します。次回起動時からは、アプリを起動したら自動的にログインがされるため、起動直後にメイン画面が表示されます。

投稿方法


1.画面下の「位置登録」ボタンを押す
2.タイトル、本文、カテゴリ、時差投稿パラメータを入力して、「送信」ボタンを押す
3.現在地にピンが投稿される
4.ピンをタップすると、その詳細が表示される

タイトルは必須ですが、本文は入力しなくても投稿できます。
カテゴリは「未分類・見所・食事・お土産」の4つから選択できます。

アプリの特徴

口コミを地図上に直接投稿できる

このアプリによって、旅先でより手軽におすすめしたい場所を投稿できるようになったり、効率よく現在地付近のおすすめ情報を収集したりすることができます。

匿名性

このアプリのデータベースでは、ユーザに関する情報はUUIDと入力された情報のみを保存しています。このUUIDはユーザ本人の名前や年齢といった個人情報とは全くの無関係な値であるため、運営者が投稿者を特定することはできません。

自動ログイン機能

アプリ起動時に、サーバへUUIDを送信します。サーバはこのUUIDをもとに、データベース上に保存されたユーザIDやユーザ名など、投稿や閲覧に必要な情報をスマホ側へ返します。これによって、投稿する際のユーザの手数を減らすことができました。

時差投稿で身バレ防止

投稿画面の「時差投稿」パラメータを弄ることで、時差投稿が可能になります。ここには0から200までの数字が入力でき、その時間だけ地図上にピンが投稿される時刻がずれます。
例えば、0:00に送信ボタンを押して、かつ時差投稿を「3」に設定した場合、地図上に反映されるのは3:00です。

この機能を使えば、身バレの危険性を抑えることができます。このアプリは自分の現在地を直接投稿するようなものなので、身バレ対策は必須だと感じました。

その他便利機能の数々

・カテゴリで表示されるピンを絞り込むことができます。
・Favoriteユーザに登録することで、そのユーザが投稿したピン一覧へのショートカットが作れます。
・逆にNGユーザに登録することで、そのユーザのピンや書き込みを非表示にできます。
・myPinsでは、自分が投稿したピン一覧を表示します。時差投稿によってまだ地図上に反映されていないピンは、ここから確認できます。

課金要素について

BulletinMapサブスクリプションとして、ちょっとした課金要素を加えました。
下の機能が、250円で30日間使えるようになります。

1.地図上を長タップすることでも投稿可能になります。これにより、現在地に関係なく任意の場所へピンを置くことができます。
2.投稿手段(位置登録・長タップ)でもピンを絞り込めるようになります。カテゴリ別での絞り込みは無料でもできますが、投稿手段でもピンを絞り込めるようになることで、現地で投稿されたピンか長タップで投稿されたピンかで絞り込めるようになります。
3.Favoriteユーザ枠が増えます。無料では10人までFavorite枠が用意されていますが、課金することで枠が50人まで増えます。Favoriteユーザが11人以上の状態でサブスクリプションが切れた場合、解除するなどして9人以下にするか、再度課金するまでは、Favoriteユーザを追加することはできません。

基本的には外部ライブラリを使わない方針で開発してきましたが、課金周りの実装は失敗できないことと、初心者にはあまりにも複雑すぎるため、「SwiftyStoreKit」を使いました。

使用した技術

今回は、プログラミング初心者でも使いやすい言語やシステムを意識して技術を選びました。

Swift

Xcode上でコードを書きました。
iOSアプリを作る言語の候補としてはObjective-CとSwiftが挙げられますが、Swiftの方が初心者向きとのことだったので。

Kotlin

Android Studioで書きました。
インターネット上のサンプルプログラムはJavaで書かれていることが多く、Kotlinに変換する必要がありました。

PHP

CotEditor上で書きました。本当はVisualStudioを使いたかったのですが、私のMacの容量が残り3GBしかないため、AppStoreで無料でダウンロードできたCotEditorで開発しています。

サーバ上で使う言語の選択は非常に迷いました。自分で調べただけでも、Perlは後方互換性に優れているという特徴があり、Pythonは人工知能だけでなく有名なWebサービスでも使われつつあると言ったように、魅力的な言語が候補として出てきました。

それでもなおPHPを採用した理由は、私のようなプログラミング初心者がアイディアを形にするにはPHPが最短距離だと感じたからと、大学で最も参考資料が充実していたからです。

今回はフレームワークを使いませんでした。素のPHPの文法すら全く知らない段階でフレームワークに手を出しても理解が追いつかないと思ったからです。

入力されたパスワードは、password_hash関数を使うことでhash化させました。

AWS

AWSには12ヶ月の無料使用枠があるため、今回のように試しにアプリを作ってみることも手軽にできました。
データベースはMySQL、AWSのサービスはEC2とRDSを使いました。

PHPのPDOステートメントを利用してSQLの脆弱性を抑えたり、<>&などの特殊文字はそもそもスマホから入力できなくしたりすることで、SQLを守りました。

今後の課題

UIの改修

ラベルやボタンといった部品はXcodeのシステムを使っているため、UIがかなり無骨なものになってしまいました。TwitterやFacebookといったような、大勢の人に支持されているサービスからUIを研究する必要があると感じました。

広告ピンについて

現在、とあるピンを広告ピンとして、他のピンよりも目立つ仕様にしています。ユーザの集まり次第とはなりますが、PayPal決済を利用した広告作成にも挑戦したいです。

画像の添付

人気サービスにするには画像を添付できるようにすることが不可欠だと考えていますが、AWSの容量を圧迫する危険があるため見送っています。将来的にはピンと画像を紐付けることで、よりピン周辺の情報収集を効率化できるようにしたいです。

宣伝

最後までご覧いただき、ありがとうございました!
よろしければぜひダウンロードしてみてください!

iOS:https://apps.apple.com/us/app/bulletinmap/id1490799799?l=ja&ls=1

Android(ベータ版):https://play.google.com/store/apps/details?id=com.bulletinmap.gpstestt