UnityIAP IAPボタンを用いた非消費型アイテムのリストア対応

## 経緯
iTunes Connectで申請が通りましたので、
UnityのIAPボタンを用いた非消費型アイテムのリストアの対応方法について記載したいと思います。
## 環境
- Unity5.5.0f3
- Unity IAP 1.9.3

## iOSのリストアはまだ要コーディング。
先にGoogle Playの方についてですが、こちらに関してはノーコーディングで作成することができました。
iOSについてはリストア機能をボタン含め用意しなければならないため、その点についてのみ追記する必要があります。
## リストアボタン実装時の注意点
リストアボタン実装時の注意点として、復元ボタンと同一のScene上にリストアする必要のあるIAPボタンが実装されている必要があります。
もしも同一シーン上にリストアする必要のあるIAPボタンが実装されていない場合は、画面外で良いので用意してやってください。
その際、ProductIDとOnPurchaseCompleteだけで良いので、実際に実装しているボタンと同じ値を使用してください。

## リストアボタンの実装
リストアボタンのプログラムについては、下記のように実装いたしました。
私の場合は非消費型アイテムが２つありましたので、２つのアイテムに対してリストアを実行しています。

```csharp:RestoreButton.cs
using UnityEngine;
using UnityEngine.Purchasing;

public class RestoreButton : MonoBehaviour {

    private IAPButton itemX;
    private IAPButton itemY;

    public void Start()
    {
        //IAPボタンを実装しているGameObjectを探して、格納する。
        itemX = GameObject.Find("XXXXButton").GetComponent<IAPButton>();
        itemY = GameObject.Find("YYYYButton").GetComponent<IAPButton>();
    }

    public void RestoreButtonClicked()
    {
        // iPhone/OSXでない場合
        if (Application.platform != RuntimePlatform.IPhonePlayer &&
            Application.platform != RuntimePlatform.OSXPlayer)
        {
            //iPhone/OSXでない旨のダイアログを表示するとベター
            return;
        }
        //サーバに接続されていない場合
        if (Application.internetReachability == NetworkReachability.NotReachable)
        {
            //サーバに接続されていない旨のダイアログを表示するとベター
            return;
        }
        // リストアを実行する。
        itemX.RestoreProduct();
        itemY.RestoreProduct();
    }
}
```
iPhone/OSXでない場合の対応を実施していますが、そもそもリストアボタンをiOS以外では表示しないようにしたほうが良いです。
上記でIAPButton.cs内のRestoreProduct()関数を実行していますが、こちらも実装する必要があります。
## IAPButton.csにiOS用リストア機能追加
[(Unity公式)リストアのトランザクション](https://docs.unity3d.com/550/Documentation/Manual/UnityIAPRestoringTransactions.html)
iOSのリストアをしたい場合は上記URLのプログラムを基にすれば良いのですが、
ではどう実装するのよということで、今回は下記のように実装しました。

```csharp:IAPButton.cs
    //ここから追加
    public void RestoreButtonClicked()
    {
        //一応OnInitialized失敗時対応を入れておく。
        if(controller == null)
        {
            return;
        }
        extensions.GetExtension<IAppleExtensions>().RestoreTransactions(result =>
        {
            if (result)
            {
            }
        });
    }
    //ここまで追加
    public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
    {
        this.controller = controller;
        this.extensions = extensions;   
    }
```

まず、公式サイトに記載されたリストアのトランザクションを実行する関数をIAPButtonStoreManagerクラス内の関数として作成する必要があります。
また、IAPButtonクラス内にあるIAPButtonStoreManagerクラスは外部から呼び出せないため、RestoreButton.csから呼び出すために、IAPButtonクラスの関数として下記を追加する必要があります。

```csharp:IAPButton.cs
    void PurchaseProduct()
	{
		Debug.Log("IAPButton.PurchaseProduct() with product ID: " + productId);
		IAPButtonStoreManager.Instance.InitiatePurchase(productId);
	}
    //ここから追加
    public void RestoreProduct()
    {
        IAPButtonStoreManager.Instance.RestoreButtonClicked();
    }
    //ここまで追加
```


リストア成功時には、OnPurchaseCompleteが実行されます。
なお、リストア失敗時には、OnpurchaseFailedは実行されません。

##申請の通ったアプリはこれです

![s_C3PXI1OVMAATuXL.jpg](https://qiita-image-store.s3.amazonaws.com/0/150633/fd6176ab-71be-6210-7d77-85d37674e63e.jpeg)

ぷよぷよシミュレータのようなものです。
iOS:https://itunes.apple.com/jp/app/id1195565268
google play:https://play.google.com/store/apps/details?id=com.feath.FourLinksSimulator