美文网首页iOSiOS 开发iOS Developer
程序内评价  之SKStoreReviewController

程序内评价  之SKStoreReviewController

作者: upworld | 来源:发表于2017-02-04 15:16 被阅读7339次

    在ios 10.3之后,系统提供了一个SKStoreReviewController类,可以帮助在app内部实现评价。App实现评价一般有下面几种方式。
    调用方式一:代码直接调用

            [SKStoreReviewController requestReview];
    

    这种方式属于程序内评价。
    实现效果如下:


    第一次弹出

    点赞之后效果如下:

    选中星星之后

    调用方式二:支持deep link调用。在app 链接地址后面拼上action=write-review。
    这种方式可以实现程序内评价。

    调用方式三:App 跳转。

        NSURL *url  = [NSURL URLWithString:@"itms-apps://itunes.apple.com/cn/app/jie-zou-da-shi/id493901993?mt=8"];
        [[UIApplication sharedApplication] openURL:url];
    

    属于传统评价方法。
    最终效果如下(先跳转到App Store应用->打开对应app ->模态出评论点赞界面):

    Paste_Image.png

    在SKStoreReviewController出来以前我们都是通过跳转App Store实现评价app 功能。实现方式如调用方式三。那是否意味着在10.3之后我们就一定要用SKStoreReviewController来取代之前实现吗?为了解答这个问题,我们先分析各自利弊。

    SKStoreReviewController的优势
    1,用户体验好(人性化)。
    2,调用简单(如调用方式一)。
    3,支持deep link(比较赞)。

    SKStoreReviewController的劣势
    1,调用方式一苹果有限制。

    /** Request StoreKit to ask the user for an app review. This may or may not show any UI.
    *
    *  Given this may not succussfully present an alert to the user, it is not appropriate for use
    *  from a button or any other user action. For presenting a write review form, a deep link is 
    *  available to the App Store by appending the query params "action=write-review" to a product URL.
    */
    + (void)requestReview;
    

    有个细节大家需要注意在测试的时候发现 “提交”按钮不能用。这里有
    官方文档说明:
    "When you call this method while your app is still in development mode, a rating/review request view is always displayed so that you can test the user interface and experience. However, this method has no effect when you call it in an app that you distribute using TestFlight."

    就是说测试的时候需要用TestFlight 测试。

    2,调用方式一苹果限制开发者在一年最多只能向用户调用三次评分UI。但是苹果文档没找到链接。
    参考

    3,调用方式一虽然简单,但需要有网络,如果没有网络调用不起作用(不会弹出UI)。

    4,调用方式一,虽然可以给app打分,但是不能给app写评价语。

    程序内评价UI的一些特性
    1,程序内评价UI呈现出来的UI显示的优先级比较高。

    评论UI会遮挡住他下面UI的交互

    评论UI唤起的时候,有一个蒙层盖在它下面的view上。如上图中红色的button就不能点。只能点击“Not Now”或者“星星”来消失这个UI。

    2,程序内评价UI是一个窗体级的UI,有点类似UIAlertView。
    为了验证,请看下面测试代码。当弹出评论UI的时候,我再模态出一个控制器(背景灰色)

    -(void)test{
        NSLog(@"touch");
        if (self.presentingViewController) {
            [self dismissViewControllerAnimated:YES completion:NULL];
        }else{
            [SKStoreReviewController requestReview];
            [self performSelector:@selector(present) withObject:nil afterDelay:10];
        }
    }
    
    - (void)present{
        ViewController *vc =[[ViewController alloc] init];
        vc.view.backgroundColor = [UIColor colorWithRed:0.3 green:0.3 blue:0.3 alpha:0.5];
        [self presentViewController:vc animated:NO completion:NULL];
    }
    

    具体效果(评论UI显示后,后面模态出来一个灰色的view(控制器))如下:


    Simulator Screen Shot 2017年2月4日 15.07.10.png

    根据效果可以推测,评论UI不是简单模态出来,如果是模态,我们后面模态出来的view 应该能够盖住评论UI。评论UI是一个窗体级的UI(和UIAlertView有点相似,但是UIAlertView是盖在评论UI上面的)。

    补充截图:
    弹出评论UI前后视图层级对比(多了好几个window):
    没有弹出评论UI


    没有弹出评论UI

    弹出评论UI后


    弹出评论UI后

    相关文章

      网友评论

      • 画眼线的乞丐:方式二不是支持deep link,人家文档是说 你还可以用deep link跳转到appstore评论 评分
      • 起个名字好难O0:在Debug模式下可以弹出,但是不能点击提交. 在testFlight模式下载的.甚至App Store下载的,都不会弹出评价框,这是为什么?
        BohrIsLay:@起个名字好难O0 :smiley: 上线后就没问题,可以提交吧?
        起个名字好难O0:@BohrIsLay 没有解决...各种忽悠老板...
        BohrIsLay:请问你解决了吗
      • 7422796d2ddc:调用方式一苹果限制开发者在一年最多只能向用户调用三次评分UI,那么调用次数用完了之后有什么方法可以检测到吗?而且这个三次是每个APP用户可以调用三次吗?
      • d38ccaf32970:纠正一个错误。
        > 就是说测试的时候需要用TestFlight 测试。

        TestFlight 是不会弹出来的,所以没办法测试
      • zx1798:想问一个问题,在线上环境的行为,如果我写在每次打开app就去请求,窗口会不会每一次都弹? 会评价完了,请求就失效吗? 会不会取消了几次之后,苹果就不再提示了?
      • HJaycee:所有定位、通知系统级别的弹窗都是通过springboard这个系统app弹出来的,也就是在应用外了
        HJaycee:@upworld 没有,因为应用内的弹窗是可以用分类拦截到的
        upworld:@HJaycee 这个关于系统弹窗有文档说明吗?
      • 小包包包:楼主,同时用的xcode8,没有SKStoreReviewController这个头文件,编译不过,怎么解决?
        480ea37b6951:#import <StoreKit/StoreKit.h>
        upworld:#ifdef __IPHONE_10_3
        if ([UIDevice currentDevice].systemVersion.floatValue >= 10.3) {//面临问题就是评价完之后,还让用户评价
        [SKStoreReviewController requestReview];
        return;
        }
        #endif
      • 卟师:我能转载分享吗?我会标住上作者和出处的
        upworld:恩,可以。一定要注明出处
      • SkimTblog:提交的按钮是灰色的,请问怎么处理?
        hi_xgb:@upworld 老兄,这句话的意思明明是用 TestFlight 版本调用这个api没有任何反应,你还让人家去用 TestFlight 测试:disappointed_relieved:
        upworld:参考https://developer.apple.com/reference/storekit/skstorereviewcontroller/2851536-requestreview?language=objc

        “When you call this method while your app is still in development mode, a rating/review request view is always displayed so that you can test the user interface and experience. However, this method has no effect when you call it in an app that you distribute using TestFlight."

        用TestFlight 测试。
        Farmers:同问
      • upworld:@Senvid丶 对的,在你的deeplink URL后面加上?action=write-review。
        1f9e1544ec34:@upworld ok谢了 这样的话 相当于 评价还是要跳到app store?只不过他直接帮你跳转到评分评价界面了 ? 我还以为直接在app内评价
        upworld:@UESTCLV 这里的deeplink指的是universal link。支持universal link就需要配置URL,在注册的url后面拼接上?action=write-review。建议先搞明白universal link
        1f9e1544ec34:这个API哪里有deeplink
      • Senvid丶:第二种方式deep link调用 的如何实现?是在程序内部弹出评论界面吗
      • 纳兰嘉懿:这个人性化

      本文标题:程序内评价  之SKStoreReviewController

      本文链接:https://www.haomeiwen.com/subject/tlgjittx.html