- 投稿日:2019-03-23T17:52:08+09:00
 
DroidKaigi 公式アプリのKotlin Multiplatform
どこでもKotlin #7 〜Kotlin MPP特集〜で話す予定の内容です!他の方の発表面白そうですし、先着順でまだ空きがあるようなので参加まだの方いれば早めにどうぞ!
https://m3-engineer.connpass.com/event/123055/概要
自分の知見というより、DroidKaigiアプリとしての知見になりますが、このままではもったいないので、書いておきます。
このあたり、自分はAndroid版の機能をレビュー、実装している間に、コントリビューターの方々がやっていただけたものになります。 @kikuchy さんが特にこの基盤作りをメインにやってくれていました。他にもiOSの有名な方々など、さまざまな方が開発に参加していただけました。DroidKaigiではAndroid版とiOS版をリリースしています。そこで培った知見を公開しておこうと思います。
https://itunes.apple.com/jp/app/droidkaigi-2019/id1450771424?mt=8
Kotlin Multiplatformとは
Kotlin Multiplatformを使うとAndroidとiOSでコードを共通化することが出来ます。
例えば、DroidKaigi 2019のアプリではKotlin Multiplatformを使って、APIの呼び出しや、アプリ内で使うモデルのクラスたちを共通化しています。現状のKotlin Multiplatformを使った開発では、UIの共通化を行うことはあまり考えられておらず、UIの部分はiOSであればSwiftで開発し、AndroidではKotlinまたはJavaを用いて開発を行い、APIやDBなどの部分を共通化するのが普通です。
これはいい面も悪い面もあります。UI、UXはプラットフォームに合わせて最適化しやすいのですが、逆に共通化できる部分は結構少なくなります。Androidでのビルド
KotlinのコードはJavaと同様にJavaのクラスファイル、バイトコードに変換され、それがDalvikバイトコードに変換されます。
Kotlin Multiplatformのコードも同様に変換されます。何も問題なく動作します。iOSでのビルド
Kotlin/Nativeによって、ネイティブバイナリにKotlinを変換することができ、JVMなどの仮想環境がないiOSでも実行することが出来ます。
基本的には以下のようなGradleタスクを動かして、iOSのFrameworkを作成して、使います。task packForXCode(type: Sync) { final File frameworkDir = new File(buildDir, "xcode-frameworks") final String mode = project.findProperty("XCODE_CONFIGURATION")?.toUpperCase() ?: 'DEBUG' def target = project.findProperty("kotlin.target") ?: "iOS" inputs.property "mode", mode dependsOn kotlin.targets."$target".compilations.main.target.binaries.findFramework("", mode).linkTask from { kotlin.targets."$target".compilations.main.target.binaries.findFramework("", mode).outputFile.parentFile } into frameworkDir doLast { new File(frameworkDir, 'gradlew').with { text = "#!/bin/bash\nexport 'JAVA_HOME=${System.getProperty("java.home")}'\ncd '${rootProject.rootDir}'\n./gradlew \$@\n" setExecutable(true) } } }そしてこのGradleタスクをXcodeのBuild Phasesで指定してあげることで、作ってあげることが出来ます。
使ったライブラリ
Kotlin Multiplatformのために現在、さまざまなライブラリが開発されており、DroidKaigiではKtor-ClientやTimber、Klockなどのライブラリを用いて開発を行いました。これを使うことで、Multiplatformで例えばAPIの呼び出しの処理を共通化出来たりします。
Ktor-Client
https://ktor.io/clients/http-client.html
Kotlin Multiplatformで使えるHttpClient。 OkHttpと連携できたり、GsonやKotlinx.Serializationと連携できる。インターフェースはRetrofitのほうがいい感じ。
Kotlinx.Serialization
https://github.com/Kotlin/kotlinx.serialization
Kotlin Multiplatformで使えるJSON, CBOR, Protobufフォーマットが使えるシリアライザ。gsonやmoshiの代わりに使う。
Klock
Kotlin Multiplatformで使える日付や時間を表現できるライブラリ。これを使わない場合は、自分でそれぞれのプラットフォームのDate型とかを定義しないといけないのでだいぶ助かります。JetBrains公式ではなく、今後JetBrains公式のものを考えているようなので、それが出るまでのつなぎになりそうな気がしています。
Timber
com.jakewharton.timber:timber-common:5.0.0-SNAPSHOTを使うことで、Androidで有名なログライブラリのTimberを使えます。
現状、Kotlin/Native(iOS向け)には対応していないので注意が必要DroidKaigiでの構成
DroidKaigiではAPI呼び出しの部分とModel部分を共通化しています。
Kotlin MultiplatformとMulti Module
なぜこのような構成になっているのか見ていきましょう。
まず最初に自分が作っていたときは機能を実装していかなくてはいけないので、APIやModelのモジュールを分けており、ModelはKotlin Multiplatform Project(MPP) モジュールで作っていました。
そこでiOS版を作るときに1つ問題が発生しました。iOSのプロジェクトから複数のKotlin MPPモジュールを参照できませんでした。
https://twitter.com/kikuchy/status/1083999701160972290 より
そのため1つのモジュールで、それぞれのモジュールを参照できるモジュール
ios-combinedを作成し、srcDirsを使って無理やり参照するという荒業により解決しました。sourceSets { final List<String> projectsList = [ ":model", ":data:api", ":data:api-impl", ... ] commonMain { projectsList.forEach { kotlin.srcDirs += "${project(it).projectDir}/src/commonMain/kotlin" }ただ、この構成も完璧ではありません。Android Studio 3.4以上で以下のエラーがAndroid Studio上で起こることが観測されています。現状は、settings.gradleを変更しながら開発する必要があります。
https://github.com/DroidKaigi/conference-app-2019/issues/738Kotlin MultiplatformとDagger
Kotlin MPPモジュールではプラットフォーム依存のコードも入れることが出来、Kotlin MPPモジュール内のAndroidのモジュール内限定になりますが、Daggerに関連するコードも書くことが出来ます。
この中の一番下の部分だけDaggerが使えます。
そのため、以下のように継承するなどすることで、配布することが出来ます。
Kotlin MPPモジュール内
interface DroidKaigiApi { suspend fun getSessions(): Response ... }open class KtorDroidKaigiApi constructor( val httpClient: HttpClient, val apiEndpoint: String, val coroutineDispatcherForCallback: CoroutineContext? ) : DroidKaigiApi { override suspend fun getSessions(): Response { ... // Ktorの処理は本筋ではないので省略 }api-impl/src/main(Android用のフォルダ内)
class InjectableKtorDroidKaigiApi @Inject constructor( httpClient: HttpClient, @Named("apiEndpoint") apiEndpoint: String ) : KtorDroidKaigiApi(httpClient, apiEndpoint, null)internal abstract class ApiModule { @Binds abstract fun DroidKaigiApi(impl: InjectableKtorDroidKaigiApi): DroidKaigiApiKotlin MultiplatformとKotlin Coroutines
iOSアプリからKotlinのsuspend functionを呼ぶことは通常できません。
そのため最初は以下のようにコールバックを作成し、実装していました。
これを1つずつ繰り返すのはかなり骨が折れる作業ではないでしょうか
override fun getSessions( callback: (response: Response) -> Unit, onError: (error: Exception) -> Unit ) { GlobalScope.launch(requireNotNull(coroutineDispatcherForCallback)) { try { val response = getSessions() callback(response) } catch (ex: Exception) { onError(ex) } } }Deferredを返す関数を作っておけば、iOSからDeferred.invokeOnCompletion()を呼び出せば可能であることに着目し、
Kotlinx_coroutines_core_nativeDeferredに対するextension functionを生やすことでRxSwiftのSingleを返せるようなメソッドを作り、それを使うことで @nukka123 さんが通信を可能にしてくれました。https://github.com/DroidKaigi/conference-app-2019/pull/601
Kotlin MPPのコード
override fun getSessionsAsync(): Deferred<Response> = GlobalScope.async(requireNotNull(coroutineDispatcherForCallback)) { getSessions() }Swiftの呼び出しコード
return ApiComponentKt.generateDroidKaigiApi() .getSessionsAsync() .asSingle(Response.self)SwiftのDeferredに対するextension function
import Foundation import RxSwift import ioscombined extension KotlinThrowable: LocalizedError { public var errorDescription: String? { return self.message ?? "No message. \(self)" } } extension Kotlinx_coroutines_core_nativeDeferred { func asSingle<ElementType>(_ elementType: ElementType.Type) -> Single<ElementType> { return Single<ElementType>.create { observer in self.invokeOnCompletion { cause in if let cause = cause { observer(.error(cause)) return KotlinUnit() } if let result = self.getCompleted() as? ElementType { observer(.success(result)) return KotlinUnit() } fatalError("Illegal state or invalid elementType.") } return Disposables.create { self.cancel() } } } }Kotlin MultiplatformとDynamic Feature Module
AndroidではDynamic Feature Moduleという後からモジュールを読み込むことで、アプリを小さくできる仕組みがあります。これを組み込もうとしたときに以下のようなエラーが出ました。
ZipException: duplicate entry: META-INF/ktor-client-core.kotlin_moduleこれは
ktor-client-core-1.1.2.jarとktor-client-core-jvm-1.1.2.jarで同じktor-client-core.kotlin_moduleが含まれているため起こっていると思われます。
現在、以下のissueを作成しており、S1の優先度で対応していただいているので、そのうち直ると思われます。
https://issuetracker.google.com/issues/125696148Parcelizeとの連携
ParcelableはAndroidでIntentにインスタンスを乗せてデータを送ったりするときに使う仕組みです。ParcelizeはAndroid向けのParcelableを簡単に作ってくれるKotlinの機能です。そのParcelizeは工夫することで、Kotlin Multiplatform Moduleの中でも使えます。
詳しくは以下の最高の記事があるのでそれをご覧ください。
https://aakira.app/blog/2018/12/kotlin-mpp-android-parcelable/ハマったポイント(うろ覚え)
Kotlin/Nativeの対応ArchitectureによるiOSでのリリースの制限
iOSのリリースの前日、
Undefined symbols for architecture armv7というエラーに悩まされる。そもそもサポートされていなかったので除外して解決。(古いiPhoneでは動かない模様)
https://github.com/JetBrains/kotlin-native/issues/1460Kotlin MultiplatformのクラスがAndroid Studio上で赤くて解決されない
enableFeaturePreview('GRADLE_METADATA')がないとダメ。
Kotlin Multiplatformで1モジュール指定でプラットフォームごとに読み込める理由はGradle module metadataファイル を読み込んで、platform-typeとか指定されているから勝手に使えるっぽい。この機能を使うにはGradle 4.7でenableFeaturePreview('GRADLE_METADATA')じゃないとうまく動かない。 pic.twitter.com/0HWlaPKvb9
— takahirom (@new_runnable) 2018年12月22日
https://github.com/DroidKaigi/conference-app-2019/pull/81
Gradle Metadataにもバージョンがあって、Gradle 4.7のMetadataとそれ以降のMetadataがあり、現状は、新しいバージョンのメタデータに大体のライブラリが対応しているので、それを使うと問題なく利用できます。(うまくビルドできないときは確認してみると良さそう)
ちなみに、Gradle 5.3からGradle module metadataは1.0になるみたいでまたライブラリのアップデート必要そうかもです
![]()
https://github.com/gradle/gradle/blob/de88b30e5374ede4dc393f5709fa71a7f349785e/subprojects/docs/src/docs/design/gradle-module-metadata-1.0-specification.mdまとめ
iOSの実装など、ほとんど自分の力ではないのですが、さまざまな人の力によりDroidKaigiのKotlin Multiplatformの実装がされました。このようにPRによって知見が集まってくることは、個人的にはかなりすごいことだと思っています。
- 投稿日:2019-03-23T16:08:45+09:00
 
5 Best Free Music Applications for iOS and Android in 2019
Use these five free musical apps for listening to music. These are some of the free music applications through which you can listen to your music library, know about some new artists, search radio stations nearby, listen the running music, etc. These applications are usually free of cost and are compatible with iPhone and Android. Locate the application store on the phone, and get these apps. You will be addicted to these apps in no time.
Pandora
Pandora is famous for a reason. Some people have ranked it to be one of the best music apps. Write about your favorite artist. Pandora will be playing songs along with the artists that are recommended by Pandora. The user will find new music that is similar to songs that you love already. Users can even rate the songs. It will learn and improve the suggestions that are based on ratings. Favorite artists can also be bookmarked for further access. Pandora app will be working very well if you have a connection with Wi-Fi for streaming the songs without any hindrance.Shazam
It is a fantastic application for music. If you are not able to remember the name of that song that is playing on the radio, then Shazam will listen to that song that is being played, and you will get to know about the artist and song. Users have the option of sharing the discovery along with watching a music video. Each song saved by the app will get stored as a tag. Simply share the tags. Lyrics can also be seen while listening to the song.Spotify
One of the best thing with Spotify is that numerous playlists can be made with it. Users can even listen to the playlists that have been created by other people. Premium can be tried for 30 days. Spotify is one fantastic music apps through which you may follow the artists and even sync the music directly from the desktop. Users can also make the radio station. Search the music by seeing the top lists. Favorite songs can be added, and they can be played later. Anyone can create the playlist and share it with other people. For example- Spotify is perfect for family functions.iHeartRadio
It incorporates radio, music, and podcasts, plus it shows 0 commercial, and it is known for working on numerous devices. If you are hearing to the music from the app directly, then you need to log in. Users can skip only a specific number of songs each day. If you need a radio application for the mobile device that you have, then iHeart is the best option for you. Tons of services are being supported by it. Listeners can even listen to podcasts; they can make their music stations depending on their favorite song; categories can be searched like the hits of the 80s and 90s. There are categories like rock, classical, holiday, oldies and much more. Listeners can save the stations as presets and an alarm clock too.Slacker Radio
One of the best thing with this app is that you don’t need to have an account for streaming the music. Several premade stations are there that are just a single tap away. Users can even adjust the quality of audio streaming. Users will be notified regarding the sports updates and music news. It is one free of cost application with so many radio stations. While listening to the radio, users can fine tune them for playing more songs. Users can even set up new stations or keep track of the currently playing songs.
Source : https://my-norton.net/5-best-free-music-applications-for-ios-and-android-in-2019/
- 投稿日:2019-03-23T16:01:50+09:00
 
UIViewをaddSubViewしたあとにオートレイアウトをはる
環境
- Xcode10.1
 - Swift4.2
 余談
Swiftでコード書いてるとUIViewControllerのviewに画面いっぱいのUIViewサブクラスをaddSubviewしたり
UIViewのコンテナにxibから生成したインスタンスをコードからaddSubviewしたりすることがあるかと思います。でも、addSubviewしただけでは親Viewに対してオートレイアウトが適応されていないのでレイアウト崩れすることがあります。
※UIViewControllerを想定して書いてるのでself.viewでもok
※hogeViewはUIViewのサブクラスview.addSubview(hogeView)addSubViewしたあとに親Viewの上下左右にオートレイアウトをはる
以下のようなUIViewのExtensionを作成すればVCに大量のオートレイアウトコードを書かなくて良いと思います
extension UIView { /// addSubViewした親Viewと同じ大きさにオートレイアウトを作成 /// /// - Parameter equalTo: addSubViewした親View func anchorAll(equalTo: UIView) { // AutoresizingMaskからAutoLayoutへの自動変換を無効化 translatesAutoresizingMaskIntoConstraints = false // 対象のViewの四辺にアンカーを貼る topAnchor.constraint(equalTo: equalTo.topAnchor, constant: 0).isActive = true leftAnchor.constraint(equalTo: equalTo.leftAnchor, constant: 0).isActive = true bottomAnchor.constraint(equalTo: equalTo.bottomAnchor, constant: 0).isActive = true rightAnchor.constraint(equalTo: equalTo.rightAnchor, constant: 0).isActive = true } }使い方
view.addSubview(hogeView) // viewの上下左右に合わせてオートレイアウトをはる hogeView.anchorAll(view)UIViewのaddSubViewメソッドごとラップしてしまってオートレイアウトを貼ってくれるaddSubView機能をextensionで書いてもいいかもしれないですね。
おしまい
- 投稿日:2019-03-23T15:53:39+09:00
 
5 Best Video Chat Apps for iOS in 2019
The iPhone, iPod, and iPad are revolutionary devices that are designed by Apple. They run on the iOS operating system and have completely changed the smartphone user experience.
Everything on the iOS devices assures the best quality and expertise. Same when it comes to video calling with iPhone and iPad.
Various apps work fine with iOS devices, but there can only be few best that standouts among others. Let’s have a look at those best video calling apps.
- Skype
 Skype is one of the best video chat apps, which runs on almost every platform be it iOS or any other. You can connect with your loved ones or meet and greet your business partners in a perfect manner through Skype. The updates available in this video calling app from time to time provide a fresh user experience every time.
- FaceTime
 FaceTime is a video calling app designed explicitly for iOS devices. It demands an internet connection and an Apple ID to connect with other people. This video chat app works great and ideal for connecting with your family.
WhatsApp is a popular messaging app used by people all around the globe. It grabbed more eyeballs when Facebook bought WhatsApp for 19 billion US dollars in 2014. This app offers an ideal video calling experience and great for chatting with your friends, family, and business associates.
- Google Duo
 Google is host to two video chatting apps; one is Google Duo, which offers one-to-one video chatting service over an internet connection and other is Hangouts that lets you talk in groups, supports texting, voice calls and more. It is a simple yet great option to connect with anyone you want through a video call. The video calling quality is outstanding in this app, and it works well over a poor internet connection as well.
- Facebook Messenger
 Facebook boasts more than 1000 million users and ensures an ideal video chatting experience. You can easily chat with your Facebook friends through Messenger over an internet connection. It also comes with other exciting features like a secret conversation, instant games, and more, which makes it overall a fun app to use. Get the best video calling quality possible and connect with the known people over the internet in a perfect way with these video calling apps. They are readily available on iOS. According to your personal choice, you can either use one or all of them.
Marry James is a Microsoft Office expert and her been working in the technical industry from last 10 year. As a technical expert, she has written technical blogs, manuals, white papers, and reviews for many websites such as office setup
Source : http://setuoffice.com/blog/5-best-video-chat-apps-for-ios-in-2019/
- 投稿日:2019-03-23T11:28:29+09:00
 
【SwiftChaining】 オブジェクトの保持
SwiftChainingの解説記事その7です。
SwiftChainingとは何か?というのは、こちらの最初の記事を参考にしてください。
SwiftChainingのメモリ管理
SwiftChainingでバインディング対象にしたオブジェクトは、監視を開始してもバインディング処理の中では強参照で保持されません。バインディング対象のオブジェクトは内部的に弱参照で保持されているので、意図的にどこかしらのプロパティなどで保持していないとバインディングの処理を書いたそばから解放されてしまって何も動かないということが起こってしまいます。
SwiftChainingのメモリ管理のポリシーとしては、「実装をし忘れて動かないことより、知らずに動き続ける方が複雑な問題を生む」という考えで極力バインディング部分で強参照しないようにしています。とは言え
UIControlAdapterやNotificationAdapterのような、本来の監視対象となるオブジェクトとの橋渡し的な役割のオブジェクトの場合、わざわざプロパティで保持するのも冗長です。そこで、例外として送受信オブジェクトを
Observer側に強参照で保持させるという方法を用意しています。Observerに監視対象のオブジェクトを保持させる
Chainableに適合したクラスでは、SwiftChainingの内部で保持させるためにretainという関数が呼び出せるようになっています。以前の記事に出てきた
NotificationAdapterを使うコードを例にすると、以下のようにchain()の前にretain()を書く感じになります。let observer = NotificationAdapter(MyClass.name, object: object, notificationCenter: .default) .retain() .chain() .map { (notification: Notification) -> String? in return notification.userInfo?["key"] as? String } .sendTo(receiver) .end()これで、
NotificationAdapterはobserverの内部に強参照で保持され、プロパティなどに保持する必要があるのはobserverだけになります。上記のコードで
retain()を挟まなかった場合には、chain()の後のmapを実行する時点で既にNotificationAdapterは解放されてしまっています。chain()はChainクラスを返すので、NotificationAdapterは必要なくなるからです。受信対象のオブジェクトを保持させる
sendTo()で受け取るReceivableに適合したクラスでもretain()が使えるので、また別の記事にあったKVOAdapterでイベントの受信をするような場合でも、Adapterをプロパティで保持しなくても良くなります。以下のように
sendTo()に渡す前にretain()を呼びます。self.isOnHolder .chain() .sendTo(KVOAdapter(self.mySwitch, keyPath: \UISwitch.isOn ).retain()) .sync() .addTo(self.pool)
retainを呼ぶ、というのがちょっと昔に戻った感じがしないでもないですが、解放は自動で積極的に行われるようにしているので、メモリリークを気にしないといけないようなものではありません。retainの書き忘れ
こういった
retain()のような記述はついつい書き忘れてしまいがちですが、バインディング処理の構築時にオブジェクトが解放されてしまっていないかどうかはAssertをしているので、どの変数にも入れず記述している場合は気付くことができるはずです。ただし、ローカル変数に代入してから扱う場合は、バインディング処理の構築中に解放されることはなく
Assertに引っかからないので注意が必要です。
- 投稿日:2019-03-23T00:27:08+09:00
 
iOSアプリをリリースするためにしたすべてのこと
iOSアプリをリリースするためにしたすべてのこと
はじめましてDysonです。この度iOSのアプリを個人でリリースしました。
iOSアプリをリリースするためにしたことを今回共有します。
これからアプリを作ろうとしている人にとって参考になれば幸いです。リリースしたアプリ
このアプリをリリースするためにしたことを大まかに書くと下記の8つになります。
- アイデア出し
 - 要件定義
 - 設計
 - 実装
 - テスト
 - アプリ審査
 - リリース
 それぞれの工程でどんなことをして、何を行ったか書いていきます。
1. アイデア出し
まずはなにわともあれアイデアが必要です。
最初のアイデアはANA主催のアイデアソンから生まれました。アイデアソンではチームを組み、旅に関するテーマでアイデアを出し合いました。
旅がテーマだけあって何十カ国も周ったことがあるような旅行好きも多く、
旅行で楽しかったことや困ったことなどいろいろな話を聞くことができました。
アイデアづくりにあたって、その道の人に話を聞くことはとても重要だと感じました。下記がアイデアソンで作ったものです。
1-1. ブレストのメモ書き
1-2. アンケートフォームとアンケート結果
1-3. カスタマージャーニーマップ
1-4. バリュープロポジションキャンバス
1-5. ビジネスモデルキャンバスそれぞれ紹介していきます。
1-1. ブレストのメモ
チームで話し合ったニーズや課題、体験などです。いろいろ発想を発散させていきます。この時点ではその場の思いつきも書いていきます。その中で検証すべき課題やアイデアの原型を作っていきます。
1-2. アンケートフォームとアンケート結果
ブレストで話し合った課題やニーズが本当にあるのか仮説の検証をする必要があります。その方法としてアンケートを取りました。
チームメンバーの協力のもと200名ほど回答をもらうことができました。ここで注意したことは誰から回答をもらうかです。例えば、家族向けサービスのアンケートなのに独身者ばかり回答をもらうと全然検証にならないので、誰から回答をもらうかは重要です。Googleのアンケートを利用しました。Googleスプレッドシートに結果が反映されるので、集計作業などが楽にできました。
1-3.カスタマージャーニーマップ
ブレストやアンケートの結果から体験をカスタマージャーニーマップを用いて可視化します。
カスタマージャーニーでどこを改善すべきか、改善後どのようにユーザーの気持ちが変化するのかチームで共有します。
1-4.バリュープロポジションキャンバス
ユーザーのニーズや課題、サービスが提供する価値を1つのキャンバスにまとめます。
1-5.ビジネスモデルキャンバス
ビジネスモデルを9つの要素に分けて、それぞれの要素がどう関わるかを1つのキャンバスに書いていきます。サービスで収益を上げるならしっかり作り込む必要があります。
2.要件定義
要件定義ではアイデア出しの末、磨き上げたアイデアからサービスやアプリをデザインしていきます。
要件定義はいろいろなやり方がありますが、自分でプログラミングもするので必要最低限の範囲で行いました。
具体的にはPReP model、アクティビティ図、画面イメージ&画面遷移図を整理しました。
詳細は後ほど説明しますが、要件定義ではサービスでどんな価値を生み出し、どのようにして実現するか整理することが重要です。そこで、PReP modelでサービスに関わる成果物を、アクティビティ図でサービスのタスクを整理します。そして、画面イメージ&画面遷移でより具体化していきます。
2-1. PReP model
PReP modelでは成果物(製品や情報など)に着目して、サービスが生み出す価値の過程を整理していきます。
ここで重要なのは成果物に着目していることです。サービスのアイデアをまとめていくと、どうしても何を使うか、どうやって作るかといった手段に気を取られてしまいます。
しかし、ユーザーに届けるべきは成果物であり、手段は何でもよいのです。
何で成果物を作るかは一旦後回しにして、成果物の生産過程を整理することが大事になります。
そのため、成果物に着目するPReP modelは重宝します。こちらがストーリー更新のPReP modelの例です。
簡単に見方を説明すると、文書アイコンが成果物です。成果物は必ずしも文書とは限りません。実線の矢印が成果物作成、点線の矢印が同期を意味します。矢印というシンプルな記法のため、手段を気にせず書けます。2-2. アクティビティ図
PRePでサービスが何を生み出すか整理しました。次はどうやって生み出すか整理します。
PRePの矢印の部分を具体化していきます。
成果物を生み出すための活動(アクティビティ)を書いていきます。PReP modelと整合性を取ることが大事です。作成したアクティビティ図です。
角丸の四角が手続き、ひし形が分岐、矢印がアクティビティの遷移です。
2-3. 画面イメージ&画面遷移図
アクティビティを実現するための画面をデザインしていきます。粒度に多少のブレはありますが、バッチ処理を除き、1プロセスに少なくとも1画面は必要になります。
画面の構成などをデザインします。ここまでくるとアプリっぽいです。
今回は横着をして画面イメージと画面遷移を1枚にしていますが、量が多いなら画面イメージと遷移図を分けた方がよいでしょう。
3.設計
要件定義でサービスのイメージを具体化していきました。ここからはどうやってプログラムに落とし込むか整理します。要件定義ではITの知識はあまり必要がありませんが、設計からは必要になります。
今回作成したものは下記です。
3-1. ER(Entity Relationship)図
3-2. クラス設計
3-3. 対応表3-1. ER図
データの構造を定義します。
データベースにどのようなデータを登録するか決めていきます。
3-2. クラス設計
アプリで使用するクラスを決めていきます。
ER図で決めたデータを扱うクラス以外に表示を処理するもの、共通処理を担うものなどを決めていきます。
3-3. 対応表
今まで設計したきたものの対応表です。漏れや重複がないかチェックします。
4. 実装
4-1. 環境準備
開発に必要なアカウントや設備、開発用ツールなどを用意します。
iOSなら開発用アカウントやMac、Xcode、確認用の実機iPhoneなどが必要になります。4-2. 技術調査
いきなりプログラミングを始めても良いですが、技術的に懸念点があれば事前に確認をしておきます。(作り始めてから解消不可能な問題があると手戻りや中止に繋がります。)
今回特にEvernote連携やローカルでDB利用があり、調査、検証を行いました。
Evernote連携は結構苦労しました、、4-3. プログラミング
調査も出来ているので、黙々とと作業をしていきます。つまずいたら、QiitaやStack OverflowやAppleの公式サイトを調べて解決していきます。
今回はSwiftで開発しました。比較的新しい言語のため、バージョンごとの差分があり、苦労する点でもあります。作ってる感があるので楽しい工程です。4-4. プログラミング以外
4-4-1. プライバシーポリシー作成
iOSの申請にはプライバシーポリシーが必要です。
ジェネレータをお借りして用意しました。4-4-2. 利用規約作成
結構骨が折れますが、申請に必要なものです。
他のアプリやサイトなどを参考にしながら作りました。4-4-3. 翻訳
多言語対応(日本語、英語、中国語)をしたかったため、ラベルなどを翻訳させます。英語はまだいいですが、中国語はさっぱりできないので、二重翻訳やiPhoneの言語設定を中国語などを参考に翻訳していきました。
5. テスト
きちんと動くかアプリをテストします。
無料アプリで機能数も少ないので、テスト項目は抑えめです。商用サービスなら徹底的にやりましょう。6. アプリ審査
作成したアプリをアップルに審査してもらいます。審査が通らないとアプリは公開できません。
審査用のキャプチャや説明文の準備などいろいろやることがあります。
アップルの審査は厳しいのでめげずに対応を頑張りましょう。どんなに納得のいかないリジェクトであっても真摯に対応しましょう。7. リリース
7-1. アプリ公開
審査が通ればアプリを公開できます。今回は審査が通れば自動公開の設定にしました。
iOSでは自動公開以外に時間指定の公開と手動公開があります。7-2. 宣伝
アプリが公開したら多くの人に使ってもらいたいでしょう。
SNSなどの媒体で宣伝をします。企業のアプリであれば、
お金を使って広告をだしたりします。今回はじめてiOSアプリをリリースしましたが、学ぶことも多くやってよかったです。
みなさんもぜひトライしてみてください。


















