UAAppReviewManager 是一个简单且轻量的 iOS 和 Mac App Store 应用程序评论提示工具。它是 Appirater 成长的样子,准备好迎接首次亮相。
普通用户只有在应用出现问题的情况下才会写评论。这导致评分不公正地偏向负面,因为大多数满意的用户不会留下评论,只有不满意的用户才这样做。为了平衡负面因素,UAAppReviewManager 会提示用户写评论,但前提是开发者知道他们满意。例如,您可以仅在用户使用它超过一周并至少完成了 5 项重大事件后显示弹窗(这是您应用程序的核心功能)。规则可以完全根据您的应用程序自定义,设置起来也很容易。
以下是一些使 UAAppReviewManager 比其他评分框架和仓库更好的几件事情
许多开发者为 iOS 和 OS X 发布应用程序。UAAppReviewManager 默认支持通过 Mac App Store 销售的 iOS 和 OS X 应用程序。API 对于两者相同,除非有一些特定于 iOS 的方法,这些方法在用法中描述。
UAAppReviewManager 在运行时全面可配置。这意味着您显示的提示可以是动态的,基于最终用户的评分或状态。管理和如何以及何时显示的规则都可以以相同的方式设置,使您能够最大程度地控制评论提示的呈现和时机。
如果您选择为应用程序使用 UAAppReviewManager 的默认字符串,您将获得 32 种语言的本地化带来的额外好处。否则,自定义很简单,覆盖本地化字符串也很容易,只需包含您自己的字符串文件,并让 UAAppReviewManager 知道即可。
如果您的用户在两个不同设备上安装了相同的APP和相同版本,您真的不应该在每个设备上弹出相同的评分提示。UAAppReviewManager 允许您选择是否将用户的使用统计数据保存在 NSUbiquitousKeyValueStore
中,或者您想跟踪同步的任何其他存储,以防止双击提示。
UAAppReviewManager 监听从 ApplicationDidLaunch 和 ApplicationWillEnterForeground 通知。这使您可以专注于应用程序本身,而无需担心在应用程序代理方法中进行跟踪,因此您可以编写更少的代码。
只需要两行代码就可以开始使用。UAAppReviewManager 在底层挖掘时非常强大,但为标准配置设置起来也非常简单。
如果您是 iTunes 会员,可以轻松设置 UAAppReviewManager 以使用您的代码和活动。透明声明:如果您不是 iTunes 会员,应用程序中使用的是作者的默认代码。有人使用代码总是比没有人使用代码好,所以如果您不打算自行设置,请保留默认设置。请把它看作是创建和开源 UAAppReviewManager 的小礼物。
UAAppReviewManager 代码整洁,文档齐全,组织良好。易于理解逻辑流程和每个方法的目的。它不会在类方法和实例方法之间任意混合逻辑。它的 API 清洁且可预测。
使用 Cocoapods 可以简化安装过程。如果您想用传统的方式,只需将 UAAppReviewManager.h
、UAAppReviewManager.m
以及本地化文件夹添加到您的项目中。
pod 'UAAppReviewManager'
然后,只需将此行放置在任何访问 UAAppReviewManager 的文件中。
#import <UAAppReviewManager.h>
UAAppReviewManager 支持从 iOS 5.1 及以上版本,以及 OS X 10.7 及以上版本。
UAAppReviewManager 包含合理的默认设置以及从本地化或非本地化的 info.plist
文件中读取数据来自动配置。虽然一切都可以配置,但唯一 必需 配置的项是您的 App Store ID。这个调用对 iOS 和Mac 应用程序都是相同的。
[UAAppReviewManager setAppID:@"12345678"];
除了 appID
配置之外,您还需要让 UAAppReviewManager 知道何时是显示评分提示的合适时间。
[UAAppReviewManager showPromptIfNecessary];
就这样开始了。使用这两行代码设置 UAAppReviewManager,将使用合理的默认设置(如下文详细说明),并在满足条件且调用 showPromptIfNecessary
时显示评分提示。
典型的配置是在 application:didFinishLaunchingWithOptions:
和 applicationWillEnterForeground:
中显示提示,但可以从任何地方调用它。下面有许多自定义配置选项,可以让你细调设置、块语法定制以及更多功能,但这两行代码就是您开始所需要的一切。
如果要在应用中使用重大事件来跟踪用户何时进行了重要操作,可以添加此行到发生此事件的位置,例如到levelDidFinish
方法或userDidUploadPhoto
方法。
[UAAppReviewManager userDidSignificantEvent:YES];
为了让UAAppReviewManager理解这些信息,您还需要设置重大事件的阈值。通常,在应用代理的appLaunched:
调用之前应该完成这些以及其他逻辑配置设置。
[UAAppReviewManager setSignificantEventsUntilPrompt:5];
如上所述,appID
是唯一需要配置的项目。它用于生成链接到页面的URL。通常,这是配置为当前运行的应用程序,但在某些情况下,您可能希望将其设置为其他应用程序,例如在评估其他应用程序的应用中。
+ (NSString *)appID;
+ (void)setAppID:(NSString *)appId;
appName
在审查提示弹出窗口的多个位置使用。您可以在这里配置以自定义消息,而不会丢失任何默认本地化版本。默认情况下,UAAppReviewManager将从您的本地化或非本地化info.plist
中读取值,但如果您愿意,可以将其指定为特定值。
+ (NSString *)appName;
+ (void)setAppName:(NSString *)appName;
reviewTitle
是用于审查提示弹出窗口的标题。其默认值为本地化的"评分",但您可以根据需要将其设置为任何内容。
+ (NSString *)reviewTitle;
+ (void)setReviewTitle:(NSString *)reviewTitle;
reviewMessage
是用于审查提示弹出窗口的消息。其默认值为本地化的"如果你喜欢使用 ,是否愿意花点时间给它评分?这不会超过一分钟。感谢您的支持!",但如果您想,可以具体更改它。但是,如果您更改它,您需要提供自己的本地化字符串,如下所示。
+ (NSString *)reviewMessage;
+ (void)setReviewMessage:(NSString *)reviewMessage;
cancelButtonTitle
是用于审查提示弹出窗口中"取消"操作的按钮标题。其默认值是本地化的"不,谢谢"。
+ (NSString *)cancelButtonTitle;
+ (void)setCancelButtonTitle:(NSString *)cancelButtonTitle;
rateButtonTitle
是用于审查提示弹出窗口中"评分"操作的按钮标题。其默认值是本地化的"评分"。
+ (NSString *)rateButtonTitle;
+ (void)setRateButtonTitle:(NSString *)rateButtonTitle;
remindButtonTitle
是用于审查提示弹出窗口中"提醒"操作的按钮标题。其默认值是本地化的"稍后提醒"。
+ (NSString *)remindButtonTitle;
+ (void)setRemindButtonTitle:(NSString *)remindButtonTitle;
daysUntilPrompt
配置决定用户需要安装你的应用程序的同一版本多少天后才会被提示评分。默认值为30天。
+ (NSUInteger)daysUntilPrompt;
+ (void)setDaysUntilPrompt:(NSUInteger)daysUntilPrompt;
usesUntilPrompt
配置决定用户需要使用同一版本的你的应用程序多少次后才会被提示评它。默认值是20次。
+ (NSUInteger)usesUntilPrompt;
+ (void)setUsesUntilPrompt:(NSUInteger)usesUntilPrompt;
一个"使用"的例子可能就是如果用户启动了应用程序,或者将其带到前台。UAAppReviewManager通过监听UIApplication/NSApplication的生命周期通知来内部跟踪这些使用。
如上所述,significantEventsUntilPrompt
配置决定用户在提示评分前需要有多少次"重大事件"。默认值为0个重大事件。
+ (NSUInteger)significantEventsUntilPrompt;
+ (void)setSignificantEventsUntilPrompt:(NSInteger)significantEventsUntilPrompt;
一个重大事件可以是您希望自己在应用程序中发生的任何事情。在一个电话应用程序中,一个重大事件可能是拨打电话或接听电话。在一个游戏应用程序中,这可能是击败关卡或Boss。这是另外一层过滤,可以确保只有你最忠诚的用户会被提示在应用商店中评分。如果您将其保留为0个(默认),则不会将该值用作评分标准。为了告诉UAAppReviewManager用户已执行一个重大事件,请调用方法
[UAAppReviewManager userDidSignificantEvent:];
配置项 daysBeforeReminding
决定了 UAAPpReviewManager 在用户在第一次弹窗中选择“稍后提醒”时,等待提醒用户再次评分的前几天数。默认为1天。当值设置为0时,将移除“稍后提醒”按钮并禁用此功能。
+ (NSUInteger)daysBeforeReminding;
+ (void)setDaysBeforeReminding:(NSUInteger)daysBeforeReminding;
配置项 tracksNewVersions
决定了 UAAppReviewManager 是否在检测到新的应用版本后追踪新版本。默认情况下,UAAppReviewManager 追踪所有新的bundle版本。当检测到新版本时,它会重置保存的使用、重要事件、弹窗显示、用户操作等值。通过将其设置为 NO
,UAAppReviewManager 将仅追踪其初始化时加载的版本或最后一次知道的版本。如果将其设置为 YES
,UAAppReviewManager 将在每个新版本检测后重置自身。其默认值为 YES
。
+ (BOOL)tracksNewVersions;
+ (void)setTracksNewVersions:(BOOL)tracksNewVersions;
配置项 shouldPromptIfRated
决定了是否向以前已经给应用评分的用户显示评分提示。此设置类似于 tracksNewVersions
设置,但稍微温和一些。将其设置为 NO
将会导致新用户收到弹窗提示,但不会询问以前已经被询问弹窗的用户。当您发布小型错误修复版本,且不希望让现有用户在每次小版本中收到弹窗时,这非常有用,但又要确保新用户收到评分提示。例如,您可能将此设置为 NO 以每个小版本发布,然后在推送主要版本升级时,将其设置为 YES 以再次请求评分。其默认值为 YES
。
+ (BOOL)shouldPromptIfRated;
+ (void)setShouldPromptIfRated:(BOOL)shouldPromptIfRated;
配置项 useMainAppBundleForLocalizations
是告知 UAAppReviewManager 您为评分提示弹窗字符串提供自己的翻译的一种方式。这可能是因为您只是进行了定制,或者您已经为弹窗设置了自定义文本。如果设置为 YES
,则始终使用主bundle来加载本地化字符串。如果设置为 NO
,UAAppReviewManager 将在其自己的翻译bundle中查找翻译字符串。其默认值为 NO
。
+ (BOOL)useMainAppBundleForLocalizations;
+ (void)setUseMainAppBundleForLocalizations:(BOOL)useMainAppBundleForLocalizations;
配置项 affiliateCode
是可选的,并用于配置与评分URL一起使用。如果您是Apple联盟成员,请在此处输入您的代码。如果没有设置,将使用作者的代码,因为这比什么都没有好。如果您想感谢我为制作 UAAppReviewManager 所做的工作,请随意将此值保留在默认值。
+ (NSString *)affiliateCode;
+ (void)setAffiliateCode:(NSString*)affiliateCode;
配置项 affiliateCampaignCode
是可选的,并用于配置评分URL。它为联盟代码提供上下文,默认为 "UAAppReviewManager"。
+ (NSString *)affiliateCampaignCode;
+ (void)setAffiliateCampaignCode:(NSString*)affiliateCampaignCode;
配置项 debug
对于测试您的评分提示弹窗的外观和功能非常有用。将其设置为 YES
将会每次都显示 UAAppReviewManager 的警告。在生成环境构建(当 DEBUG
预处理器宏未定义时确定)中调用此方法没有效果。在App Store构建中,您不必担心不小心将 setDebug
设置为 YES
。其默认值为 NO
。
+ (BOOL)debug;
+ (void)setDebug:(BOOL)debug;
这些配置方法仅适用于iOS构建,因为它们依赖于iOS专用的框架和方法。
配置项 usesAnimation
决定了 UAAppReviewManager 在显示模态 SKStoreProductViewController
时是否使用动画。其默认值为 YES
。
+ (BOOL)usesAnimation;
+ (void)setUsesAnimation:(BOOL)usesAnimation;
opensInStoreKit
配置决定了 UAAppReviewManager 是否会使用 SKStoreProductViewController
在应用内部打开 App Store 链接。默认情况下,这是 NO
。
+ (BOOL)opensInStoreKit;
+ (void)setOpensInStoreKit:(BOOL)opensInStoreKit;
默认情况下是 NO
的原因有以下两个:
userDidSignificantEvent:
告诉 UAAppReviewManager 用户执行了一个重要事件。重要事件可以是您想要的任何事件。如果您的应用是用于进行 VoIP 通话的,那么当用户发起通话时,您可能需要调用此方法。如果是一个游戏,当用户击败关卡Boss时可能会调用此方法。当用户执行了足够的重要事件并且充分使用了应用时,您可以通过传递 NO
给 canPromptForRating
来抑制评价弹窗。评价弹窗将简单推迟,直到再次以 YES
调用包含 canPromptForRating
的 YES
。评价弹窗也可以通过 appLaunched:
和 appEnteredForeground:
触发(只要在那些方法中传递 YES
给 canPromptForRating
)。
+ (void)userDidSignificantEvent:(BOOL)canPromptForRating;
除了触发提示的类方法之外(例如 appLaunched:
、appEnteredForeground:
和 userDidSignificantEvent:
),还有基于块的变体,允许您自定义是否是显示提示的适当时间。
+ (void)appLaunchedWithShouldPromptBlock:(UAAppReviewManagerShouldPromptBlock)shouldPromptBlock;
+ (void)appEnteredForegroundWithShouldPromptBlock:(UAAppReviewManagerShouldPromptBlock)shouldPromptBlock;
+ (void)userDidSignificantEventWithShouldPromptBlock:(UAAppReviewManagerShouldPromptBlock)shouldPromptBlock;
有关这些方法的更多信息,请参阅下面的 Should-Prompt Blocks 部分。
showPrompt
告诉 UAAppReviewManager 显示评价提示弹窗。如果有互联网连接可用,用户尚未拒绝评价,尚未对当前版本进行评价,并且您跟踪新版本,则将显示提示。您可以在不需要考虑 UAAppReviewManager 设置的情况下调用以显示提示,例如,在应用中发生一些特殊事件(如收到积极反馈)时。
+ (void)showPrompt;
showPromptIfNecessary
告诉 UAAppReviewManager 显示评价提示弹窗,如果所有限制都已满足。如果所有限制均已满足,有互联网连接可用,用户未拒绝评价,未对当前版本进行评价,并且您正在跟踪新版本,则会显示提示。您可以在一些特殊事件(如用户登录)的情况下调用以显示提示。
+ (void)showPromptIfNecessary;
reviewURLString
方法是评价 URL 字符串,通过将 appID
、affiliateCode
和 affiliateCampaignCode
替换为当前平台的模板 URL 生成。
+ (NSString *)reviewURLString;
rateApp
告诉 UAAppReviewManager 打开用户可以指定应用评分的 App Store 页面。它还会记录已经执行了此操作,因此用户不会再次被提示为该版本的应用评分。只有在应用某些地方明确有“评价此应用”的命令时,才应该直接调用此方法。在其他所有情况下,担心调用此方法——相反,只需调用上述其他功能即可,让 UAAppReviewManager 负责决定何时询问用户是否评价应用的簿记。
+ (void)rateApp;
closeModalPanel
告诉 UAAppReviewManager 立即关闭任何打开的评价模态面板,例如 SKStoreProductViewController
。
+ (void)closeModalPanel;
UAAppReviewManager 使用块而不是代理方法进行回调。默认情况下,所有这些的值都是 nil。
+ (void)setOnDidDisplayAlert:(UAAppReviewManagerBlock)didDisplayAlertBlock;
+ (void)setOnDeclineToRate:(UAAppReviewManagerBlock)didDeclineToRateBlock;
+ (void)setOnDidOptToRate:(UAAppReviewManagerBlock)didOptToRateBlock;
+ (void)setOnDidOptToRemindLater:(UAAppReviewManagerBlock)didOptToRemindLaterBlock;
+ (void)setOnWillPresentModalView:(UAAppReviewManagerAnimateBlock)willPresentModalViewBlock;
+ (void)setOnDidDismissModalView:(UAAppReviewManagerAnimateBlock)didDismissModalViewBlock;
+(void)setShouldIncrementUseCountBlock:(UAAppReviewManagerShouldIncrementBlock)shouldIncrementUseCountBlock;
默认情况下,UAAppReviewManager会在应用进入前台时增加使用计数。如果您想抑制这种行为(例如,不统计在Facebook登录过程中切换应用引起的前台事件),您可以使用返回NO忽略前台事件或YES将其视为正常事件的UAAppReviewManagerShouldIncrementBlock来实现。
UAAppReviewManager允许您设置一个在弹出窗口显示之前立即调用的块。
typedef BOOL (^UAAppReviewManagerShouldPromptBlock)(NSDictionary *trackingInfo);
UAAppReviewManagerShouldPromptBlock
块将传递给您UAAppReviewManager用来确定应该调用提示的键和值,并期望返回一个BOOL
值,以决定是否还应显示提示。这使您有机会在最后时刻进行任何自定义逻辑,以确定是否现在是显示提示的合适时间。
+ (void)setShouldPromptBlock:(UAAppReviewManagerShouldPromptBlock)shouldPromptBlock;
除了全局的shouldPromptBlock
,每个触发提示显示的类方法(showPromptIfNecessary:
和userDidSignificantEvent:
)都有基于块的自定义变体,允许您确定是否现在是显示提示的合适时间。
+ (void)userDidSignificantEventWithShouldPromptBlock:(UAAppReviewManagerShouldPromptBlock)shouldPromptBlock;
+ (void)showPromptWithShouldPromptBlock:(UAAppReviewManagerShouldPromptBlock)shouldPromptBlock
使用这些方法而不是它们的BOOL
姐妹方法时,不会使用UAAppReviewManager的内部逻辑来确定是否显示提示。**仅**使用您提供块来决定是否展示,这取决于您在块中返回的值。这也意味着,在这些方法中使用时(如果设置),全局的shouldPromptBlock
(如果设置了)也不会被调用。
注意: shouldPromptBlock
是同步并在主队列上运行的,请确保适当地处理。
UAAppReviewManager为其使用的NSUserDefaults键提供了合理的默认值,但是如果您愿意,可以在这里进行自定义。获取/设置存储UAAppReviewManager使用数据的NSUserDefaults关键。默认值都是“UAAppReviewManagerKey”的形式。
+ (NSString *)keyForUAAppReviewManagerKeyType:(UAAppReviewManagerKeyType)keyType;
+ (void)setKey:(NSString *)key forUAAppReviewManagerKeyType:(UAAppReviewManagerKeyType)keyType;
您不必使用NSUserDefaults作为您的键/值存储,尽管UAAppReviewManager默认使用它。如果您想要将评分和使用统计同步到所有用户的设备上,您可能想使用NSUbiquitousKeyValueStore。这将确保用户不会在多个设备上对同一应用的同一版本进行评分。
+ (NSObject<UAAppReviewManagerDefaultsObject> *)userDefaultsObject;
+ (void)setUserDefaultsObject:(NSObject<UAAppReviewManagerDefaultsObject> *)userDefaultsObject;
重要:userDefaultsObject
是一个弱引用,请确保您在自己的代码中正确维护其生命周期。
userDefaultsObject
可以是任何响应UAAppReviewManagerDefaultsObject
协议的NSObject。
@protocol UAAppReviewManagerDefaultsObject <NSObject>
@required
- (id)objectForKey:(NSString *)defaultName;
- (void)setObject:(id)value forKey:(NSString *)defaultName;
- (void)removeObjectForKey:(NSString *)defaultName;
- (BOOL)synchronize;
@end
因此,要使用iCloud和NSUbiquitousKeyValueStore
,可以按照如下方式设置:
[UAAppReviewManager setUserDefaultsObject:(NSObject<UAAppReviewManagerDefaultsObject> *)[NSUbiquitousKeyValueStore defaultStore]];
您可以获取/设置用于存储UAAppReviewManager使用数据的上述键的keyPrefix
。默认值是AppID
,它被附加到键的类型之前。设置keyPrefix
可以防止不同的应用使用共享键/值存储相互覆盖。
+ (NSString *)keyPrefix;
+ (void)setKeyPrefix:(NSString *)keyPrefix;
有关如何使用和设置UAAppReviewManager的更多信息,请参阅iOS和OS X应用程序的示例项目。
(非中文内容,未翻译)
我开始在一分叉的Appirater项目中处理这些问题,但很快意识到可以将整个项目以更好的方式重写以解决上述问题。UAAppReviewManager是
在添加所有这些新增功能、修改和特性之后,将这些内容放回Appirater已经太迟,因此UAAppReviewManager诞生了。话虽如此,其中一些现有的代码逻辑、方法和语言翻译(32个!)都是从Appirater中使用的,并需要对它们给予适当的认可。没有Appirater,UAAppReviewManager就无法存在。谢谢!
对于方法的API接近Appirater,但有几个例外(在UAAppReviewManager中没有代理方法,只有黑回调)。UAAppReviewManager的前几个版本将包括废弃的Appirater方法和命名方案。这些方法和它们的新对应物是
OLD: + (void)setAppId:(NSString*)appId __attribute__((deprecated("Use setAppID:")));
NEW: + (void)setAppID:(NSString *)appID;
OLD: + (void)setTimeBeforeReminding:(double)value __attribute__((deprecated("Use setDaysBeforeReminding:")));
NEW: + (void)setDaysBeforeReminding:(NSUInteger)daysBeforeReminding;
OLD: + (void)setAlwaysUseMainBundle:(BOOL)useMainBundle __attribute__((deprecated("Use setUseMainAppBundleForLocalizations:")));
NEW: + (void)setUseMainAppBundleForLocalizations:(BOOL)useMainAppBundleForLocalizations;
OLD: + (void)appLaunched __attribute__((deprecated("Use appLaunched: instead")));
NEW: + (void)appLaunched:(BOOL)canShowPrompt;
OLD: + (void)setDelegate:(id)delegate __attribute__((deprecated("Use the block-based callbacks instead")));
NEW: + (void)setOnDidDisplayAlert:(UAAppReviewManagerBlock)didDisplayAlertBlock;
NEW: + (void)setOnDeclineToRate:(UAAppReviewManagerBlock)didDeclineToRateBlock;
NEW: + (void)setOnDidOptToRate:(UAAppReviewManagerBlock)didOptToRateBlock;
NEW: + (void)setOnDidOptToRemindLater:(UAAppReviewManagerBlock)didOptToRemindLaterBlock;
NEW: + (void)setOnWillPresentModalView:(UAAppReviewManagerAnimateBlock)willPresentModalViewBlock;
NEW: + (void)setOnDidDismissModalView:(UAAppReviewManagerAnimateBlock)didDismissModalViewBlock;
OLD: + (void)setOpenInAppStore:(BOOL)openInAppStore __attribute__((deprecated("Use setOpensInStoreKit:")));
NEW: + (void)setOpensInStoreKit:(BOOL)opensInStoreKit;
对于大多数升级用户来说,升级所需做的就是简单地将Appirater
替换为UAAppReviewManager
的查找/替换。
UAAppReviewManager将自动将存储在Appirater应用程序下的NSUserDefault键转换成UAAppReviewManager使用的键。值将传输过来,旧的、未使用的Appirater键将从设置中删除。
我们对UAAppReviewManager的后续版本有一些想法。如果您愿意进行分叉/实现,以便加快该过程。
UIAlertView
或NSAlert
的自定义类来显示提示的能力告诉我们您是否看到改进UAAppReviewManager的方式或其中存在问题。我们很高兴接受那些代码干净、有大多数用户用处的功能的分叉请求。
Urban Apps。我们制作时尚的东西。看看我们。
如果您想感谢我们开源UAAppReviewManager,您可以购买我们的一款应用或者捐献一些小物。