iVersion 1.11.5

iVersion 1.11.5

测试已测试
语言语言 Obj-CObjective C
许可证 zlib
发布上次发布2016年11月

Nick Lockwood 维护。



iVersion 1.11.5

  • 作者
  • Nick Lockwood

目的

Mac 和 iOS App Store 的更新机制有些繁琐,且与应用程序本身脱节。用户往往注意不到应用程序的新版本发布,即使注意到,App Store 的“下载全部”选项也意味着用户经常看不到自己每个应用程序的新版本发布说明。

虽然不允许在应用程序内部更新 App Store 应用,但没有理由应用程序不能通知用户新版本已准备好,并将他们直接引导到 App Store 下载更新。

如果你的应用程序不在 App Store 上,要么是因为它是内部/企业级 iOS 应用,要么是因为它是一个销往商店外部的客户的技术可交付的 Mac 应用,那么你无论如何都不能使用 App Store 的更新机制。

iVersion 是一个简单、零配置的类,允许 iPhone 和 Mac App Store 应用自动检查更新并通知用户新功能。

iVersion 会自动检测应用程序在 App Store 上发布的新版本,并使用一个有用的警报通知用户,其中包含直接链接应用程序下载页面的链接。

或者如果你的应用程序不在商店中,iVersion 允许你指定一个远程 Plist 文件来检查新版本,以及用户可以获取最新版本的下载 URL。

iVersion 的另一个功能是在用户下载新版本后首次运行应用程序时通知用户有关重要新功能。

支持的操作系统和 SDK 版本

  • 支持的构建目标 - iOS 10.1 / Mac OS 10.11 (Xcode 8.1, Apple LLVM 编译器 8.0)
  • earliest supported deployment target - iOS 6.0 / Mac OS 10.7
  • earliest compatible deployment target - iOS 4.3 / Mac OS 10.6

注:'支持的' 表示库已与该版本进行了测试。'兼容的' 表示库应在该 OS 版本上运行(即它不依赖于任何不可用的 SDK 功能),但由于不再测试兼容性,可能需要调整或修复错误才能正确运行。

ARC 兼容性

从版本 1.10 开始,iVersion 需要 ARC。如果您希望在非 ARC 项目中使用 iVersion,只需将 -fobjc-arc 编译器标志添加到 iVersion.m 类中。为此,请前往目标设置中的构建阶段选项卡,打开编译源组,在列表中双击 iVersion.m,在弹出窗口中输入 -fobjc-arc。

如果您希望将整个项目转换为ARC,请先在iVersion.m中注释掉#error行,然后在Xcode中运行“编辑 > 重构 > 转换为Objective-C ARC...”工具,并确保您想使用ARC的所有文件都已勾选(包括iVersion.m)。

线程安全性

iVersion内部使用多线程以避免阻塞UI,但iVersion的所有外部接口都不是线程安全的,您只能在主线程中调用iVersion的任何方法或设置任何属性。

安装

要将iVersion安装到您的应用程序中,将iVersion.h、.m和.bundle文件拖入项目。如果您不感兴趣本地化版本,可以省略.bundle。如果您使用的是IVERSION_USE_STOREKIT选项(仅限iOS),则需要添加StoreKit框架。

iVersion通常不需要任何配置,它将自动运行,并使用应用程序的包标识符在App Store中进行查找。

注意:如果您已有在Mac和iOS App Store上都具有相同包标识符的应用程序(即使它们的标记不同),查找机制将不起作用,您需要设置appStoreID属性,该属性是一个数字标识符,您可以在设置应用程序后在iTunes Connect中找到。这仅适用于App Store应用程序。

或者(或附加),您可以指定一个可选的远程托管Plist文件,用于发布说明而不是iTunes上的那些。即使您的应用程序已在商店中,提供自己的发布说明Plist文件也有一些优点

  1. 您可以为多个版本提供发布说明,如果用户跳过了某个版本,他们将看到他们错过所有更新的发布说明。

  2. 您可以提供更简洁的发布说明,适合在iPhone屏幕上显示。

  3. 您可以通过不包括最新发布的条目来推迟iVersion更新提醒,直到应用程序上线后。

如果您想自定义iVersion,最佳时间是使用完应用程序之后。最简单的方法是将iVersion配置代码添加到AppDelegate的initialize方法中,如下所示

+ (void)initialize
{
    //example configuration
    [iVersion sharedInstance].appStoreID = 355313284;
    [iVersion sharedInstance].remoteVersionsPlistURL = @"http://example.com/versions.plist";
}

