版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.12.18 星期二 |
前言
StoreKit框架,支持应用内购买和与App Store的互动。接下来几篇我们就一起看一下这个框架。感兴趣的看下面几篇文章。
1. StoreKit框架详细解析(一) —— 基本概览(一)
Why Do Ratings and Reviews Matter? - 为什么评级和评论很重要?
首先看下写作环境
Swift 4.2, iOS 12, Xcode 10
在本教程中,您将学习如何使用SKStoreReviewController
和其他可用API在iOS应用程序中请求应用程序评级和评论。
在本教程中,您将学习如何在iOS应用中请求评分和评论。从iOS 10.3
开始,Apple推出了新的SKStoreReviewController
类来标准化这种交互。在本教程中,您将学习如何正确实现此API,以及了解如何最大限度地从您的快乐用户那里获得好评的机会。
iOS App Store上有超过一百万个应用程序,在任何给定的应用程序类别中都有数百或数千个应用程序。用户越来越难以知道应用程序是否值得下载和尝试。
在做出购买决定时,用户也习惯于依赖评级和评论,无论是在亚马逊上购买产品,寻找餐馆,预订酒店还是看电影。因此,在下载应用程序之前,潜在用户可以访问所需的信息至关重要。高评级和大量评论也会给这些潜在用户留下积极印象,并增加他们安装您应用的可能性。
评级和评论有助于提高您在App Store上的排名的另一个方面。根据Forrester的一项研究study,63%的应用程序是通过App Store搜索发现的。你如何让你的应用程序排名更高,并在如此拥挤的市场中脱颖而出? App Radar所做的研究Research表明,评级的数量和平均值以及评论数量对您的应用在App Store搜索结果中的排名有很大影响。
为了提高应用在App Store中的可发现性,以及在应用到达应用页面后增加安装应用的用户数量,重要的是您的应用会有大量的评分和评价。
在开始之前,您可能仍然想知道内置提示要求用户为您的应用评分的重要性?为了向您展示它的有效性,让我们来看看App Store上的另一个流行应用程序 - Instagram
。
正如你在上图中看到的那样,2017年8月发生了一些事情,但它有什么可能呢? 来自Medium post from Clément Delangue指出,Instagram此时将SKStoreReviewController
添加到其应用程序中 - 只需看看它的影响!
接下来,您将看到如何与用户实现类似的结果。
开始
在本教程中,您将获取一个应用程序,该应用程序提供可搜索的鸟类声音列表,并使用SKStoreReviewController
提示用户对应用程序进行评级。
要开始使用,打开开始项目,导航到Chirper-Starter
文件夹并在Xcode中打开Chirper.xcodeproj
。 构建并运行应用程序,您将看到以下内容:
Requesting App Ratings - 申请应用评级
通过向项目添加新文件开始。 右键单击项目导航器中的黄色Chirper
文件夹,然后选择New File ...
,从显示的选项中选择Swift File
,单击Next
并将其命名为AppStoreReviewManager.swift
。
将以下内容粘贴到新创建的文件中:
import StoreKit
enum AppStoreReviewManager {
static func requestReviewIfAppropriate() {
}
}
你在这里做了一些重要的事情:
- 1) 导入
StoreKit
框架。 StoreKit允许您执行与Apple商店相关的许多操作,例如管理应用内购买,检查Apple Music功能或在应用内显示产品推荐。 但是,在本教程中,您将使用它来触发评分提示。 - 2) 创建一个名为
AppStoreReviewManager
的枚举。 您将使用它作为命名空间来包装其中的静态函数和属性。 枚举对此很有用,因为如果它们没有声明任何情况,就无法初始化它们。
接下来,您需要让StoreKit
向用户请求审核。 您可以使用静态SKStoreReviewController.requestReview()
来完成此操作。 将以下内容添加到requestReviewIfAppropriate()
:
SKStoreReviewController.requestReview()
为了测试它是否有效,请在用户播放声音时调用此方法。 打开BirdSoundTableViewCell.swift
并在startPlaying(with:)
结束时调用你的新函数:
AppStoreReviewManager.requestReviewIfAppropriate()
构建并运行应用程序。 点击其中一个声音上的Play
按钮。 你会看到一个提示,要求你给应用评分!
很好! 只需一行代码,您就可以请求用户为您的应用评分!
注意:由于您处于开发模式,
Submit
按钮将显示为灰色。 对于通过App Store使用您的应用的用户,它就会被启用。
SKStoreReviewController Limitations - SKStoreReviewController限制
Apple确实对您使用此API的方式施加了某些限制:
- 无论您请求评分提示多少次,系统都会在365天内最多显示三次提示。
- 调用方法并不能保证提示会显示。 这意味着响应按钮点击或其他用户操作调用API是不合适的。
- 系统未必显示与当前
bundle version
匹配的应用程序包版本的提示。 这可确保不要求用户多次review
相同版本的应用。
注意:根据您运行的构建类型,审阅提示的行为会有所不同:
- 开发:每次请求提示时显示。
- 测试飞行:从不显示提示。
- App Store:显示上述限制。
Finding the Right Time to Request a Rating - 找到申请评级的合适时间
选择显示此提示的位置和时间对于您使用此API的成功至关重要。
在请求应用评级时,系统向用户显示提示的那一刻可能会对结果产生很大影响。例如,当用户处于任务中间时,您不应要求进行评级。此外,如果您跟踪应用程序崩溃,您应该确保在请求评级之前等待一天或更长时间。
相反,当用户满意时,您应该努力询问评级。例如,在用户重复返回您的应用程序,完成游戏级别或完成视频通话等后,无论您选择跟踪并触发评级提示,都要确保用户有机会体验应用程序的全部价值主张 - 这样,可能产生更积极的评论结果。
注意:按照上述建议后,您可能想知道为何在播放录音时触发提示。它不会只是惹恼用户并导致评级不佳吗?你是对的;在播放结束时触发提示会更合适。要使本教程中的测试变得简单,您可以将其保留在原来的位置,但是,如果您真的想要,可以将调用移到
BirdSoundTableViewCell.didPlayToEndTime(_ :)
。
Adding Review Request Logic in the Sample App - 在示例应用程序中添加Review请求逻辑
在示例应用程序中,您将使用一种策略,一旦他们至少播放了三个录音,您将要求用户进行评级。 这个数字是故意低的,所以你可以测试这个概念。 在真实世界的应用程序中,您可能希望将此数字保持在更高的类似用户操作。
打开AppStoreReviewManager.swift
并使用以下内容替换requestReviewIfAppropriate()
:
// 1.
static let minimumReviewWorthyActionCount = 3
static func requestReviewIfAppropriate() {
let defaults = UserDefaults.standard
let bundle = Bundle.main
// 2.
var actionCount = defaults.integer(forKey: .reviewWorthyActionCount)
// 3.
actionCount += 1
// 4.
defaults.set(actionCount, forKey: .reviewWorthyActionCount)
// 5.
guard actionCount >= minimumReviewWorthyActionCount else {
return
}
// 6.
let bundleVersionKey = kCFBundleVersionKey as String
let currentVersion = bundle.object(forInfoDictionaryKey: bundleVersionKey) as? String
let lastVersion = defaults.string(forKey: .lastReviewRequestAppVersion)
// 7.
guard lastVersion == nil || lastVersion != currentVersion else {
return
}
// 8.
SKStoreReviewController.requestReview()
// 9.
defaults.set(0, forKey: .reviewWorthyActionCount)
defaults.set(currentVersion, forKey: .lastReviewRequestAppVersion)
}
下面进行详细分解:
- 1) 声明一个常量值,以指定用户必须执行具有
review
功能的操作的次数。 - 2) 从
User Defaults
中读取用户自上次请求的review
以来执行的当前操作数。
注意:此示例项目使用
UserDefaults
上的扩展来消除在访问值时使用“字符串”键入的键的需要。这是一个很好的做法,以避免意外错误键入一个键,因为它可能会导致您的应用程序中很难找到错误。您可以在UserDefaults + Key.swift
中找到此扩展程序。
- 3) 增加从
User Defaults
读取的操作计数值。 - 4) 将递增计数设置回
User Defaults
,以便下次触发该功能。 - 5) 检查操作计数是否已超过触发review的最小阈值。如果没有,该函数现在将返回。
- 6) 阅读当前
bundle version
以及上次提示期间使用的最后一个bundle version
(如果有)。 - 7) 在继续之前,请检查这是否是此版本应用的第一个请求。
- 8) 请求
StoreKit
要求review。 - 9) 重置操作计数并将当前版本存储在
User Defaults
中,以便您不再在此版本的应用程序上请求。
Putting It All Together
构建并运行应用程序。 这一次,如果您播放声音,它将不会立即显示review提示。 再播放两次声音,只有这样,应用程序才会显示评级提示。 您还会注意到,无论您播放多少条录音,都不会再次显示提示。
单击项目导航器中的Chirper
项目图标,然后再单击提供目标列表下的Chirper
。 更新Build
字段中的值以更新应用程序Info.plist
中的CFBundleVersion
值。
构建并运行应用程序。 再次,播放更多录音。 一旦.reviewWorthyActionCount
值再次超过3
,则步骤7中的版本检查将成功,并且由于您已更改了bundle version
,系统会再次提示您为新版本的应用程序提供另一个评级。
Manually Requesting a Review - 手动请求Review
因此,现在您知道如何在使用应用程序时提示用户提供评级,您将继续探索如何让用户手动review应用程序,而无需等待AppStoreReviewManager
决定是否应该。
1. App Store Product Page URL - App Store产品页面URL
首先,您需要知道App Store上的应用程序的URL。 如果您的应用已经上线,那么这很容易;您可以在Google中搜索自己的应用并复制网址。 或者,您可以在App Store上找到它并点击产品页面上的...
按钮以显示Share App ...
选项,该选项允许您将链接复制到剪贴板。
如果您仍在构建应用程序的第一个版本但尚未在App Store上发布,请不要担心;只要您已经使用App Store Connect设置了应用程序,那么在将最终提交到App Store Review之前,您仍然可以获得该链接。 要找到此链接:
- 1) 登录App Store Connect。
- 2) 选择
My Apps
。 - 3) 单击
App Information
中的应用程序,然后您将在该页面底部找到指向View on App Store
的链接。
您最终获得的URL将如下所示:
https://itunes.apple.com/us/app/rwdevcon-conference/id958625272?mt=8
在继续之前,您将稍微清理URL,因为某些组件不是必需的,并且可能会随时间而变化。 您可以从URL中排除国家/地区代码,应用名称和查询参数,以便上面的示例将变为以下示例:
https://itunes.apple.com/app/id958625272
上面的确切URL已包含在示例项目中的SettingsViewController.swift
中。 如果您想替换自己的应用程序的URL,请继续更改productURL
常量,否则保持原样并且您将查看RWDevCon
应用程序。
Writing a Review - 写评论
现在您有了应用程序的产品URL,您可以使用它来直接将用户带到App Store中的Write a Review
操作。 您所要做的就是将一个带有name
操作和值write-review
的查询参数附加到product page URL
,然后,在iOS设备上打开它直接进入App Store
应用程序。
将此功能添加到示例应用程序!
打开SettingsViewController.swift
并将以下代码添加到writeReview()
:
// 1.
var components = URLComponents(url: productURL, resolvingAgainstBaseURL: false)
// 2.
components?.queryItems = [
URLQueryItem(name: "action", value: "write-review")
]
// 3.
guard let writeReviewURL = components?.url else {
return
}
// 4.
UIApplication.shared.open(writeReviewURL)
当用户点击示例应用程序的Settings
屏幕中的Write a Review
单元格时,上面的代码将运行。 细看下代码:
- 1) 使用您之前找到的产品页面URL创建
URLComponents
实例。 URLComponents是一个结构,可以帮助以安全的方式解析和构造URL
对象。 使用URLComponents
而不是仅仅将字符串附加在一起通常是一种好习惯。 - 2) 将查询项数组设置为包含具有名称和值的单个项,以匹配将触发
App Store
打开提示的要求。 - 3) 根据您在上一步中修改的组件创建URL对象。
- 4) 请求共享的
UIApplication
实例打开给定的URL。
注意:由于iOS模拟器不包含App Store应用程序,因此您必须在物理设备上构建并运行示例项目才能尝试此操作。 为此,您需要选择一个
Development Team
并更改项目设置中的Bundle Identifier
。
在您的设备上构建并运行应用程序。 点击导航栏中的Settings
图标,然后点击Write a Review
。 您将从示例应用程序中进入App Store,您将看到以下屏幕:
Sharing Your App - 分享您的应用
当用户真正享受您的应用时,他们可能希望与朋友和家人分享他们的丰富体验。 由于目前没有一种易于发现的方式直接与您的应用分享链接,并且您已经拥有指向应用产品页面的链接,因此您也可以为用户提供一种方便的方式来共享链接。 毕竟,你拥有的用户越多,你就越有乐趣!
您将为此称为UIActivityViewController
使用专用API。 为此,请打开SettingsViewController.swift
并将以下代码添加到share()
:
// 1.
let activityViewController = UIActivityViewController(
activityItems: [productURL],
applicationActivities: nil)
// 2.
present(activityViewController, animated: true, completion: nil)
UIActivityViewController
通过接受一系列activity items
来工作。 然后,它将显示一个系统界面,其中包含启动设备上安装的其他应用程序的选项,这些应用程序已注册了对任何提供的活动项类型的支持。
在上面的代码中,您提供了表示App Store
产品页面的URL
对象,然后以模态方式显示活动视图控制器。 然后,任何可以接受文本或链接的应用程序或操作都会呈现给您,以便您可以随意共享链接! 如果您愿意,甚至可以AirDrop
到另一台设备立即打开App Store
。
将项目构建并运行到物理设备或模拟器上(模拟器将显示更少的选项),您应该看到如下内容:
这些是提高应用评级的其他方法,让快乐的用户宣传它!
您已经了解了有关为您的应用请求应用评级和评论以及如何在合适的时间执行此操作的所有信息。 为了更进一步,在您下次发布的更新中将SKStoreReviewController
添加到您的应用程序。 希望您会看到评论和评分数量的增加以及App Store上应用的更多流量。
要了解有关此主题的更多信息,请参阅以下其他一些优秀资源:
- Requesting App Store Reviews
- Best Practices and What’s New with In-App Purchases
- App Store: Ratings, Reviews, and Responses
后记
本篇主要讲述了请求应用评级和评论,感兴趣的给个赞或者关注~~~