objective-c++で、iOSアプリ内レビューを実装する

## cocos2dxでiOSアプリ内レビューを実装した際のメモです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/d0508e70-b7a6-9bfc-81e4-4eaaf776eed2.png)

※星を選択するとコメントもかけます。


## 実装

```objc:DE_BridgeCenter.mm
// アプリ内レビューする際のクッションページ
void DE_BridgeCenter::showReviewAlert(){
 
    // クッション用のポップアップ文言ローカライズ
    std::string _title = LanguageManager::getInstance()->getString("ios_review_popup_title");
    NSString *title = [NSString stringWithUTF8String:_title.c_str()];
    std::string _message = LanguageManager::getInstance()->getString("ios_review_popup_body");
    NSString *message = [NSString stringWithUTF8String:_message.c_str()];
    std::string _btn_cancel_mes = LanguageManager::getInstance()->getString("ios_review_popup_btn_cancel");
    NSString *btn_cancel_mes = [NSString stringWithUTF8String:_btn_cancel_mes.c_str()];
    std::string _btn_ok_mes = LanguageManager::getInstance()->getString("ios_review_popup_btn_ok");
    NSString *btn_ok_mes = [NSString stringWithUTF8String:_btn_ok_mes.c_str()];

    
    UIAlertController *alert = [UIAlertController alertControllerWithTitle: title
                                                                   message: message
                                                            preferredStyle: UIAlertControllerStyleAlert];
    
    UIAlertAction *cancelAction = [UIAlertAction  actionWithTitle: btn_cancel_mes
                                                            style: UIAlertActionStyleCancel
                                                          handler: nil];
    
    [alert addAction: cancelAction];

    UIAlertAction *reviewAction = [UIAlertAction  actionWithTitle: btn_ok_mes
                                                            style: UIAlertActionStyleDefault
                                                          handler: ^(UIAlertAction *action) {
                                                              goReviewAlert();
                                                          }];
    [alert addAction: reviewAction];
    
    
    // 親ViewContoller検索
    UIViewController *baseView = [UIApplication sharedApplication].keyWindow.rootViewController;
    while (baseView.presentedViewController != nil && !baseView.presentedViewController.isBeingDismissed) {
        baseView = baseView.presentedViewController;
    }
    [baseView presentViewController:alert animated:YES completion:nil];
    
}


// アプリ内レビュー表示
void DE_BridgeCenter::goReviewAlert(){
    
    
    float iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];


    if (iOSVersion >= 10.3f) {
        // iOS version 10.3以上はアプリ内レビューへ
        if([SKStoreReviewController class]){
            [SKStoreReviewController requestReview];
        }
    }
    else {

        // ストアへ誘導...iOS11からはSKStoreReviewControllerを推奨しているようなのであれですが。。
        [[UIApplication sharedApplication]
         openURL:[NSURL URLWithString:[NSString stringWithUTF8String:URL_REVIEW_APP]]];
    }
}
```

あとは、cocos2dxのClassから```showReviewAlert()```を呼び出せば完成！

リクエストが成功しない場合の対処や、表示頻度の設定、適宜お願いします。。！（泣）

## なぜかレビューポップアップが発火されない場合

* ネットワークにつながっていない
* ユーザーのスマホの設定による（iOS11以降？「設定」 > 「iTunes StoreとApp Store」 > 「App内評価とレビュー」で設定可
* レビューの表示制限にひっかかっている（１年に３回までしか表示できない？）
* iOSのバージョンが古い
* TestFlightで配信している （僕の環境では表示されるが、星を選択し「送信」ボタンがdisableになっており送信できないように制限されておりました。本番公開後はちゃんと押せるにようなってました）

## 実際実装してのよかった事

* いままで３ヶ月に１回程度でレビュー１件程度だったものが、実装後すぐにつき１ヶ月で２件。**６倍！！？**（※もちろんアプリなど条件によります。）
* レビューをつけるユーザーはだいたい、すでについているレビューを参考に星をつけてしまう傾向があるため、もともと**総評が★２とかでも、先入観がないため高評価をつけてもらえる可能性がある！！?**（その逆の可能性もありますが。）
* やっぱ画面遷移せずにレビューつけれるのは、ストレス少なくていい！




## 参考にさせて頂いた記事　（大変参考なりました！:pray:

また、Unityや、swift,objc版などの参考記事はあったのですが、cocos2dxでも使えるものがなかったので、
メモさせて頂きました。 


### swift版
https://qiita.com/asashin227/items/f0c44821020af6ee846d
https://qiita.com/yamataku29/items/afedb457e2fe7e20438c

### objective-c版
https://qiita.com/gremito/items/30dd31c71eb38ddb8b4e

### Unity版
http://kan-kikuchi.hatenablog.com/entry/iOS_Device_RequestStoreReview

### レビューが発火されない原因調査

https://apptopi.jp/2018/01/07/ios11-in-app-review/
https://qiita.com/s_higeru/items/db9ddb09d6adbac2da67
http://crossbridge-lab.hatenablog.com/entry/2017/06/14/113255