您指定的Plist文件需要在某个公共 facing Web服务器上进行托管。您可以选择在应用程序中添加一个包含当前版本发布说明的Plist文件,并使用localVersionsPlistPath属性指定其路径。

这两个Plist的格式如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>1.0</key>
    <string>First release</string>
    <key>1.1</key>
    <string>NEW: Added  new snoodlebar feature
FIX: Fixed the bugalloo glitch</string>
    ...
</dict>
</plist>

Plist的根节点是一个包含一个或多个项的字典。每个项表示您应用程序的特定版本。

每个值的键必须是一个由正整数组成的数值版本号,由小数点分隔。这些应与您为iVersion的应用程序Version属性设置的值匹配,iVersion默认设置为您的应用程序info.plist中的Bundle Version(CFBundleShortVersionString或CFBundleVersion)键。

每个值应该是多行字符串或字符串数组,每个值代表发布说明中的一个单独的项目。没有关于每个发布说明格式的限制 - 上面示例中的方法只是建议。您也可以省略发布说明而只有一个空的.

Plist提示

不建议包含应用程序的每个版本在发布说明中。在实践中,如果用户很少更新,以至于他们错过了三个或更多的连续版本,您可能仍然只想向他们展示最后的几个版本的说明,因此,在您更新时从文件中删除较旧版本。

不要认为发行说明必须与iTunes或Mac App Store中的发行说明完全一致。模态警报中空间有限,用户在每次启动您的应用程序时也不愿阅读大量文本,因此可能最好只在您的versions.plist中列出关键的新功能。

本地和远程发行说明plist不必相同。虽然从维护角度来看使它们相同可能是方便的,但如果本地版本的语言略有不同,效果更好。例如,远程发行说明可能为

Version 1.1

- Fixed crashing bug
- Added shiny new menu graphics
- New sound settings

而本地版本可能为

Check out the new sound options in the settings panel. You can access the settings from the home screen

提及错误修复或新图形是没有意义的,因为用户只需通过使用应用程序就可以轻松查看这些内容。另一方面,他们可能不会注意到新的声音选项,也不知道如何找到它们。

也不必总是包含本地发行说明文件。如果新版本中没有需要引起注意的功能,只需省略该文件即可——它不会阻止您添加远程版本文件以提示用户升级,也不会阻止在未来版本中的本地发行说明正常工作。

配置

为了配置iVersion,有几个可以在iVersion类中改变其行为和外观的属性。这些属性大多数应该是自我解释的,但它们在下面有文档说明。

@property (nonatomic, assign) NSUInteger appStoreID;

这应该与您的应用程序的iTunes应用ID相匹配,您可以在设置应用程序后在iTunes连接中获取该ID。这个值通常是不必要的,通常只有在您的Mac和iOS应用程序的捆绑ID之间存在上述冲突时才需要。这个功能也仅用于远程版本更新,因此如果您不打算使用该功能,则可以忽略这个设置。

@property (nonatomic, copy) NSString *remoteVersionsPlistURL;

这是iVersion将用于检查发行说明的远程托管plist的URL。您可以在新版本被苹果批准并在商店中显示之前安全地更新此文件。如果您只想使用iTunes的发行说明,请将该值设置为nil。不要将其设置为无效的URL,如图所示http://example.com,因为当每次应用程序启动时应用程序尝试检查该无效URL时,这将浪费电池、CPU和带宽。如果您在plist中不包括特定的版本,iVersion不会为该版本显示更新警报,即使它在App Store中检测到新版本,除非您将useAppStoreDetailsIfNoPlistEntryFound选项设置为YES。

@property (nonatomic, copy) NSString *localVersionsPlistPath;

这是您的本地发行说明plist的文件名,用于在用户首次启动新的更新时告诉他们关于新功能的信息。如果您不希望您的应用程序显示当前版本的发行说明,请将该值设置为nil。

@property (nonatomic, copy) NSString *applicationVersion;

应用程序的当前版本号。这会自动从info.plist中的CFBundleShortVersionString(如果有)或CFBundleVersion字符串中设置,除非您知道自己在做什么,否则最好不要更改它。请注意,iTunes和远程版本plist中的版本号将与这个值进行比较,而不是info.plist中的那个值。

@property (nonatomic, copy) NSString *applicationBundleID;

这是应用程序的捆绑ID,用于从iTunes检索最新版本和发行说明。这会自动从应用程序的info.plist中设置,所以除非是为了测试目的,否则您通常不需要更改它。

@property (nonatomic, copy) NSString *appStoreCountry;

