[問題]スマホアプリにお試し期間の概念は必要か？

# はじめに

本題に入る前に、**マネタイズ**についてお話します。

スマホアプリで**マネタイズ**するには、大きく2つパターンがあります。

**1. 利用料無料で、広告代で得る**
**2. 有料(買い切り、サブスクリプション、追加課金制)**

(自分が知らないだけで、他にもあるかも知れませんが、ここでは触れません)

**1.** の利用料無料の場合は特に問題ありません。ずっと無料ですから、飽きたり気に入らなかったら、アプリを削除すれば問題無いと思います。

**問題は、2.です。**

**2.** の有料の場合、買わないとそのアプリが遊べない・利用できないわけですから、自ずと買わざるを得ません。ですが、買ってつまらなかった・想像していたものと違うなど理由によってはお金を出し惜しみして買ってくれない人も少なくありません。そこで登場するのが、**お試し期間**です。

# お試し期間とは？
有料アプリを使わせるために、無料のお試し期間を設け、その間のみ有料時のサービスが利用できる仕組みのこと。
**※ただし、ここで無料期間としていましたが、無料ポイント、初回のみチケット無料のようなものも含まれます。**

# 何が問題か
ここまでの話だけでは、特に問題ないのではないか？

と思う人も居るでしょう。

アプリ運用する側(メーカー)が困ること・・・

それは何か・・・

### 無料期間(無料ポイント、初回のみ無料、1週間無料)が何度も利用できてしまう

ってことです。

？？？？？

何を言っているのか、分からない人もいると思います。
ゲームアプリでよくあるのですが、いわゆる**リセマラ(リセットマラソン)**を指します。

**[リセマラとは](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%83%9E%E3%83%A9%E3%82%BD%E3%83%B3)**
>リセットマラソン（Reset Marathon）とは、主にソーシャルゲームにおいて、ソフトのインストールとアンインストールを何度も繰り返すこと、及びそれにより自分が目的とするアイテムを入手する方法のこと (Wikipediaより)

ゲームアプリだとなじみのある行為だと思いますが、一般的なツールアプリ・ライフスタイルアプリなどにおいては、ガチャではなく、**無料期間(無料ポイント、初回のみ無料、1週間無料)**を言います。そして、企業側からすると無料期間(無料ポイント、初回のみ無料、1週間無料)が何度も利用できてしまうと、**損失**につながります。

そして、この「無料期間(無料ポイント、初回のみ無料、1週間無料)が**何度も**利用できてしまう」問題をエンジニアは解決しなくてはいけません。

# どうやって？
実際にアプリを制作してみるとぶち当たる壁が存在します。

このアプリをアンインストールしたとしても、過去にインストールされた経歴があることを判断しなくてはいけません。

ですが、端末内データに何かしらの**フラグをキャッシュとして保存**したとしてもアプリ削除したら消えてしまいます。また、メールアドレスで判断しようとしても**複製**できてしまうため、意味がありません。

そこで登場するのが、**端末固有ID**です！

# 端末固有IDとは？
端末それぞれに不変のIDとして存在する識別子のことを指します。そして、その識別子を元にインストール経歴があるのか判断します。

一般的に多くのAndroid/iOSアプリにおいては以下の識別子を利用します。

* Android
    * ANDROID_ID
* iOS
    * AdvertisingIdentifier

ただし、これらのIDは端末を継続して利用している間のみ値が変更されないです。
各詳細について見てみましょう。

**[ANDROID_ID](https://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID)**
>  The value may change if a factory reset is performed on the device or if an APK signing key changes.
> デバイスで出荷時設定へのリセットが実行された場合、またはAPK署名鍵が変更された場合、値は変更される可能性があります。

**[AdvertisingIdentifier](https://developer.apple.com/documentation/adsupport/asidentifiermanager/1614151-advertisingidentifier)**
> Unlike the identifierForVendor property of the UIDevice, the same value is returned to all vendors. This identifier may change. For example, if the user erases the device. For this reason you should not cache it.
> UIDeviceのidentifierForVendorプロパティとは異なり、すべてのベンダーに同じ値が返されます。 この識別子は変更される可能性があります。 たとえば、ユーザーがデバイスを消去した場合などです。 このため、キャッシュしないでください。

と記載されています。

つまり、端末を**工場出荷状態**(端末リセット)に戻すことで、これらの**IDが初期化**されてしまいます。

では、工場出荷状態に戻しても変わらないIDを利用すればよいのではないか・・・？
と思う方が居ると思います。

残念ながら、それはできません。

Androidに関しては、[永続的なデバイス ID（IMEI / MEID、IMSI、SIM、ビルドシリアル）](https://source.android.google.cn/devices/tech/config/device-identifiers?hl=ja)はJava/Kotlinから取得できない制限がかかっています。そのため利用できないのです。
また、iOSも同様でMACアドレスは取得できません。

# こんなものも・・・
工場出荷状態に戻して、端末固有IDをリセットするのがめんどうである時にこんなアプリもあります。

[同じ端末で2つのLINEアカウントが使い分けられるようにできる禁断のアプリ「並行世界」の使い方](http://tanweb.net/2017/12/14/17223/)

このアプリを利用するとこのアプリ自体が仮想OSの役割を果たし、同じアプリを２つ起動することができます。

つまり、並行世界を起動した上でLINEを起動すると、1端末で２つのアカウントを利用することができます。

これは実質、**端末固有IDを複製**しています。

このアプリを利用すると簡単に端末固有IDを複製できてしまうので、何かしら対策しないといけません。

# では、どうするか？

対策として考えられることが、Android/iOSアプリで決済する時のカード情報をサーバー側で管理しておき、同じカード情報であった場合、無料期間(無料ポイント、初回のみ無料、1週間無料)を利用できなくすれば問題ないと思います。

ですが、無料期間(無料ポイント、初回のみ無料、1週間無料)リセマラのために、カード情報を入力するアプリは多くありません。

そもそもの問題として、**お試し期間**という概念は必要でしょうか。という問題定義に戻ります。

**無料期間(無料ポイント、初回のみ無料、1週間無料)**の機能を追加したが故に、無限に悪用できてしまい、本来有料ユーザーを増やしたいがためにやった行為なのに、逆に減らしてしまうのではないか。と懸念されます。

そこまでのリスクを追うくらいであれば、無料期間(無料ポイント、初回のみ無料、1週間無料)は**要らない**のではないか。と私は思います。

以上です。


# 参考
* iOS/Androidで端末を識別するIDまとめ
    * https://iridge.jp/blog/201404/4836/
* デバイス ID
    * https://source.android.google.cn/devices/tech/config/device-identifiers?hl=ja
* 一意の識別子に関するベスト プラクティス
    * https://developer.android.com/training/articles/user-data-ids?hl=ja
* ANDROID IDがどのように生成されているかざっくり調べた
    * https://qiita.com/operandoOS/items/b41fa4a1c6c009c64a10
* SSAID取得
    * https://gist.github.com/Koronaa/d204bc29a122f9adef857d8935fd7cbc