- 投稿日:2019-03-30T21:50:51+09:00
Flutter 1.2.x 環境をmacOS上に構築する
なぜこの文章を書いているか?
今までWebアプリばかり作っていたのですが、そろそろスマホアプリも作ってみたいと考え、React Native(もしくはEXPO)やNativeScript Vueなどつまみ食いしていたのですが、どうもしっくりこない。どうせなら今まで触ったことの無い言語でこれからも使えそうなモノ(Dart)を勉強しながらできるのが良いなとFlutterにたどり着きました。
基本的には本家サイトの通りにやっていけば良いのですが、折角なのでメモとして残しておこうと思います。
手順は自分がローカルで行った順番なので、本家サイトとは多少順番が前後します。環境(2019/03/30現在)
- macOS Mojave (10.14.4)
- Xcode 10.2
- Andoroid Studio 3.3.2
- Flutter 1.2.1
Xcodeをインストールする
Xcodeがインストール済みならスキップしてください
- 「App Store」アプリを起動し、左うえの検索窓に"xcode"と入力しエンターキーを入れ検索
- 検索結果一覧の中の「Xcode」を「入手」>「インストール」でインストールを実行(しばらくかかります)
- 「Xcode」を起動し、「License Agreement」の内容を確認した上で「Agree」をクリック、パスワードを要求されるので入力し「OK」をクリック、諸々のインストールがさらに始まります
- 「メニュー」>「Xcode」>「Open Developer Tool」>「Simulator」でシミュレーターが起動する事を確認します
Homebrewをインストール
インストール
ターミナルを開き(方法は色々ありますが割愛)、以下を実行
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Press RETURN to continue or any other key to abortと表示されたら「ENTER」キーを押します- パスワードを聞かれるのでパスワードを入力し「ENTER」キーを押します
- インストールが終わったら以下を実行し正しくインストールされているか確認します
インストールを確認
以下を実行し、
Your system is ready to brew.と出ていればOKです。出なかった場合は画面の指示に従って修正してください$ brew doctorAndroid Studioをインストールする
anyenv, jEnvをインストール
$ brew install anyenv $ anyenv install --init $ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile $ exec $SHELL -l $ anyenv install jenv $ exec $SHELL -lhomebrewでversionsをtapする
$ brew tap caskroom/versionsJDK1.8(java8)をインストールする
$ brew search java (前略) java8 (後略) $ brew cask install java8JDK1.8をjEnvにaddする
$ jenv add $(/usr/libexec/java_home -v 1.8) oracle64-1.8.0.202 added 1.8.0.202 added 1.8 added $ jenv versions * system (set by /Users/user/.anyenv/envs/jenv/version) 1.8 1.8.202 oracle64-1.8.0.202 $ jenv global 1.8 $ java -version java version "1.8.0_202" Java(TM) SE Runtime Environment (build 1.8.0_202-b08) Java HomeSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)Homebrewを使ってAndroid Studioをインストール
$ brew cask install android-studio
- アプリケーションフォルダの中の「Android Studio」を起動
- "Welcome"画面で「Next」ボタンをクリック
- "Install Type"画面で「Stuandard」を選択し「Next」ボタンをクリック
- "Select UI Theme"画面では好きな方を選択し「Next」ボタンをクリック
- "Verify Settings"画面で内容を確認し「Finish」ボタンをクリック
- ダウンロードが始まりますのでしばらく待ちます
- 途中"Intel HAXM"のインストール時に「機能拡張がブロックされました」と出るので「"セキュリティ"環境設定を開く」ボタンをクリックし「開発元"Intel Corporation Apps"のシステムソフトウェアの読み込みがブロックされました。」と書かれている横の「許可」ボタンをクリックします。
.bash_profileに
ANDROID_HOMEを設定$ echo 'ANDROID_HOME=$HOME/Library/Android/sdk' >> ~/.bash_profile $ exec $SHELL -lFlutterをインストールする
ダウンロード
- まずは本家サイトで
macOSを選びます- zipファイルをダウンロードします(2019/03/30現在 flutter_macos_v1.2.1-stable.zip)。ダウンロード先は
~/Downloads/としますインストール
ターミナルを開き、以下を実行
$ mkdir ~/development $ cd ~/development $ unzip ~/Downloads/flutter_macos_v1.2.1-stable.zipもしくは、Safariでダウンロードしてzipファイルが展開済みであれば以下
$ mkdir ~/development $ mv ~/Downloads/flutter ~/development/..bash_profileにPATHを追加
$ echo 'PATH=$PATH:~/development/flutter/bin' >> ~/.bash_profile $ exec $SHELL -l
flutter doctorを実行$ flutter doctor Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, v1.2.1, on Mac OS X 10.14.4 18E226, locale ja-JP) [!] Android toolchain - develop for Android devices (Android SDK version 28.0.3) ✗ Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses [✗] iOS toolchain - develop for iOS devices ✗ Xcode installation is incomplete; a full installation is necessary for iOS development. Download at: https://developer.apple.com/xcode/download/ Or install Xcode via the App Store. Once installed, run: sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer ✗ libimobiledevice and ideviceinstaller are not installed. To install with Brew, run: brew update brew install --HEAD usbmuxd brew link usbmuxd brew install --HEAD libimobiledevice brew install ideviceinstaller ✗ ios-deploy not installed. To install: brew install ios-deploy ✗ CocoaPods not installed. CocoaPods is used to retrieve the iOS platform side's plugin code that responds to your plugin usage on the Dart side. Without resolving iOS dependencies with CocoaPods, plugins will not work on iOS. For more info, see https://flutter.io/platform-plugins To install: brew install cocoapods pod setup [!] Android Studio (version 3.3) ✗ Flutter plugin not installed; this adds Flutter specific functionality. ✗ Dart plugin not installed; this adds Dart specific functionality. [!] Connected device ! No devices available ! Doctor found issues in 4 categories.問題の修正
いくつか問題があるので続いて一つずつ修正していきます
Android Studioのライセンスを読み、了解("y"を入力して"ENTER")します
$ flutter doctor --android-licensesxcodeのインストールを完了します
$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer
libimobiledevice,ideviceinstaller,ios-deploy,CocoaPodsをインストールします$ brew update $ brew install --HEAD usbmuxd $ brew link usbmuxd $ brew install --HEAD libimobiledevice $ brew install ideviceinstaller $ brew install ios-deploy $ brew install cocoapods $ pod setupAndroid Studioに
FlutterとDartのプラグインをインストールします
- Android Studioが起動していなければ起動します
- Welcome画面の右下の歯車アイコンの「Configure」から「Plugins」を選びクリックします
- 下段の「Browse repositories...」をクリックします
- 左うえの検索窓に
flutterと入力し一覧からFlutterを選択します- 右側に「Install」ボタンがあるのでクリックします
Third-party Plugins Privacy Noteを読んで「Accept」ボタンをクリックしますPlugin Dependencies Detectedと出て「Dart」プラグインのインストールを薦められるので「Yes」をクリックします- 先ほどの「Install」ボタンが「Restart Android Studio」となっているのでクリック
- Pluginsウィンドウで「OK」をクリック
IDE and Plugin Updatesのモーダルウィンドウは「Restart」をクリックし再起動しますiOSシミュレータを起動するか、iPhoneなどの実機をUSB接続します
この状態でもう一度
flutter doctorを実行します$ flutter doctor Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, v1.2.1, on Mac OS X 10.14.4 18E226, locale ja-JP) [✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3) [✓] iOS toolchain - develop for iOS devices (Xcode 10.2) [✓] Android Studio (version 3.3) [✓] Connected device (1 available) • No issues found!オールグリーンになりました
![]()
テストアプリを実行してみる
プロジェクトを作成する
- Android StudioにFlutterプラグインを入れる事でWelcome画面に追加された「Start a new Flutter Project」というメニューをクリックします
- "Flutter Application"を選択し(デフォルトで選択されているはずです)「Next」ボタンをクリックします
- "Project name"など必要な内容を編集して「Next」ボタンをクリックします
- "Company domain"は自分で持っているドメイン名を入力します。デフォルトでは"example.com"となっています
- 「Finish」ボタンをクリックします
iOSシミュレーターを起動する
- 上段右側のアイコンが並んでいる中に「main.dart」があり、先ほどの手順でiOSシミュレーターを起動していれば、その左に「iPhone XR」等と表示があるのを確認します
- なければ、その「main.dart」と書かれているプルダウンの左のプルダウンメニューから「Open iOS Simulator」を選択しiOSシミュレーターを起動します
サンプルアプリの実行
- iOSシミュレーターが起動できたら、アイコンの列にある実行ボタン(緑色の▶)をクリックし実行します
- iOSシミュレーターに自動的にFlutterアプリがインストールされ、自動起動し「Flutter Demo Home Page」とタイトルに書かれた画面が表示されます
- アプリの右下の丸にプラスマークのアイコンをタップ(クリック)すると、中央の数字がカウントアップされます
Dartを少しだけいじってみる(Hot reloadの実演)
- iOSシミュレーターとAndroid Studioが並び、どちらかで一方を隠さないように調整します
- iOSシミュレーターが見えている状態で"main.dart"ファイルの23行目あたりを'Flutter Demo Home Page'から'ホームページ'に書き換え、"main.dart"を保存します
- 保存した次の瞬間iOSシミュレーター上のアプリのタイトルが「ホームページ」に書き換わるのが確認出来ます
終わりに
ひとまずこれでFlutterの開発環境が一通り揃いました。実機でテストするにはもう一手間必要なのですが、今回はまずmacOS上に開発環境を構築する事だけに絞ってみました。この環境を使って色々とアプリを作成していくつもりです
![]()
参考サイト
- 投稿日:2019-03-30T18:58:55+09:00
タブレットとWeb両立プロジェクト開発(二)Cordovaをインストールします
Cordovaの特徴
Cordova(コルドバ)とは、オープンソースのハイブリッドアプリ開発フレームワークです。複数のプラットフォームで動作するモバイルアプリをワンソースで開発できます。
Cordovaは、Web標準技術(HTML5+CSS+JavaScript)を使って、iPhone/Androidなどの複数のモバイルOSに対応したクロスプラットフォームなアプリを開発することができるフレームワークです。
複数のOSに対してそれぞれネイティブアプリを開発する作業と比較すると、1つのソースコードで複数OSに対応できるため、大幅に開発コストを削減できます。Webアプリと同様の技術で開発するため学習コストも削減できます。Cordova CLIのインストール
Cordova CLIとは、Cordovaのコマンドラインインターフェイスです。
Cordova CLIは、すぐに使用できる形式でのnpm(Node.jsのパッケージ管理ツール)パッケージとして配布されるので、npmでCordovaのCLIをインストールします。npm install -g cordova #以下の結果が表示 added 438 packages from 349 contributors in 20.705s ╭───────────────────────────────────────────────────────────────╮ │ New minor version of npm available! 6.7.0 → 6.9.0 │ │ Changelog: https://github.com/npm/cli/releases/tag/v6.9.0 │ │ Run npm install -g npm to update! │ ╰───────────────────────────────────────────────────────────────╯インストール完了後、バージョンを確認しておきます。
cordova -v 9.0.0Cordovaプロジェクトの作成
Cordova CLIを使って、プロジェクトの作成を行います。今回は“Hello Cordova!”を出力するCordovaプロジェクトを作ります。
ちなみに、このプロジェクトはiOSまたはAndroidを全部対象とします。#プロジェクト作成コマンドの構造: cordova create ディレクトリ名 識別子 アプリ名 cordova create Hello com.demo.hello HelloCordovaHelloというディレクトリが作成されたので、次の処理が行われる前にHelloに移動必要です。
Cordovaプラットフォームを追加
作成したプロジェクトが対応するプラットフォーム用のファイルをCLIで追加します。
iosを追加すれば、コマンドは、cordova platform add iosとします。
androidを追加すれば、コマンドは、cordova platform add androidとします。
今回は、iosなので、以下を実行します。cd Hello cordova platform add ios #以下が表示 iOS project created with cordova-ios@5.0.0 Discovered plugin "cordova-plugin-whitelist" in config.xml. Adding it to the project Installing "cordova-plugin-whitelist" for ios Adding cordova-plugin-whitelist to package.json追加したらプラットフォームの確認をしておきましょう。
cordova platform ls #以下が表示 Installed platforms: ios 5.0.0 Available platforms: android ^8.0.0 browser ^6.0.0 electron ^1.0.0 osx ^5.0.0 windows ^7.0.0?削除コマンドは次の通りです。
cordova platform rm ios
あとはビルドやデバッグをVSCodeの拡張機能を使って実行できるようにします。
- 投稿日:2019-03-30T14:29:47+09:00
try! Swift Tokyo 2019 参加レポート(初日)
try! Swift Tokyo 2019の初日の参加レポートになります。
イベント概要
try! Swift はSwift言語での開発における最新の応用事例について集まる国際コミュニティです(公式サイトより)。
iOSに関するものが多いですが基本的にはSwiftであればサーバーでも、当然macOSも対象になります。
Swiftに関して最も大きいイベントの一つと言ってよいイベントです。
Twitter にて最新情報が発信されています。リンク
こちらに発表資料や文字起こしの情報をまとめて頂いているので、資料についてはそちらを参照していただけると幸いです。
レポート(初日)
スケジュール
Start Time Overview Speaker 10:00 native macOS application、またはAppKitの世界 1024jp 10:25 ⚡️?脱Swiftリテラル初心者 Yuki Aki 10:35 アクセシビリティのためのカラーコントラスト Liz Marley 11:30 Swift Light Jon-Tait Beason 11:55 ⚡️?限定的なimportの明示とその効果 Tomoya Hirano 12:05 protocol/extensionにジェネリクスを入れたい Hikaru Yoshimura 12:30 Keypath入門 Benedikt Terhechte 14:30 テストケースでMemory Leakを発見する Nobuo Saito 14:55 ⚡️?PixarのようなグラフィックをSwiftで実現する Michael Petrie 15:05 ARKitのアプリを作ろう Namrata Bandekar 15:30 ⚡️?Introducing to SourceKit-LSP Ryo Izumi 15:40 Swift Server Update Tom Doron 16:35 SwiftのアプリでCやC++、Objective-Cのフレームワークを使おう Cecilia Humlelu 17:00 ⚡️?MachObfuscator Kamil Borzym 17:10 Siri ShortcutsとNSUserActivityによるエンゲージメント推進 Nic Laughter 17:35 try Prototype! Maxim Cramer ※「⚡️?」は Lightning Talk です(念のため)
native macOS application、またはAppKitの世界
発表者はCotEditorなどを開発した方で、iOSが登場する前からmacOSアプリを開発してきたそうです。
iOSとmacOSのアプリの違い、ネイティブアプリとはどういうことか、というテーマでCotEditorの開発を実例に紹介してくれました。
ネイティブアプリとは、「特定のシステムに向けて設計・ビルドしていること」で、言語やフレームワークということではなく、OSの特性に合わせて、操作性は標準に準拠して作られているべきとしており、AppleのMazipanプロジェクトも単なるエミュレータと断じています。最近はWeb系の言語でアプリが作れたり、AndroidとiOSでデザインまで合わせる場合があったりもしますが、あらためてネイティブアプリらしさということを意識し、AppleのHuman Interface Guidelinesもチェックしてよいアプリを作るよう心がけねばと思いました。
アクセシビリティのためのカラーコントラスト
色は強力なコミュニケーションツールで、好きな色を使いつつもコントラスト比率を意識してよいアプリにしましょうという主旨の発表です。
HIGにもコントラスト比率についての言及があるそうです。
Color Contrast Checkerというコントラスト比率を計算するツールも紹介してくれています。Appleの最近の潮流としてダークモードを挙げていて、iOSにも取り入れられるのではないか、その際にはテキストやテーブルの背景色などのデフォルト定義についても変化があるのではないかとのことでした。
Swift Light
Glowforgeという3Dレーザープリンターの会社の方で、プリントするデザインを編集するiOSアプリにてどのようにSwiftを活用しているかというものでした。
込み入った画像周りの処理なので情報がなくて苦労したようです。protocol/extensionにジェネリクスを入れたい
Scalaエンジニアで型システムを研究していたとのことで、その辺りがテーマになっています。
リストに任意の型を詰め込みたいが、Anyのリストでできるものの型が失われてしまう。
そこで、異なる型を格納できるリスト(=Heterogeneous List(HList))の実装方法について検討したというもの。
HListは中の値と型を対応付けて覚えておくことができるというもので、プロトコルエクステンションでは型を拡張できるので実現できるようですがSwiftの型推論がまだ途上で込み入った実装になってしまうとか。高度な内容で中盤からほとんどついていけてなかったです。。
しかしながらこういう言語仕様をハックするような話題はワクワクします。
ちなみに、こちらにScalaでの実装についてもまとめているのを見つけました。Keypath入門
Swift4で追加されたKeypathの紹介。
例として、アプリの設定用structが2つあり、型もそれぞれ異なるがprotocolで編集処理をまとめたい。これをKeypathを用いて解決することをゴールとして話を進めるという流れ。
前提としてKeypathの仕様についての説明をした上で、上記の課題についてコードで順を追って説明して、最後に関連オープンソースライブラリとしてKuery、KeyPathKitを紹介してくれました。Keypathについては知らなかったのであとから調べて何となくは理解できたものの、今回紹介されていたコードは多少消化不良です。。
機会を見つけて使ってみたいです。テストケースでMemory Leakを発見する
よくクロージャでselfを使う際にweakをいれてなくて循環参照参照してしまう場合があるが、これを規約やコードチェックで防ぎ切ることは難しい。
これをMirror(リフレクション)とweakを使って検出できるようにしようというものでした。
出来たのがXCTAssertNoLeakで、ユニットテストでリークを検出できるようになります。Swift4.2については言語側の問題で機能しなかったり、Mirrorを使いこなすための工夫など難しい部分がありますが技術的に学びがありました。
例ではViewContorollerを使用していましたが、これはメルカリのMicroViewContorollerの考え方が前提になるのかなと思いました。
(FatViewControllerではXCTestを書くこと自体が厳しいのでは)ARKitのアプリを作ろう
ARKitを使ったアプリの紹介です。
平面を検知して門を作って表示してくれる「PORTAL」、道路にお絵かきする「ARSKETCH」。
(ストアにはなさそうなのでサンプルかもしれません)
基本的な機能や実装上の注意点だけでなくパフォーマンスについても言及していました。興味はあるものの実装したことはなかったので面白かったです。
やはりパフォーマンスが重要で、アンカーの制限、フレームレートを落とすなどチューニングが必要になるようです。Swift Server Update
Swiftでのサーバーアプリケーション開発の近況について話してくれました。
IBM、Vapor、Amazon、Appleなどで使われていて、Kitura、Vaporなどのライブラリがあります。
データベース周りはまだ混在していて、ロギングの一貫性というところにも課題があるようです。
The Swift Server Work Group(SSWG)がIBM、Apple、Vaporにより発表され、DBやネットワーク処理などのライブラリの開発を進めているとのことです。Kotlinも同じような動きがあったり、スマホアプリ開発にサーバー系の言語の適用する流れもあったり、技術が広がっていて面白いですね。ライブラリも充実してきているとのことで、ちょっとしたサーバーアプリケーションの開発にSwiftを使ってみるとかはやってみたいです。
SwiftのアプリでCやC++、Objective-Cのフレームワークを使おう
C、C++、Objective-Cで作られたライブラリを用途に応じてうまく使っていこうという話です。Swiftから直接C++は呼べないのでObjective-Cを中継するとか、Cのヘッダーが読めないのでmodulemapを作るなどの実践的なテクニックを紹介しています。
アプリの開発を生花に例えて使用する各種言語やライブラリを枝や花に例えていたのが印象的でした。以前C++のライブラリをさらにObjective-Cでラップして部品としてフレームワークを作っていたことがありますが、いろいろな背景やしがらみがある中でギリギリつながって、それでもちゃんと動いているところはすごいなと思ってました(言語仕様やコンパイラ、互換をとる仕組みなどが)。
Siri ShortcutsとNSUserActivityによるエンゲージメント推進
iOS12から追加された、Siri Shortcutsの導入方法についてのチュートリアルの紹介です。
簡単に導入できるということを伝えつつ、Tipsを示してくれていました。Siri関連はいままでまったく食指が動かず知識もなかったので改めて調べてみましたが、これはなかなか面白い機能ですね。ただ、導入紹介の記事などをみてもあまり利用者はいないようで、もともとSiriが日本人に合うのかというところが課題になりそうです。
try Prototype!
プロトタイプを開発するデザイナーの方による発表で、いくつかの質問から各々が自身のデベロッパーとしてのマインドセットを再構築しましょうというものでした。
- あなたはなぜデベロッパーなのか
- 誰のためにコードを書いていますか
- テクノロジーが変化したときあなたはどうしますか
- コードを書くときどれくらいの期間使用されるものと考えますか
- あなたのコードをリリースする際の阻害要因はなんですか
- どれくらいの頻度でテストしますか
組織やプロダクト、自身の考え方によっても変わってくると思うのでたまには立ち止まって上記の質問について考えを巡らせることも必要と感じました。
- 投稿日:2019-03-30T13:33:38+09:00
Swift 5 で String Interpolation をカスタマイズする
String Interpolation とは?
文字列リテラルの中に値を挿入(補完)できる機構のこと。
Swiftでは文字列リテラルの中に\(foo)という書き方でString以外の値を挿入(補完)できます。
- Interpolation = 挿入・補完の意。
- 語源的には inter(間) + polire(磨く) で「間に入れて修正する」というニュアンスがあります1。
- String Interpolation は「文字列補間」と訳されるのが一般的です2。
例
let age = 31 print("You are \(age)")->
You are 31デフォルトの挙動を変える
extension String.StringInterpolation { mutating func appendInterpolation(_ value: Int) { appendLiteral("XXX") } } let int = 10 let string = "number is \(int)" print(string)->
number is XXX引数を渡して出力を変化させる
extension String.StringInterpolation { mutating func appendInterpolation(_ value: Date, formatter: DateFormatter) { appendLiteral(formatter.string(from: value)) } } let date = Date() let formatter = DateFormatter() formatter.dateStyle = .short formatter.timeStyle = .short let string = "today is \(date, formatter: formatter)" print(string)->
today is 3/30/19, 1:22 PM独自の型の出力を新しく定義する
struct User { let honorific: String let name: String } extension String.StringInterpolation { mutating func appendInterpolation(_ value: User) { appendLiteral("\(value.honorific)\(value.name)") } } let user = User(honorific: "Mr.", name: "Tom") let string = "user is \(user)" print(string)->
user is Mr.Tom環境
Apple Swift version 5.0 (swiftlang-1001.0.69 clang-1001.0.45.2) Target: x86_64-apple-darwin18.2.0参考
- 投稿日:2019-03-30T12:54:19+09:00
そこら中の場所の「声」を聴けるアプリを開発してリリースしてみた話 【個人開発】
概要
昨年の9月に「Locavo」という「今いる場所の声を聴ける」をテーマにしたアプリを個人開発してリリースしました。
半年ほど運用をしてみて、自分自身で振り返ってみたかったということもあり、サービスの紹介や開発の経緯、開発内容を書いてみることにしました。個人開発をしている方や興味のある方の参考になれば幸いです。サービス紹介
「Locavo」は現在地の近くにある場所の「声」(≒音声ガイド)を聴くことができるアプリです。
(※Locavoは 「Location + Voice」の造語です)
2019年3月時点で、iOS向けにのみ公開しています。
App StoreLocavoはGPSの位置情報から音声読み上げ可能な近くにある場所を特定して、音声でその場所について読み上げます。
(最近QRコードからの読み上げにも対応しました)
Locavoを立ち上げた状態で散歩をすると、今いる場所の音声が自動で流れてきます。ぶらり散歩中や見知らぬ土地を旅行している時に使えます。詳しくは後述しますが、2019年3月時点で日本中の約7万個所以上のロケーション(観光地やレストラン、ランドマークなど)に対応しています。
また、先日声が聞こえる場所の「登録」機能をリリースし、誰でも好きな場所の音声を説明文と画像の投稿のみで行えるようになりました。
この機能を使うと、位置情報もしくはQRコードを使った音声ガイドを誰でもサクッと作れます。
一度声を聴いた場所は「ヒストリー」で振り返ることができます。
また、「トロフィー」と「ポイント」を用いたゲーミフィケーション要素も取り入れており、歩行距離や音声を聴いた回数によってアプリ内ポイントが加算されるようになっています。ポイントによってユーザ対抗の順位が決定します。
特定の場所の声を聴いたり、ある特定の条件をクリアするとトロフィを獲得できます。
開発したきっかけ
そもそもの背景として、かれこれ5、6年ほど前から「音声」を活用したサービス開発に強い興味がありました。
学生時代は、Android用の音声アシスタントアプリをリリースして数年間運用していたりしました。
おしゃべりアシスタント - Google Play
今回も音声を活かしたサービスを作りたいと漠然と考えていました。そんな中昨年、1ヶ月ほど特に何もせずにぶらぶら散歩ばかりをしていた時期があったのですが、よくわからない土地をひたすら歩き回っている際、ふと「今いる場所が勝手に自己紹介してきてくれたらいいな」と思ったのが今回のサービスの着想でした。
そこでプロトタイプを作り実際に音声を聴きながら歩いてみると、なかなかエキサイティングな散歩ができたので、思い切ってサービス化することにしました。サービスのビジョン
サービス化するにあたりビジョンを考えました。
このサービスで実現したいことは、
・音声による「お出かけ体験」のアップデート
にしました。歩きながら様々な場所の声を聴いて、新たな場所と"出会い"、散歩や旅行がより楽しい体験になることを目指します。そういったビジョンから、まずは新しい場所と出会う機会を多くしたい観点から
とにかく多くの場所の声を聴けるようにする ことにフォーカスしています。(コンテンツの質も重要ですが、まずは体験の数を増やしたいです)また、既存のジャンルであれば「音声ガイド」という表現が一番近いのですが、「新しい場所との出会い」というニュアンスを出したいので、このアプリは「ガイド」アプリではなく「今いる場所の声を聴く」アプリという表現にしています。
(流れる音声は、その場所ごとの自己紹介)理解のしやすさからアプリ内やストア文言にも「ガイド」という表現を使ってしまっていますが、今後うまく統一をしていきたいと思っています。
これまでの流れ
・2018/9月着想
・2018/9月末 iOS版初リリース
・2018/10月 UI改善リリース
・2019/3月 ロケーション登録機能リリース着想から1ヶ月程度で開発しリリースをしました。勢い余ってUIがcheapな感じのままリリースをしてしまったので、1ヶ月にUIを見直してアップデートをしました。
開発周りについて
アプリ
・Swift (iOSアプリ)
サーバサイド
・PHP (一部Kotlin導入中)
認証
・Firebase Authentication
外部ストレージ
・Firebase Storage
ホスティング
・Firebase Hosting
デザインツール
・Sketch
素材の多くは、icon8を利用させていただいてます
DB
・MySQL位置情報とコンテンツ決定
位置情報(緯度・経度)はiOS SDKのCoreLocationを利用しています。
アプリ起動中10m移動するごとにサーバへ位置情報を送信し、音声コンテンツの位置情報をキャッシュしているDBと照らし合わせて一番近いロケーションを返しています。(1km以内にコンテンツが存在している場合のみ)課題としては、
GPS(たまにWifi)を利用しているため、屋内だと精度が落ちます。また、位置情報が取得できた場合でも1F、2Fにコンテンツが重なっている場合などは判定ができません。
屋内もいずれ対応できたら良いと思っていますが、あらかじめビーコンを置いたり、地磁気を測ったり、Wifiを適切な場所に設定したりと、屋内の位置情報測位は技術的にもコスト的にもかなり導入ハードルが高いので、暫定対応として「QRコード」対応という案に落ち着いています。ほぼ活用されていないですが、Locavoアプリで読み取りが可能な「QRコード」をアプリ内で作成することができます。そのQRコードを掲示しておき、それを読み取ることで音声を聴くことができます。
コンテンツの収集
先述したように、このコンテンツは音声を聴くことができる場所の数が重要なので、量を重視したコンテンツの収集に力を注いでいます。音声コンテンツは、その場所の情報の取得と長すぎない適度な文字数にするための抽出が必要です。
Locavoでは現在、下記の情報を利用させていただいています。
・Wikipedia
・リクルートWebサービス
・Google Places API
+ オリジナルコンテンツWikipediaに関しては、ダンプデータの緯度経度情報を用いて、コンテンツの対象を決めており、アプリ内では、記事内からの抜粋を情報元の明記+リンク導線の設置をした上で利用しています。
オリジナルコンテンツをユーザが投稿できる仕組みをリリースしたので、今後はそちらでもコンテンツを増やしていきたいです。
音声合成
このサービスにとって、「声」は非常に重要な要素ですが、現在アプリの声として利用している音声合成は、実装工数の兼ね合いもあり、iOS7から利用が可能な「AVSpeechSynthesizer」を利用しています。
ちょっと機械的な印象が強いので、声は今後様々な音声合成を試していこうと思っています。(アプリ開発で利用が可能な音声合成は、以前こちらでまとめています)
https://qiita.com/maKunugi/items/90cbefe97887470fb328悩んでいること
ユーザ投稿型コンテンツの扱い
そもそもユーザが少ないこともあり、現在は大きな悩みではないですが、ユーザ投稿のコンテンツは一応運営側で確認をすることにしています。(不適切な内容が投稿された場合、他のユーザにも表示をされてしまうため、ガイドラインを設けてそれに準拠した審査を行います。)
現在は、ユーザが投稿 -> 運営(私)に自動通知 -> 運営(私)がチェック -> 運営(私)がDB更新
の運用になっており、利用ユーザを増やすことができたらもうちょっと工夫をしたいところです。漢字の読み間違い問題
現在、様々な音声合成サービスが利用可能ですが、そのままテキストを音声にすると頻繁に感じの読み間違いが発生します。
愛嬌と捉えてくれる方もいますが、音声コンテンツの質として読み間違いはクリティカルなので、うまく対処をしていかなければいけません。音声合成サービスの多くは、SSMLという音声合成用のマークアップ言語に対応をしているので、コンテンツのSSML対応をしていこうと思っています。
マネタイズノープラン
マネタイズ案を考えずに発信したので現在赤字運営です。今は楽しさドリブンで動けてるので良いですが、今後マネタイズはちゃんと考えていきます。
今後の展望
ユーザ獲得 & 改善
まだまだユーザが少ないので、ASOも含めてユーザ獲得のための改善をしていきたいと思っています。
ASOを全く最適化できておらず、ほぼStoreからの自然流入が見込めていません。Android版リリース
iOS版でユーザ獲得と改善をある程度繰り返した後、Android版をリリースしようと思っています。
Androidアプリの方が開発は慣れているので、iOSよりはスムーズにいきそうです。インバウンド向け
できることなら海外版を作りたいです。
まとめ
個人開発をしているLocavoというサービスに関する紹介でした。薄っぺらい内容になってしまいましたが、少しでも参考になることがあれば幸いです。利用している技術周りなど、別途深堀りたいと思っています。
Locavoは現在、App Storeからダウンロードが可能なので、興味のある方はぜひ使ってみていただけると嬉しいです!
ストアページ