这是用于指定要检查哪个iTunes商店的两字母国家代码。它会根据设备的区域设置自动设置,因此大多数情况下不需要修改。您可以覆盖它,使其指向美国商店或其他特定商店,如果您的应用仅在某些国家可用,这可能是个好主意,但请注意,这将影响发布说明的显示语言。

@property (nonatomic, assign) BOOL showOnFirstLaunch;

指定是否在用户第一次启动应用时显示当前版本的发布说明。如果设置为否,则意味着例如下载了您的1.1版本但从未安装过旧版本的用户将不会看到1.1版本的新功能。

@property (nonatomic, assign) BOOL groupNotesByVersion;

如果您发布的说明文件包含多个版本,此选项将按版本号对用户显示的警告中的发布说明进行分组。如果设置为否,则发布说明将以单个列表的形式显示。默认值为否。

@property (nonatomic, assign) float checkPeriod;

设置应用检查新版本频率的时间间隔。以天为单位计算,但可以设置为分数值,例如0.5表示半天。将此设置为更高的值可避免您的服务器访问量过大。零表示每次启动时都会检查新版本。从iVersion 1.8版本开始,默认值为零。

@property (nonatomic, assign) float remindPeriod;

应用在用户选择“稍后提醒”选项后应等待多长时间才提醒用户有新版本。值为零表示应用将在每次启动时提醒用户。请注意,此值优先于检查周期,因此一旦设置提醒,应用将在提醒周期内不检查新版本,即使在此期间发布新版本也是如此。默认的提醒周期为一天。

@property (nonatomic, copy) NSString *inThisVersionTitle;

显示当前版本(即在本地版本s plist文件中)中的功能标题。

@property (nonatomic, copy) NSString *updateAvailableTitle;

当iVersion检测到远程版本的plist中出现新的应用版本时显示的标题。如果不将groupNotesByVersion设置为否,最新版本号将自动附加到此标题的括号中。

@property (nonatomic, copy) NSString *versionLabelFormat;

发布说明版本分隔符的格式字符串。应包含一个%@占位符,用于版本号,例如“版本%@”。此标签仅在将groupNotesByVersion设置为是时使用。

@property (nonatomic, copy) NSString *okButtonLabel;

用于关闭“新版本中包含”模态的按钮标签。

@property (nonatomic, copy) NSString *ignoreButtonLabel;

当用户不想下载新更新时按下的按钮标签。

@property (nonatomic, copy) NSString *remindButtonLabel;

当用户不想立即下载新更新,但希望将来得到提醒时按下的按钮标签。如果不想显示提醒按钮(例如,如果您屏幕上没有空间),请将其设置为@""

@property (nonatomic, copy) NSString *downloadButtonLabel;

用户想要下载新更新时按下的按钮标签。

@property (nonatomic, assign) iVersionUpdatePriority updatePriority;

这是一种简单的方法来隐藏忽略/提醒按钮,如果您想优先考虑更新。有三个优先级:iVersionUpdatePriorityLow是默认值,显示下载、提醒和忽略按钮;iVersionUpdatePriorityMedium隐藏忽略按钮;iVersionUpdatePriorityHigh隐藏提醒和忽略按钮,强制用户立即下载更新。

@property (nonatomic, assign) BOOL useAllAvailableLanguages;

默认情况下,iVersion将使用iVersion.bundle中所有可用的语言,即使在一个不支持本地化的应用中使用。如果您希望iVersion仅使用应用程序已支持的同一组语言,请将此属性设置为否(默认值为是)。

@property (nonatomic, assign) BOOL disableAlertViewResizing;

在iPhone上,iVersion包含一些逻辑来调整警告视图的大小,以确保在横屏模式下不会截断您的发布说明消息。执行此操作的代码是一个相当糟糕的快速解决方法,因此如果您的警告文本非常短或您的iPhone应用仅在横屏模式下需要功能,您可能希望将此属性设置为是,这可能有助于使您的应用对未来iOS更新的鲁棒性更强。尝试修改禁用示例,以演示此效果。

@property (nonatomic, assign) BOOL onlyPromptIfMainWindowIsAvailable;

此设置仅适用于Mac OS。默认情况下,在Mac OS上,iVersion警报以标签形式显示在主窗口上。某些应用程序没有主窗口,因此这种方法不起作用。对于此类应用程序,将此属性设置为NO以允许iVersion警报以常规模态窗口的形式显示。

@property (nonatomic, assign) BOOL useAppStoreDetailsIfNoPlistEntryFound;

如果您正在使用远程plist选项,默认情况下,即使检测到应用商店中有新版本,iVersion也只会显示更新警报,只要在该plist中找到发布说明条目。这允许您延迟宣布更新,或通过逐一省略plist中的版本来阻止宣布的小版本更新。如果希望当找不到plist条目时,iVersion使用应用商店的发布说明,请将此选项设置为YES(默认为NO)。

