
App 開(kāi)發(fā)者的最主要目標(biāo)之一就是獲得更多曝光,并且從用戶(hù)那里接收反饋從而改進(jìn) app,以便鼓勵(lì)其他用戶(hù)嘗試使用。多年以來(lái),開(kāi)發(fā)者都在使用第三方方法來(lái)建議用戶(hù)去商店打分,大部分是基于用戶(hù)使用 app 的時(shí)長(zhǎng)和頻率。但使用這些第三方方法會(huì)導(dǎo)致體驗(yàn)不夠理想。通常用戶(hù)會(huì)被送到 AppStore app 來(lái)撰寫(xiě)評(píng)價(jià),甚至用戶(hù)還要手動(dòng)選擇“評(píng)論”標(biāo)簽頁(yè)才能開(kāi)始寫(xiě)評(píng)價(jià)。
在 iOS 10.3 的更新里,Apple 在 iOS 平臺(tái)上做了幾個(gè)重要改動(dòng),最受開(kāi)發(fā)者歡迎的就是向用戶(hù)詢(xún)問(wèn)評(píng)分的官方方式。所以從 10.3 開(kāi)始,我們可以用 StoreKit 來(lái)詢(xún)問(wèn)用戶(hù)評(píng)分,并且 StoreKit 會(huì)替我們處理剩下的工作??梢钥?a target="_blank" rel="nofollow">這里的文檔。理論上來(lái)說(shuō),開(kāi)發(fā)者只要加一行代碼即可請(qǐng)求評(píng)分,但還有幾點(diǎn)值得注意。
根據(jù)文檔所述,請(qǐng)求評(píng)分函數(shù)使用了私有方法來(lái)分析當(dāng)前是否是向用戶(hù)詢(xún)問(wèn)評(píng)分的好時(shí)機(jī),所以 Apple 強(qiáng)烈建議開(kāi)發(fā)者不要在相應(yīng)用戶(hù)行為時(shí)調(diào)用此方法。例如,如果你把請(qǐng)求評(píng)分放在按鈕觸摸的回調(diào)函數(shù)里,但此時(shí) iOS 可能決定不顯示評(píng)分,所以用戶(hù)就會(huì)認(rèn)為 app 的功能出現(xiàn)了問(wèn)題。另一方面,也不要太早讓用戶(hù)評(píng)分,最好等 app 運(yùn)行幾次之后再詢(xún)問(wèn)評(píng)分。盡管我們并不了解 Apple 的算法,但我們知道此方法的行為模式,所以最好在確定用戶(hù)處于合適的時(shí)間時(shí)再進(jìn)行詢(xún)問(wèn)。
注意:在開(kāi)發(fā)時(shí),所有評(píng)分請(qǐng)求都會(huì)通過(guò),也就是說(shuō)每次請(qǐng)求評(píng)分,評(píng)分對(duì)話(huà)框都會(huì)顯示,但無(wú)法提交評(píng)分。在 Testflight 中,請(qǐng)求都不會(huì)被通過(guò),所以如果 Testflight 測(cè)試時(shí)評(píng)分對(duì)話(huà)框沒(méi)有正確顯示,不要慌張。app 上架后,就會(huì)使用 Apple 方法在合適的時(shí)間顯示對(duì)話(huà)框了。
不多說(shuō)了,下面是用 Swift 實(shí)現(xiàn)請(qǐng)求評(píng)分的方式。
- 首先,import StoreKit
import StoreKit
- 現(xiàn)在就可以如下詢(xún)問(wèn)評(píng)分了
SKStoreReviewController.requestReview()
就這么簡(jiǎn)單!比想象中容易多了吧!
如果你想支持老的 iOS 版本,最好這么做:
if #available(iOS 10.3, *) {
SKStoreReviewController.requestReview()
} else {
// 退回老的版本
// 嘗試手寫(xiě)或用第三方方法。
}
一步步來(lái)
在我看來(lái),實(shí)現(xiàn) RequestReview 的正確姿勢(shì)是:
- 在項(xiàng)目里創(chuàng)建新的 Swift 文件
- 導(dǎo)入所需框架
import Foundation
import StoreKit
- 定義設(shè)置變量
let runIncrementerSetting = "numberOfRuns" // 用于存儲(chǔ)運(yùn)行次數(shù)的 UserDefauls 字典鍵
let minimumRunCount = 5 // 詢(xún)問(wèn)評(píng)分的最少運(yùn)行次數(shù)
- 然后寫(xiě)一個(gè)運(yùn)行計(jì)數(shù)器,功能就是在 UserDefaults 存儲(chǔ)運(yùn)行次數(shù)。此計(jì)數(shù)器需要兩個(gè)函數(shù)。一個(gè)從 UserDefaults 里讀取,另一個(gè)將其加一并存回 UserDefaults。
func incrementAppRuns() { // app 運(yùn)行次數(shù)計(jì)數(shù)器??梢栽?App Delegate 中調(diào)用此方法
let usD = UserDefaults()
let runs = getRunCounts() + 1
usD.setValuesForKeys([runIncrementerSetting: runs])
usD.synchronize()
}
func getRunCounts () -> Int { // 從 UserDefaults 里讀取運(yùn)行次數(shù)并返回。
let usD = UserDefaults()
let savedRuns = usD.value(forKey: runIncrementerSetting)
var runs = 0
if (savedRuns != nil) {
runs = savedRuns as! Int
}
print("已運(yùn)行\(zhòng)(runs)次")
return runs
}
- 下一步是用于請(qǐng)求評(píng)分的函數(shù)。我們需要在此函數(shù)里考慮兩個(gè)因素。首先,是否有足夠的運(yùn)行次數(shù)來(lái)詢(xún)問(wèn)評(píng)分。其次,檢查是否是 iOS10.3 及以上版本,這樣我們才能調(diào)用此函數(shù)。
func showReview() {
let runs = getRunCounts()
print("顯示評(píng)分")
if (runs > minimumRunCount) {
if #available(iOS 10.3, *) {
print("已請(qǐng)求評(píng)分")
SKStoreReviewController.requestReview()
} else {
// 回到老版本
}
} else {
print("請(qǐng)求評(píng)分所需的運(yùn)行次數(shù)不足!")
}
}
- 下一步就是從 App Delegate 里調(diào)用運(yùn)行計(jì)數(shù)器。所以在 app 的 didFinishLaunchingWithOptions 函數(shù)里添加如下內(nèi)容:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
incrementAppRuns()
return true
}
- 最后一步是在合適的時(shí)間里調(diào)用 showReview()。我的建議是在用戶(hù)完成 app 中某項(xiàng)主要工作后調(diào)用此函數(shù)。例如你在開(kāi)發(fā)游戲,向用戶(hù)展示分?jǐn)?shù)時(shí)就可以調(diào)用此函數(shù)。記住如果要把它放在按鈕回調(diào)里,就要和其它任務(wù)一起才行。例如,在 Shuffle 里面,我把 showReview() 函數(shù)放在壁紙的下載按鈕中。所以用戶(hù)下載完壁紙后,如果 requestReview 決定顯示評(píng)分,就會(huì)顯示在下載完成的壁紙上。這樣就可以確保按鈕總是能夠正確工作,同時(shí)還能確保用戶(hù)在 app 中完成主要任務(wù)時(shí)可以顯示請(qǐng)求評(píng)分頁(yè)面。
showReview()
好啦!現(xiàn)在可以運(yùn)行你的 app 來(lái)看看效果。
需要的話(huà),可以從 GitHub 上下載我的腳本,包含了此教程中的 1-5 步。點(diǎn)擊下載代碼。
歡迎在下面評(píng)論。編程愉快!