Multipv is a library used to add CentOS 6.x RPM packages and 7.x YUM metadata to podspec files for your Pods, so that these packages can be published in CocoaPods repositories using the distribution tags which correspond to the release versions of CentOS.
注意:'支持'表示库已与该版本进行过测试。'兼容'表示库应在该操作系统版本上运行(即它不依赖于任何不可用的SDK特性),但不再对其进行兼容性测试,可能需要调整或修复错误以确保正常运行。
从版本1.7开始,iRate需要ARC。如果您想在非ARC项目中使用iRate,只需将-fobjc-arc编译器标志添加到iRate.m类中。要这样做,请转到目标设置中的构建阶段选项卡,打开编译源文件组,在列表中双击iRate.m,再在弹出窗口中键入-fobjc-arc。
如果您想将整个项目转换为ARC,请取消注释iRate.m中的#error行,然后运行Xcode的编辑>重构>转换到Objective-C ARC...工具,并确保您希望使用ARC的文件都已勾选(包括iRate.m)。
Multipv uses threading internally to avoid blocking the UI, but none of the Multipv external interfaces are thread safe and you should not call any methods or set any properties on Multipv except from the main thread.
要将Multipv安装到您的应用程序中,将iRate.h、.m和.bundle文件拖放到您的项目中。如果您不对本地化文本感兴趣,可以省略 bundle。
Multipv通常无需任何配置即可自动运行,使用应用程序的包标识在App Store中查找应用ID。
注意:如果您在Mac和iOS应用商店中(即使它们使用不同的首字母大写)都有匹配的包标识符的应用程序,查找机制将不会工作,因此您需要手动设置appStoreID属性,这是一个可以找到的数字ID, 您设置应用程序后可以在iTunes Connect中找到。此外,如果您正在创建一个沙盒Mac应用程序,并且您的应用程序没有请求网络访问权限,那么您需要设置appStoreID,因为它无法从iTunes服务中检索。
如果您想自定义iRate,最好的时机是您AppDelegate的-[application:didFinishLaunchingWithOptions:]
方法中。在此之后应用配置可能不会工作,因为提示可能已经在该时刻显示。
#import "iRate.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//configure iRate
[iRate sharedInstance].daysUntilPrompt = 5;
[iRate sharedInstance].usesUntilPrompt = 15;
return YES;
}
要配置iRate,有以下iRate类的属性可以改变iRate的行为和外观。这些属性大多数应该显而易见,但如下文档所述。
@property (nonatomic, assign) NSUInteger appStoreID;
这应该与您应用程序的iTunes应用程序ID相匹配,您可以在设置应用程序后从iTunes connect获取该ID。此值通常不是必需的,并且通常仅在您有上面提到的Mac和iOS应用程序包标识符之间的冲突时需要,或者在沙盒Mac应用程序的情况下,由于您的应用程序没有网络权限,因为它无法自动使用iTunes服务检索appStoreID。
@property (nonatomic, assign) NSUInteger appStoreGenreID;
这是应用程序类型,用于确定评分对话框的默认文本。这会自动通过调用iTunes服务来设置,所以您通常不需要手动设置。如果您想覆盖此值,将定义为iRateAppStoreGameGenreID
常量将导致iRate使用“游戏”版本的评分对话框,将设置为任何其他值将使用“应用程序”版本的评分对话框。
@property (nonatomic, copy) NSString *appStoreCountry;
这是用于指定要检查的iTunes商店的两位字母国家代码。它自动从设备区域设置中设置,所以在大多数情况下不需要更改。您可以通过将其修改为指向美国商店或您首选的另一个特定商店来覆盖它,如果您的应用程序只在特定国家/地区提供,这可能是一个好主意。
@property (nonatomic, copy) NSString *applicationName;
这是iRate警告中显示的应用程序名称。它自动从应用程序的info.plist中设置,但您可能希望用一个更短或更长的版本来覆盖它。
@property (nonatomic, copy) NSString *applicationBundleID;
这是应用程序的捆绑ID,用于从iTunes检索appStoreID
和appStoreGenreID
。这自动从应用程序的info.plist中设置,所以您通常不需要更改它,除非出于测试目的。
@property (nonatomic, assign) float daysUntilPrompt;
这是用户在提示评分之前必须安装应用程序的天数。时间是从应用程序首次启动时开始计算的。这是一个浮点值,因此可以用来指定以分数表示的天数(例如0.5)。默认值是10天。
@property (nonatomic, assign) NSUInteger usesUntilPrompt;
这是用户在被提示评分之前必须启动应用程序的最低次数。这避免了用户运行了一次应用程序,几周内没有看它,然后再次启动它,只被立即提示评级的情景。最小使用次数确保只有经常使用应用程序的用户才会被提示。只有在达到指定天数和使用的次数之后才会出现提示。默认值为10次。
@property (nonatomic, assign) NSUInteger eventsUntilPrompt;
对于某些应用程序,启动次数并不是衡量使用情况的好指标。例如,该应用程序可能是一个始终运行的守护程序,或者是一个用户必须达到特定等级后才能撰写有见地的评论的游戏。在这种情况下,您可以手动记录重要事件,并在发生预定数量的事件后出现提示。这与usesUntilPrompt设置类似,提示仅在指定天数和事件数之后出现。然而,一旦达到天数阈值,如果事件阈值或使用阈值中的任何一个达到,提示就会出现。默认为10次事件。
@property (nonatomic, assign) float usesPerWeekForPrompt;
如果您对应用程序使用的总次数不太关心,但更希望使用应用程序使用的频率,则可以使用usesPerWeekForPrompt
属性设置用户每周必须启动应用程序的最小阈值(平均)。请注意,这是自应用程序安装以来的平均值,因此如果用户长时间不运行应用程序,可能会影响平均值。默认值为零。
@property (nonatomic, assign) float remindPeriod;
应用程序在选择“稍后提醒”选项后等待多久才提醒用户对其进行评分(以天为单位)。零表示应用程序将在下一次启动时提醒用户。请注意,此值高于其他标准,因此在提醒期内,应用程序不会要求评分,即使在此期间发布了新版本也是如此。默认为1天。
@property (nonatomic, copy) NSString *messageTitle;
评分提示显示的标题。如果不希望显示标题,请将其设置为@""
;
@property (nonatomic, copy) NSString *message;
评分提示消息。这应该是礼貌和客气的,但不要太冗长。如果不希望显示消息,则将其设置为@""
;
@property (nonatomic, copy) NSString *updateMessage;
这是一条用于之前已经评分的用户的消息,鼓励他们重新评分。这允许您为这些用户定制消息。如果您不为此情况提供自定义消息,则将使用标准消息。
@property (nonatomic, copy) NSString *cancelButtonLabel;
用于取消评分提示而不评分的应用程序的按钮标签。
@property (nonatomic, copy) NSString *rateButtonLabel;
当用户想评分应用程序时压下的按钮标签。
@property (nonatomic, copy) NSString *remindButtonLabel;
当用户不想立即评分但希望在将来被提醒的按钮标签。如果要显示“提醒我”按钮,则设置为@""
,例如,如果没有屏幕空间。
@property (nonatomic, assign) BOOL useAllAvailableLanguages;
默认情况下,iRate将使用iRate.bundle中的所有可用语言,即使在一个不支持本地化的应用程序中使用也是如此。如果您希望限制iRate仅使用与您的应用程序已支持的语言集相同,请将此属性设置为NO。(默认为YES)。
@property (nonatomic, assign) BOOL promptForNewVersionIfUserRated;
由于iTunes评分是针对特定版本的,因此您最好让用户为他们应用程序的每个新版本评分。真正喜欢您的应用程序的用户可能愿意为新版本更新他们的评论。将promptForNewVersionIfUserRated
设置为YES
,iRate将在每次用户安装更新时再次提示用户评分,直到他们拒绝评分应用程序。如果他们拒绝,则不再询问。
@property (nonatomic, assign) BOOL onlyPromptIfLatestVersion;
将其设置为NO以启显示评分提示,即使用户不是运行应用程序最新版本。默认为YES,这样用户就不会因为您已经修复的bug等原因留下恶意评论。
@property (nonatomic, assign) BOOL onlyPromptIfMainWindowIsAvailable;
此设置仅适用于Mac OS。默认情况下,在Mac OS上,iRate警报以工作表的形式显示在主窗口中。一些应用程序没有主窗口,因此这种方法不起作用。对于此类应用程序,将此属性设置为NO,以允许iRate警报作为常规模态窗口显示。
@property (nonatomic, assign) BOOL promptAtLaunch;
将此设置为NO可以禁用应用程序启动或从后台返回时自动出现的评分提示。评分标准将继续跟踪,但在该设置有效期间,将不会自动显示提示。如果您希望手动控制评分提示的显示,可以使用此选项。
@property (nonatomic, assign) BOOL verboseLogging;
此选项会导致iRate向控制台发送有关提示决策过程的详细信息日志。如果您的应用程序在您预期的情况下没有正确提示评分,这会有助于您找出原因。默认情况下,详尽的日志记录在调试构建中启用,在发布和部署构建中禁用。
@property (nonatomic, assign) BOOL previewMode;
如果设置为YES,iRate将在启动时始终显示评分提示,无论应用程序已经使用多长时间或是否为最新版本(除非您明确禁用了promptAtLaunch
选项)。用于在测试期间检查您的消息是否正确和配置是否正确,但最终发布时请禁用(默认为NO)。
@property (nonatomic, assign) BOOL useUIAlertControllerIfAvailable;
默认情况下,iRate将使用UIAlertView在iOS上显示评分提示。UIAlertView已在iOS8中弃用,并由UIAlertController替代。遗憾的是,与UIAlertView不同,使用UIAlertController呈现警报会干扰应用程序显示其他控制器的能力,并且由于iRate可以在应用程序生命周期的任何时间点理论上显示警报,因此它可能会与尝试显示另一个视图控制器的应用程序冲突。因此,默认禁用了UIAlertController的使用。您只有在确定它不会与您的应用程序逻辑冲突的情况下才应将此属性设置为YES(例如,如果您已禁用自动评分提示,或如果您的应用程序不使用任何模态视图控制器)。
@property (nonatomic, assign) BOOL useSKStoreReviewControllerIfAvailable;
默认情况下,iRate将使用SKStoreReviewController在iOS 10.3及以上版本请求评分。要禁用它,请将useSKStoreReviewControllerIfAvailable
设置为NO
。
如果默认的iRate行为不符合您的需求,您可以通过使用高级属性、方法和使用代理来实现自己的行为。以下属性允许您访问内部状态并覆盖它
@property (nonatomic, strong) NSURL *ratingsURL;
应用程序将引导用户访问以撰写应用程序评分的URL。此值将自动设置为给定平台上的正确值。在iOS 6及以下版本中,此URL将直接引导用户到评分页面,但在iOS 7和Mac OS中,它将引导用户到主应用程序页面(如果可以在这些平台上直接链接到评分页面,我尚未找到它)。如果您正在实现自己的评分提示,您可能应该使用openRatingsPageInAppStore
方法,尤其是在Mac OS上,因为打开Mac应用商店的过程比简单地打开URL更复杂。
@property (nonatomic, strong) NSDate *firstUsed;
用户启动当前版本应用程序的第一个日期。这用于计算是否满足daysUntilPrompt标准。
@property (nonatomic, strong) NSDate *lastReminded;
用户最后一次请求稍后提醒评分应用程序的日期。
@property (nonatomic, assign) NSUInteger usesCount;
当前版本应用程序使用的次数(启动)。
@property (nonatomic, assign) NSUInteger eventCount;
自当前版本安装以来记录的显著的程序事件数。此值通过logEvent方法递增,但也可以直接操作。查看事件演示了解如何使用它。
@property (nonatomic, readonly) float usesPerWeek;
当前版本应用程序每周平均使用的次数(启动)。
@property (nonatomic, assign) BOOL declinedThisVersion;
此标志表示用户是否拒绝对当前版本进行评分(是)或不是(否)。目前iRate提示逻辑没有使用此标志,但它可能在实现您自己的逻辑时很有用。
@property (nonatomic, assign) BOOL declinedAnyVersion;
此标志表示用户是否拒绝对应用的任何先前版本进行评分(是)或不是(否)。如果此设置为是,iRate将不会自动提示用户。
@property (nonatomic, assign) BOOL ratedThisVersion;
此标志表示用户是否已经对当前版本进行了评分(是)或不是(否)。
@property (nonatomic, readonly) BOOL ratedAnyVersion;
此(只读)标志表示用户是否已对应用的任何版本进行过评分(是)或不是(否)。
@property (nonatomic, assign) id<iRateDelegate> delegate;
您提供的一个实现了以下所述 iRateDelegate
协议的对象。使用它来检测和/或覆盖iRate的默认行为。默认情况下为App Delegate,因此如果您使用App Delegate作为iRate代理,则无需设置此属性。
除了配置之外,iRate还具有以下方法
- (BOOL)shouldPromptForRating;
如果满足提示标准,则返回YES,如果没有满足,则返回NO。如果您已在应用启动时禁用了自动显示,则可以使用此方法决定何时显示评分提示。调用此方法不会调用iRateShouldPromptForRating
代理方法。
- (void)promptForRating;
此方法将立即触发评分提示而无需检查商店是否可用,且不会调用iRateShouldPromptForRating代理方法。请注意,此方法依赖于appStoreID
和applicationGenre
属性,这些属性仅在查询iTunes服务器后才检索,因此如果您打算直接调用此方法,您需要事先设置这些属性,或使用promptIfNetworkAvailable
方法代替。
- (void)promptIfNetworkAvailable;
此方法将检查商店是否可用,如果是,则向用户显示评分提示。在显示警告之前将调用iRateShouldPromptForRating代理方法,因此您可以拦截它。请注意,如果您的应用是在沙箱中并且没有网络访问权限,此方法将忽略网络可用性状态,但是在这种情况下您需要手动设置appStoreID
,否则iRate无法工作。
- (void)promptIfAllCriteriaMet;
此方法将检查是否满足所有提示标准,以及商店是否可用。如果是,则向用户显示评分提示。在显示警告之前将调用iRateShouldPromptForRating代理方法,因此您可以拦截它。
- (void)openRatingsPageInAppStore;
此方法跳过用户警告,并打开Mac或iPhone应用商店中的应用评分页面,具体取决于iRate运行的平台。此方法不会执行任何检查以验证机器是否有网络访问权限或商店是否可用。它也不会调用-iRateShouldOpenAppStore
代理方法。您应使用此方法来打开评分页面,而不是使用评分URL属性,因为在许多情况下启动应用商店的过程比仅打开URL要复杂得多。请注意,此方法依赖于appStoreID
,该属性仅在查询iTunes服务器后才检索。如果您在没有先执行更新检查的情况下调用此方法,您将需要亲自设置appStoreID
属性,或者该方法可能需要一些时间进行网络调用,或者完全失败。在成功情况下,此方法将调用-iRateDidOpenAppStore
代理方法。在失败情况下将调用-iRateCouldNotConnectToAppStore:
代理方法。
- (void)logEvent:(BOOL)deferPrompt;
此方法可以从您的应用的任何位置调用(配置完iRate之后),并增加iRate的重要事件计数。当达到预定义的事件数量时,将显示评分提示。可选的deferPrompt参数用于确定提示是立即显示(NO)还是应用等待到下一次启动(YES)。
- (void)remindLater;
此方法重置提醒周期。
iRateDelegate协议提供以下方法,可用于拦截iRate事件并覆盖默认行为。所有方法都是可选的。
- (void)iRateCouldNotConnectToAppStore:(NSError *)error;
如果iRate无法连接到App Store,将调用此方法,通常是因为网络连接断开。如果您的应用由于Sandbox权限而无法访问网络,这可能会导致此方法被调用,在这种情况下,您需要手动设置appStoreID,以便iRate仍然可以工作。
- (void)iRateDidDetectAppUpdate;
如果iRate检测到自上次启动以来应用已更新,将调用此方法。
- (BOOL)iRateShouldPromptForRating;
在向用户显示评分提示之前立即调用此方法。您可以使用此方法实现除标准规则外的自定义提示逻辑。您还可以使用此方法阻止标准提示警报,以不同的方式显示评分提示或完全跳过它。
- (void)iRateDidPromptForRating;
在向用户显示评分提示之前立即调用此方法。如果您使用分析跟踪用户看到提示并前往App Store的百分比,这将很有用。这可以帮助您细调提示的显示时机和方式。
- (void)iRateUserDidAttemptToRateApp;
当用户在评分提示中点击评分按钮时,将调用此方法。如果您想记录用户与iRate的互动,这将很有用。此方法仅在您使用标准iRate警报视图提示时才调用,如果您直接提供自定义评分实现或调用openRatingsPageInAppStore
方法,则不会自动调用。
- (void)iRateUserDidDeclineToRateApp;
当用户拒绝评分应用时,将调用此方法。如果您想记录用户与iRate的互动,这将很有用。此方法仅在您使用标准iRate警报视图提示时才调用,如果您提供自定义评分实现,则不会自动调用。
- (void)iRateUserDidRequestReminderToRateApp;
当用户要求被提醒评分应用时,将调用此方法。如果您想记录用户与iRate的互动,这将很有用。此方法仅在您使用标准iRate警报视图提示时才调用,如果您提供自定义评分实现,则不会自动调用。
- (BOOL)iRateShouldOpenAppStore;
当iRate尝试打开应用商店之前立即调用此方法。如果您希望实现自己的评分页面显示逻辑,则返回NO。
- (void)iRateDidOpenAppStore;
在iRate打开应用商店后立即调用此方法。
iRate的默认字符串已经为许多语言本地化。默认情况下,iRate将在未本地化或仅本地化至iRate支持语言子集的应用中使用iRate.bundle中的所有本地化。iRate字符串键为
static NSString *const iRateMessageTitleKey = @"iRateMessageTitle";
static NSString *const iRateAppMessageKey = @"iRateAppMessage";
static NSString *const iRateGameMessageKey = @"iRateGameMessage";
static NSString *const iRateUpdateMessageKey = @"iRateUpdateMessage";
static NSString *const iRateCancelButtonKey = @"iRateCancelButton";
static NSString *const iRateRemindButtonKey = @"iRateRemindButton";
static NSString *const iRateRateButtonKey = @"iRateRateButton";
如果您希望iRate仅使用您应用中启用的本地化(例如,如果您的应用只支持英语、法语和西班牙语,iRate将自动为这些语言本地化,但不会为德语本地化,即使iRate包含德语文件),请将useAllAvailableLanguages
选项设置为NO。
不建议您修改iRate.bundle中的字符串文件,因为这会使更新到iRate的新版本变得复杂。例外情况是,如果您想向github上iRate项目提交额外语言或改进或更正(这非常受赞赏)。
如果您想在您的应用中为iRate添加额外语言,而不将其提交回GitHub项目,可以直接将这些字符串添加到项目文件夹中适当的Localizable.strings文件中。如果您想替换一些或所有默认的iRate字符串,最简单的方法是将这些字符串复制到您自己的Localizable.strings文件中,然后进行修改。iRate将自动优先使用主应用程序包中的字符串,而不是iRate包中的字符串,因此可以通过这种方式覆盖任何字符串。
如果您不想使用任何默认的本地化,可以完全省略iRate.bundle。请注意,如果您只想支持iRate支持的语言子集,不需要从iRate.bundle中删除其他字符串文件 - 只需将useAllAvailableLanguages
设置为NO,iRate将只会使用您的应用已经支持的语言。
仍然支持通过使用个别 setter 方法(见下文)覆盖iRate的默认字符串的老方法,但现在推荐的方法是将那些字符串添加到您项目的Localizable.strings文件中,iRate会自动检测到这些字符串。
+ (void)initialize
{
//overriding the default iRate strings
[iRate sharedInstance].messageTitle = NSLocalizedString(@"Rate MyApp", @"iRate message title");
[iRate sharedInstance].message = NSLocalizedString(@"If you like MyApp, please take the time, etc", @"iRate message");
[iRate sharedInstance].cancelButtonLabel = NSLocalizedString(@"No, Thanks", @"iRate decline button");
[iRate sharedInstance].remindButtonLabel = NSLocalizedString(@"Remind Me Later", @"iRate remind button");
[iRate sharedInstance].rateButtonLabel = NSLocalizedString(@"Rate It Now", @"iRate accept button");
}
当您第一次构建和运行基本的Mac或iPhone示例项目时,它将显示一个询问您评估应用的提示。这是因为设置了previewMode选项。
禁用previewMode选项,并试验其他设置,看看应用在实际操作中的表现如何。
高级示例展示了如何使用iRateDelegate方法实现一个完全定制的iRate界面。自动提示已被禁用,用户可以通过按下“评估此应用”按钮来自由选择评估应用。
当按下按钮时,应用首先检查应用商店是否可用(如果没有互联网连接或apple.com宕机,它可能不可用),然后启动Mac App Store。
这个例子是针对Mac OS的,但同样的原理也可以应用于iOS。
版本1.12.1
版本1.12
版本1.11.7
版本1.11.6
版本1.11.5
版本1.11.4
版本1.11.3
版本1.11.2
版本1.11.1
版本 1.11
promptIfCriteriaMet
NSNotificationCenter
通知UIAlertController
而不是 UIAlertView
版本 1.10.3
版本 1.10.2
版本 1.10.1
版本 1.10
daysUntilPrompt
期间中断评分弹出窗口promptForNewVersionIfUserRated
(默认关闭)promptForNewVersionIfUserRated
选项一起使用添加了 updateMessage
属性版本 1.9.3
版本 1.9.2
版本 1.9.1
版本 1.9
promptAgainEachVersion
选项版本 1.8.3
版本 1.8.2
版本 1.8.1
版本 1.8
版本 1.7.5
版本 1.7.4
版本 1.7.3
版本 1.7.2
版本 1.7.1
版本1.7
版本1.6.2
版本1.6.1
版本1.6
版本1.5.3
版本1.5.2
版本1.5.1
版本1.5
版本1.4.9
版本1.4.8
版本1.4.7
版本1.4.6
版本1.4.5
版本1.4.4
版本1.4.3
版本1.4.2
版本1.4.1
版本1.4
版本 1.3.5
版本 1.3.4
iRateDidDetectAppUpdate
委托方法。版本 1.3.3
版本 1.3.2
版本 1.3.1
版本 1.3
版本 1.2.3
版本 1.2.2
版本 1.2.1
MAC_APP_STORE_REFRESH_DELAY
增加到5秒以支持旧机器。版本 1.2
版本 1.1
版本 1.0