@property (nonatomic, assign) BOOL checkAtLaunch;

将此设置为NO以禁用在应用程序启动或从后台返回时自动检查本地和远程发布说明。禁用此选项不会阻止您通过分别调用checkIfNewVersioncheckForNewVersion来手动触发检查。

@property (nonatomic, assign) BOOL verboseLogging;

此选项将使iVersion向控制台发送有关版本检查过程的详细日志。如果您的应用程序不能正确检测到新发布,这有助于您找出原因。详细的日志记录默认在调试构建中启用,在发布和部署构建中禁用。

@property (nonatomic, assign) BOOL previewMode;

如果设置为YES,iVersion将始终显示本地和远程版本plist的内容,不受当前构建的版本号的影响。在测试期间,请使用此功能校对发布说明,但在最终发布时应禁用。

@property (nonatomic, assign) BOOL useUIAlertControllerIfAvailable;

默认情况下,iVersion将使用UIAlertView在iOS上显示评分提示。UIAlertView已在iOS8中弃用,并由UIAlertController取代。遗憾的是,与UIAlertView不同,使用UIAlertController显示警报会干扰应用程序显示其他控制器的能力,并且由于iVersion可以在应用程序生命周期的任何时刻显示警报,因此可能与尝试显示另一个视图控制器的应用程序冲突。因此,默认禁用UIAlertController。只有当您确定它不会与您的应用程序逻辑冲突时(例如,如果您已禁用自动版本提示或您的应用程序未使用任何模态视图控制器),才将此属性设置为YES。

高级属性

如果默认的iVersion行为不符合您的需求,您可以通过使用高级属性、方法和代理来实现自己的功能。下面的属性允许您访问内部状态并覆盖它

@property (nonatomic, strong) NSURL *updateURL;

当检测到更新并且用户选择下载时,应用程序将引导用户访问的URL。对于在内部使用或未通过应用商店分发的应用程序,您需要覆盖此设置。如果您为常规应用商店应用程序实现自己的下载按钮,应使用openAppPageInAppStore方法而不是打开此URL,尤其是在Mac OS上,因为打开Mac App Store的过程比仅仅打开URL要复杂。

@property (nonatomic, copy) NSString *ignoredVersion;

用户忽略的最后一个应用程序版本的版本字符串。如果用户未忽略任何发布,则此值为nil。将此设置为nil以清除忽略的版本。

@property (nonatomic, strong) NSDate *lastChecked;

iVersion检查更新的最后日期。您可以使用此功能与checkPeriod结合来确定应用程序是否应该再次检查。

@property (nonatomic, strong) NSDate *lastReminded;

用户被提醒新版本的最后日期。您可以使用此功能与remindPeriod结合来确定应用程序是否应该再次检查。将此设置为nil以清除提醒延迟。

@property (nonatomic, assign) BOOL viewedVersionDetails;

表示本地版本详细信息是否已查看(YES)或未查看(NO)的标志。

@property (nonatomic, assign) id<iVersionDelegate> delegate;

一种实现了以下文档中所述的 iVersionDelegate 协议的您提供的对象。使用此对象来检测和/或覆盖 iVersion 的默认行为。默认为 App Delegate,因此如果您正在使用您的 App Delegate 作为 iVersion 代理,则不需要设置此属性。

高级方法

- (void)openAppPageInAppStore;

此方法将根据所运行的平台和 OS 版本在 Mac 或 iPhone App Store 中打开应用页面,或直接在应用中打开。在许多情况下,启动应用商店的过程比仅仅打开 URL 复杂得多,因此应使用此方法而不是 updateURL 属性。注意,此方法依赖于 appStoreID,该值只有在轮询 iTunes 服务器后才检索到,如果该属性尚未设置,则将返回 NO。如果您打算在先执行更新检查后调用此方法,您需要提前自己设置 appStoreID 属性。

- (void)checkIfNewVersion;

此方法将检查本地版本的 Plist 文件以查看是否有新的注释要显示,并将它们显示在警报中。如果将 checkAtLaunch 设置为 YES,则在启动时自动调用此方法。

- (NSString *)versionDetails;

此方法返回当前版本的本地发布说明,或自上次应用启动以来已发布的任何版本,具体取决于在本地版本 plist 文件中包含了多少版本。如果这不是应用此版本的第一次启动,则只包含最新版本。

- (BOOL)shouldCheckForNewVersion;

