应用内评分

应用内评分

在应用制作相对完善之后, 可以通过应用内评分为自己增加更多的好评, 应用内评分的三种方式如下:

  1. 通用方式通过App内部打开网页形式,跳转到AppStore编辑评论,可评分,可评论。

    优点:方便,快捷,不受系统版本限制,目前最常用的方式。

    缺点:内部网页形式加载缓慢,等待时间长,加载失败概率大。

  2. iOS 6.0以后 在app内部加载AppStore 展示app信息

    优点:展示速度比方法三块快

    缺点:不能直接跳转到评论编辑页面,需要手动点击评论+编辑评论

  3. iOS 10.3 新增应用内评分功能,调用系统方法评分。

    优点:无须跳转,应用内系统弹框,方便快速。

    缺点:只能评分,且一年只能使用三次弹框。

下面就上面给出的三种方案给出具体的代码实现:

跳转到AppStore编辑评论

    NSString * nsStringToOpen = [NSString stringWithFormat: @"itms-apps://itunes.apple.com/app/id%@?action=write-review",@"1111111111"];//替换为对应的APPID, action=write-review表示跳转到appstore之后打开评论页面
    if (@available(iOS 10.0, *)) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:nsStringToOpen] options:@{} completionHandler:^(BOOL success) {
            
        }];
    }else{
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:nsStringToOpen]];
    }

在app内部加载AppStore 展示app信息

-(void)openAppStoreWithIdentifier:(NSString *)appId {
__block SKStoreProductViewController *storeProductVC = [[SKStoreProductViewController alloc] init];
    storeProductVC.delegate = self;
    __weak typeof(self) weakself = self;
NSDictionary *dict = [NSDictionary dictionaryWithObject:appId forKey:SKStoreProductParameterITunesItemIdentifier];
[storeProductVC loadProductWithParameters:dict completionBlock:^(BOOL result, NSError *error) {
/**
block: 从App Store加载产品信息时要调用的块。完成块在主线程上调用并接收以下参数:
result: YES如果产品信息成功加载,否则NO。
error: 如果发生错误,该对象描述错误。如果产品信息已成功加载,则此值为nil。
*/
    if (result) {
        [weakself presentViewController:storeProductVC animated:YES completion:nil];
    }
}];
}

#pragma mark - SKStoreProductViewControllerDelegate
-(void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {
  [viewController dismissViewControllerAnimated:YES completion:^{
  }];
}

应用内评分功能

导入头文件: #import <StoreKit/StoreKit.h>之后,直接使用如下代码:

if (@available(iOS 10.3, *)) {
        if([SKStoreReviewController respondsToSelector:@selector(requestReview)]) {// iOS 10.3 以上支持
            //防止键盘遮挡
            [[UIApplication sharedApplication].keyWindow endEditing:YES];
            [SKStoreReviewController requestReview];
        }

}


注意事项!!!!!!!!:

// 如果在网络通畅,但是苹果的服务不可到达时会卡主主线程十几秒, 一下逻辑可以避免,但是没有验证, 后期优化再加

   NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

   config.timeoutIntervalForRequest = 5;

   NSURLSession *session = [NSURLSession sessionWithConfiguration:config];

   [[session dataTaskWithURL:[NSURL URLWithString:@"http://itunes.apple.com/cn/app/id1556769120?mt=8"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

  isAppleServeAvailale = error == nil;

   }] resume];
SKStoreReviewController 使用中的坑
  1. 该方法在iOS 10.3之后才可以使用,所以在使用时需要进行版本控制;
  2. 这个方法主要用于申请用户评分,但这个方法不一定会显示UI,也就是说即使你调用了该方法也不一定会有评级弹窗显示,最终是否有显示主要有App Store的相关政策决定,所以这个方法不适用于任何来自按钮或者其他用户直接交互的操作;
  3. 在开发模式下,调用该方法一定会展示UI弹窗以供开发测试(不过提交按钮在开发模式下不能提交文本提交),但是如果你使用了TestFlight进行测试,会发现调用该方法没有任何反应;
  4. 当调用这个方法进行用户评价时,交互的全过程由系统进行控制(这一交互的整个过程,不允许自定义进行控制).
  5. 如果在一次启动中多次出发了该方法,且没有出现交互UI,时可能会出现window错乱,从而导致用户无法操作app,出现应用假死现象.尽量确保应用在应用的一次启动过程中,控制调用[SKStoreReviewController requestReview]方法的次数不超过一次.否则有可能会造成界面上所有的交互无法响应事件.
  6. 据说同一用户在同一个应用内每年只能提交三次评论,超出次数之后调用该方法就不会有任何反应,但未找到官方文档说明.

流程优化: 因为无法知道用户评几分,为了获得高的评分,对流程需要做一下优化。 比如:先询问用户是否对应用满意,如果满意则去评分,如果不满意则跳转到意见反馈页面,避免了打低分。