此方法检查是否已满足检查新版本的准则。如果您已禁用应用启动时的自动显示,则可以使用此方法来确定是否检查版本更新。

- (void)checkForNewVersion;

此方法将触发对新版本的新检查,忽略 checkPeriod 和 remindPeriod 属性。如果将 checkAtLaunch 设置为 YES 并且 shouldCheckForNewVersion 返回 YES 时,则在启动时和当应用从后台返回时自动调用此方法。

代理方法

iVersionDelegate 协议提供以下方法,可用于截获 iVersion 事件并覆盖默认行为。所有方法都是可选的。

- (BOOL)iVersionShouldCheckForNewVersion;

如果在满足所有检查准则之后,即将进行新的版本检查时将会调用此方法。如果返回 NO,则不会执行检查。如果您使用 checkForNewVersion 方法手动触发检查,则不会调用此方法。

- (void)iVersionDidNotDetectNewVersion;

如果版本检查未检测到应用的任何新版本,将会调用此方法。

- (void)iVersionVersionCheckDidFailWithError:(NSError *)error;

如果由于网络问题或远程版本 Plist 文件丢失或损坏而版本检查失败,将会调用此方法。

- (void)iVersionDidDetectNewVersion:(NSString *)version details:(NSString *)versionDetails;

如果检测到新版本,将会调用此方法。

- (BOOL)iVersionShouldDisplayNewVersion:(NSString *)version details:(NSString *)versionDetails;

在即将显示新(远程)版本详情警报之前立即调用此方法。返回 NO 以阻止显示警报。请注意,如果您正在自行实现警报,您还需要根据用户响应自行设置 lastCheckedlastRemindedignoredVersion 属性。

- (BOOL)iVersionShouldDisplayCurrentVersionDetails:(NSString *)versionDetails;

在即将显示当前(本地)版本详情警报之前立即调用此方法。返回 NO 以阻止显示警报。请注意,如果您打算自行实现此通知,您还需要手动设置 viewedVersionDetails 标志。

- (void)iVersionUserDidAttemptToDownloadUpdate:(NSString *)version;

当用户在版本更新警告中点击下载按钮时,会调用此函数。如果您想记录用户与iVersion的交互,这将很有用。这种方法仅在您使用标准iVersion警告视图时才会调用,如果您提供了自定义警告实现或直接调用 openAppPageInAppStore 方法,则不会自动调用。

- (void)iVersionUserDidRequestReminderForUpdate:(NSString *)version;

当用户请求提醒新版本时,会调用此函数。如果您想记录用户与iVersion的交互,这将很有用。这种方法仅在您使用标准iVersion警告视图时才会调用,如果您提供了自定义警告实现,则不会自动调用。

- (void)iVersionUserDidIgnoreUpdate:(NSString *)version;

当用户在新版本警告中点击忽略时,会调用此函数。如果您想记录用户与iVersion的交互,这将很有用。这种方法仅在您使用标准iVersion警告视图时才会调用,如果您提供了自定义警告实现,则不会自动调用。

- (BOOL)iVersionShouldOpenAppStore;

当iVersion尝试通过URL或使用StoreKit应用程序界面控制器打开App Store之前,会立即调用此方法。如果您想实现自己的更新页面逻辑,则应返回NO。

- (void)iVersionDidPresentStoreKitModal;

当iVersion展示StoreKit应用程序界面控制器之后,会调用此方法。如果需要暂停您的应用中的某些功能等,将很有用。

- (void)iVersionDidDismissStoreKitModal;

当用户关闭StoreKit应用程序界面控制器时,会调用此方法。如果要在模态弹窗显示时暂停任何功能,这将很有用。

StoreKit支持

默认情况下,iVersion将通过启动App Store应用来打开评分页面。在iOS 6或更高版本中,您可以使用StoreKit框架设置iVersion显示应用页面而不离开应用。要启用此功能,请在您的prefix.pch文件中设置以下宏值

#define IVERSION_USE_STOREKIT 1

或者,作为备选方案,您可以将 IVERSION_USE_STOREKIT=1 添加为预处理宏。请注意以下注意事项和使用Storekit的限制

  1. iVersion无法直接在StoreKit中打开评分页面,只能打开应用详情页面。用户需要在评分之前点击评分标签。

  2. 已出现一些孤立案例,苹果拒绝了那些针对StoreKit框架但没有提供内购的App。如果您的应用尚未使用StoreKit,启用iVersion的此功能存在风险。

本地化

iVersion的默认字符串已本地化到多种语言。默认情况下,即使您的应用没有本地化或只本地化为iVersion支持语言的一个子集,iVersion也将使用所有在iVersion.bundle中的本地化。

如果您希望iVersion只使用您应用中启用的本地化(例如,如果您的应用只支持英语、法语和西班牙语,则iVersion将自动本地化这些语言,但不为德语本地化,尽管iVersion包含德语文件),将useAllAvailableLanguages选项设置为NO。

如果可用,iVersion会自动使用您在iTunes上指定的本地化发行说明。

不建议您修改iVersion.bundle中的字符串文件,因为这会使更新到iVersion的新版本变得复杂。例外情况是,如果您希望向github上的iVersion项目提交额外语言或改进或对本地化的改进和更正(这会非常受欢迎)。

如果您想在应用中为iVersion添加额外的语言功能,而无需将其提交回GitHub项目,您可以直接将相关的字符串添加到项目文件夹中相应的Localizable.strings文件。如果您想替换一些或全部默认的iVersion字符串,最简单的方法是将这些字符串复制到自己的Localizable.strings文件,然后进行修改。iVersion将自动优先使用主应用程序包中的字符串,而不是iVersion包中的字符串,因此您可以以这种方式覆盖任何字符串。

如果您不希望使用任何默认本地化,您可以将iVersion.bundle整个省略。注意,如果只想支持iVersion支持的语言子集,不需要从iVersion.bundle中删除其他字符串文件——只需将useAllAvailableLanguages设置为NO,iVersion将仅使用您的应用已经支持的语言。

仍然支持使用单个setter方法来覆盖iVersion默认字符串的旧方法(如下所示),但现在的推荐做法是将这些字符串添加到项目的Localizable.strings文件,iVersion将自动检测到这些文件。

+ (void)initialize
{
    [iVersion sharedInstance].inThisVersionTitle = NSLocalizedString(@"New in this version", @"iVersion local version alert title");
    [iVersion sharedInstance].updateAvailableTitle = NSLocalizedString(@"A new version of MyApp is available to download", @"iVersion new version alert title");
    [iVersion sharedInstance].versionLabelFormat = NSLocalizedString(@"Version %@", @"iVersion version label format");
    [iVersion sharedInstance].okButtonLabel = NSLocalizedString(@"OK", @"iVersion OK button");
    [iVersion sharedInstance].ignoreButtonLabel = NSLocalizedString(@"Ignore", @"iVersion ignore button");
    [iVersion sharedInstance].remindButtonLabel = NSLocalizedString(@"Remind Me Later", @"iVersion remind button");
    [iVersion sharedInstance].downloadButtonLabel = NSLocalizedString(@"Download", @"iVersion download button");
}

如果您使用的是远程版本Plist,并且需要提供本地化发布说明,最简单的方法是对remoteVersionsPlistURL文件进行本地化处理,并为每种语言提供一个不同的URL,如下所示

+ (void)initialize
{
    [iVersion sharedInstance].remoteVersionsPlistURL = NSLocalizedString(@"http://example.com/versions_en.plist", @"remote iVersion plist URL");
}

示例项目

第一次构建和运行基本的Mac或iPhone示例项目时,它会显示一个警告,说明有新版本可用。这是因为它已下载远程版本的.plist文件,并确定最新版本比当前运行的版本更新。

退出应用,进入iVersion-Info.plist文件并编辑包版本为1.2。现在重新构建应用。

这次它不会再说有新版本可用。实际上,您已经模拟了升级。取而代之的是,它会向您介绍当前已安装版本的新功能。这是因为它发现当前应用的包版本比上次启动时记录的最后版本更新,并且已经检查了本地versions.plist文件以查找新版本发布说明的条目。

如果您关闭了对话框并退出再重新启动应用,现在应该什么都不会显示。这是因为应用已经检测到包版本自上次启动应用以来没有变化。

要再次显示警告,请从模拟器中删除应用并将包版本重置为1.1。或者,启用previewMode选项以在启动时强制显示警告。

高级示例

高级示例展示了您如何完全自定义iVersion界面。自动版本检查已被禁用,用户可以通过按“检查新版本”按钮触发检查。

按下按钮时,应用会显示进度轮转动,并在按钮下方的控制台打印结果。

这是一个为Mac OS设计的示例,但同样也适用于iOS。

发布说明

版本1.11.5

  • 更新适用于iOS 10和Xcode 8
  • 修复App Transport Security (ATS)问题
  • 修复使用CocoaPods时的语言文件问题
  • 修复Gibraltar App Store链接问题
  • 添加繁体中文本地化
  • 添加台湾繁体本地化
  • 添加捷克语本地化
  • 添加英国英语本地化
  • 改进日语本地化
  • macOS上不再可编辑发布说明字段

版本1.11.4

  • 添加了useUIAlertControllerIfAvailable选项
  • 默认禁用UIAlertController,因为它可能会干扰应用中的控制器逻辑

版本1.11.3

  • 修复了iOS上处理alert按钮时的关键错误
  • iVersion现在将使用iOS 8+的UIAlertController

版本1.11.2

  • 修复了为Mac OS X 10.10编译时出现的编译器错误
  • 修复了一些额外的警告

版本1.11.1

  • 添加了对支持的最低iOS版本的检查,以防止通知无法安装的更新

版本1.11

  • 添加了updatePriority属性,用于配置更新优先级
  • 修复了将ignoreLabel和remindLabel设置为空白时引起的错误行为
  • 修复了当设备区域设置为欧洲时获取app ID的问题
  • 默认不再需要StoreKit(请参阅README获取详细信息)
  • 删除了disableAlertViewResizing属性(不再需要)
  • 添加了土耳其语翻译
  • 改进了对HTTP请求错误的处理
  • 现在符合-Weverything警告级别
  • 在Mac OS上删除了已弃用的方法

版本1.10.6

  • 修复了当plist中包含版本晚于应用商店最新版本时的崩溃问题

版本1.10.5

  • 修复了在NSJSONSerializer实现中的关键错误

版本1.10.4

  • 添加了葡萄牙语和俄语翻译
  • 现在如果可用,则使用NSJSONSerializer,这将解决应用商店描述包含双引号的问题(iOS 4.x仍将使用旧解析器)

版本1.10.3

  • 修复了当发布说明JSON包含0x00字符时可能出现的无限循环问题
  • 在Mac OS上,现在在滚动文本字段中显示发布说明(感谢Daij-Djan的建议)。

版本1.10.2

  • 修复了即使启用预览模式,如果应用已经发布但没有发布说明,则alert不会出现的问题
  • 解决了在iOS 5.0.x中可能出现的问题,即应用商店链接不起作用(未经证实)。
  • 不再在Mac OS上包含StoreKit框架
  • 添加了podspec

版本1.10.1

  • 修复了当用户版本与应用商店中最新版本不匹配时,iVersion可能会显示未发布版本的发布说明的问题
  • 修复了针对iOS 6及更高版本时的弃用警告
  • iVersion现在可以正确显示StoreKit产品视图控制器,即使模态显示了一个视图控制器
  • 添加了iVersionDidPresentStoreKitModal和iVersionDidDismissStoreKitModal委托方法
  • 添加了useAppStoreDetailsIfNoPlistEntryFound选项
  • 添加了丹麦语翻译

版本1.10

  • 添加了新的本地化系统(请参阅README获取详细信息)
  • 在iOS 6中,iVersion现在可以使用StoreKit API在应用内直接显示产品页面。
  • iVersion现在需要iOS上的StoreKit框架
  • iVersion现在需要ARC。要在非ARC项目中使用iVersion,请遵循README文件中的说明。
  • 不再支持运行Snow Leopard的32位Mac
  • 修复了iOS 6中的弃用警告

版本1.9.8

  • 添加了verboseLogging选项,以便更容易诊断为何无法正确检测到新版本
  • 将debug属性重命名为previewMode,因为这更能描述其功能
  • 修复了某些类型的下载错误未正确传递给代理的bug

版本1.9.7

  • 修复了使用Xcode 4.4编译时在iOS 4.x和Mac OS 10.6.x上发生的崩溃

版本1.9.6

  • 添加了对iOS6的支持。目前似乎无法在iOS6中将用户直接链接到发布说明页面,但iVersion现在至少可以在没有错误的情况下打开应用商店的应用页面。
  • iVersion现在正确显示本地化发布说明
  • 删除了appStoreLanguage属性,因为这个属性不再使用

版本1.9.5

  • 修复了缓存策略,使得应用程序运行期间版本数据不再在请求之间缓存
  • 修复了德语翻译中的拼写错误

版本 1.9.4

  • 现在在 iOS 中直接将用户链接到应用商店的更新页面
  • 修复了一个问题,即可能在 delegate 方法中设置的属性随后被 iVersion 覆盖
  • 添加了 disableAlertViewResizing 选项(详细信息请参见 README 文件)
  • 添加了调整大小禁用示例项目
  • 添加了对于远程版本检查的显式60秒超时
  • 当关闭并重新打开应用程序进行检查时,iVersion 现在将不会生成多个下载线程
  • 添加了简体中文翻译

版本 1.9.3

  • 现在,可以通过 onlyremoteVersionsPlist 来使用 iVersion 与不在 iOS 或 Mac 应用商店中的应用程序
  • 现在可以通过调试模式测试发布说明

版本 1.9.2

  • 添加了防止竖屏模式下 UIAlertView 崩溃的逻辑
  • 缩短了默认的 updateAvailableTitle 以更好地适应警报
  • 移除了不再使用的 applicationName 配置属性
  • 修复了意大利本地化 updateAvailableTitle 文本中的错误
  • groupNotesByVersion 现在默认为 NO

版本 1.9.1

  • 修复了一个问题,其中包含逗号的发布说明不会显示
  • 现在正确处理包含 unicode 字面量的发布说明
  • 现在使用 localeIdentifier 作为语言参数以匹配 iTunes 格式

版本 1.9

  • 包含了对法语、德语、意大利语、西班牙语和日语的本地化
  • 除非有其他指定,iVersion delegate 现在默认为 App Delegate
  • 现在根据用户的地区设置检查正确的 iTunes 商店国家

版本 1.8

  • iVersion 现在在大多数情况下完全无需配置!
  • iVersion 可以根据您的应用程序包标识符自动检测使用官方 iTunes App Store 搜索 API 的应用程序更新
  • 大多数情况下不再需要设置应用程序商店 ID
  • 已将默认检查周期更改为 0.0,以便在每次启动时进行版本检查
  • 已删除 PHP 网络服务,因为它不再需要

版本 1.7.3

  • 添加了缺失的 iVersionDidNotDetectNewVersion delegate 方法
  • 添加了逻辑以防止在下次打开提示之前用户未能关闭一个提示时重复显示多个提示
  • 添加了针对 iOS5 中 UIApplicationWillEnterForegroundNotification 实现更改的解决方案

版本 1.7.2

  • 添加了对 ARC 编译目标的自动支持
  • 现在需要 Apple LLVM 3.0 编译器目标

版本 1.7.1

  • 现在,如果有可用的 CFBundleShortVersionString,将使用它而不是 CFBundleVersion 作为应用程序版本
  • 修复了 iversion.php 网络服务中平台设置不正确的问题
  • 在服务中添加了逻辑,在有可用的 curl 时使用 curl 而不是 file_get_contents 读取 iTunes 搜索服务数据

版本 1.7

  • 添加了额外的委托方法以方便记录
  • 重命名了一些委托方法
  • 删除了 localChecksDisabled 属性,并将 remoteChecksDisabled 属性重命名为 checkAtLaunch 以提高清晰度和与 iRate 和 iNotify 库的一致性
  • 合并了 remoteDebug 和 localDebug 以简化使用
  • 添加了 checkIfNewVersion 方法以手动触发显示本地版本详细信息

版本 1.6.4

  • 更新了 iVersion 网络服务,以使用官方 iTunes App Store 搜索 API
  • 如果可用,iVersion 现在使用 CFBundleDisplayName 作为应用程序名称
  • 增加了旧 Mac 上 Mac App Store刷新的延迟
  • 简化了版本比较逻辑
  • 重新整理了示例

版本 1.6.3

  • 修复了网络服务并更新了项目以兼容 Xcode 4.2

版本 1.6.2

  • 修复了 iOS 上新版本警报中的版本详细信息

版本 1.6.1

  • 修复了在下载版本详细信息时,iOS 版本低于 4.0 时的崩溃问题

版本 1.6

  • 添加了 openAppPageInAppStore 方法以更可靠地打开 Mac App Store
  • 修复了 Mac OS 上本地版本 plist 路径的问题
  • 将一些配置设置名称重命名,以符合Cocoa约定并防止静态分析器警告
  • 添加了显式实例变量以支持i386(32位x86)目标

版本1.5

  • 添加了用于从iTunes自动抓取版本号的PHP网络服务示例
  • 添加了代理和附加访问器属性以支持自定义行为
  • 添加了高级示例项目以演示委托协议的使用

版本1.4

  • 现在与iOS 3.x兼容
  • 本地版本的plist路径现在可以嵌套在Resources子文件夹中

版本1.3

  • 添加了Mac演示项目
  • 将Mac App Store打开机制更改为不再首先启动浏览器
  • 纠正了文档中的错误

版本1.2

  • 配置不再涉及修改iVersion.h文件
  • 现在可以自动检测应用程序启动和应用程序切换事件
  • 更新通知中不再需要包含版本说明
  • 更易于本地化

版本1.1

  • 添加了可选的提醒我按钮
  • 添加了指定更新周期的能力
  • 现在可以将本地版本文件路径设置为nil

版本1.0

  • 初始发布