# 1.8.0

* New SUDSAVerifier based on up-to-date OS X APIs (Zachary Waldowski)
* Detailed error log for failed signature checks (Kornel Lesiński)
* Converted Sparkle to ARC (C.W. Betts)
* Converted ivars to properties. (Jake Petroules)
* Cocoapod support (Xhacker Liu)
* Quarantine removal on OS X 10.10 (C.W. Betts)
* Updated Japanese localization (1024jp)
* Added Greek localization

# 1.7.1

* Removed option to install unverified updates (Kornel Lesiński)
* Added detailed log when code signing verification fails (Sam Deane)
* Restored original Sparkle icon. (Jake Petroules)
* Switched SUUpdateAlert.xib to AutoLayout (Kornel Lesiński)
* Replace references to andymatuschak.org with sparkle-project.org. (Jake Petroules)
* Several code cleanups, modernizations, fixed warnings and improved code formatting (Jake Petroules)
* Make the repository significantly more organized. (Jake Petroules)
* Xcode project: set organization name and class prefix. (Jake Petroules)
* Link to Foundation and AppKit instead of Cocoa. (Jake Petroules)
* Use new operatingSystemVersion API when available. (Jake Petroules)
* Add .clang-format configuration file for source code formatting. (Jake Petroules)
* Add a target to build Sparkle API documentation using Doxygen. (Jake Petroules)

# 1.7.0

* Dropped support for OS X 10.6. Sparkle now supports 10.7 and newer (including 10.10 Yosemite) on 64-bit Intel Macs (the last 32-bit Mac was released in 2006).
* Removed use of deprecated functions (Zachary Waldowski)
* Switched to modern Obj-C runtime and new literals syntax
* Removed pre-10.7 code. (C.W. Betts)
* Use more Blocks/libdispatch code. (C.W. Betts)
* Cleaned up and improved security of `generate_keys`/`sign_update` scripts

# 1.6.1

* Removed archive password prompt (Kornel Lesiński)
* (Re)fixes bug where URLs are naively double escaped (Andrew Madsen)
* Fixed typo that caused crashes in BinaryDelta (Tamas Lustyik)
* SUStandardVersionComparator.h is public (Vincent CARLIER)
* Remove pre-10.6-specific code. (C.W. Betts)
* Objective C 2 getters and setters. (C.W. Betts)
* Define correct dependencies on locale scripts (Antonin Hildebrand)

# 1.6.0

* Cleaned up and deleted redundant strings files (Kornel Lesiński)
* Modern Objective C syntax, properties where possible. (C.W. Betts)
* Make SUAppcastDelegate a formal protocol. (C.W. Betts)
* Fixed default font in release notes WebView (Kornel Lesiński)
* Configurable name for finish_installation.app (Kornel Lesiński)
* Removed code for 10.4 (Kornel Lesiński)
* Convert all strings files to UTF-8 (UTF-16 must die) (Kornel Lesiński)
* Removing GC target (Matt Thomas)
* finish_installation.app and pkg files will not removed when we use *.pkg installer and restart system in the installer (Takayama Fumihiko)
* Select Korean and Slovak for Sparkle.strings localization (Shon Frazier)
* Updated the Romanian translation (Gabe)
* pt-BR localization polishing (BR Lingo)
* update zh_CN (61)
* Shut up some warnings & make build with newer Xcode (Uli Kusterer)
* Less unsafety with format strings (Uli Kusterer)
* New icon (Rick Fillion)
* fixed a 'content rectangle not entirely onscreen' warning (Simone Manganelli)
* updated sends system profile to use info.plist if user defaults key isn't present (Jamie Pinkham)
* Support for notifications on some updater events (Doug Russell)
* Allow the delegate to trigger a silent install and relaunch (Matt Stevens)
* Support silent relaunches (Matt Stevens)
* Increment the sudden termination counter if installing on quit (Matt Stevens)
* Prompts the user to update after a week (rather than a day) if he doesn't quit the app (Andy Matuschak)
* Adding <sparkle:tags> appcast item element, <sparkle:criticalUpdate /> tag (Andy Matuschak)
* We have this check box that says "Automatically download and install updates in the future." But we only download them automatically. We still ask permission again before installing them. (Andy Matuschak)

# 1.5.0-beta6

* Important Changes
 * Sparkle now requires DSA signatures on your updates. Check the documentation for more information on how to set that up if you don't already sign your updates. You can bypass this requirement if you deliver both your appcast and your updates over SSL.
* Sparkle will no longer display release notes located at file:// URLs, since Javascript on such a page would be able to read files on your file system.
* For security reasons, Sparkle will refuse to install updates which appear to "downgrade" the app.
* SUUpdater now implements new keys: "automaticallyDownloadsUpdates", "lastUpdateCheckDate", and "sendsSystemProfile."
* Fixed a bug that could prevent SUProbingUpdateDriver from working.
* Fixed a bug that prevented the updaterWillRelaunchApplication: delegate method from getting called.
* Fixed displaying release notes transmitted "loose" in the <description> key.
* Fixed Sparkle compilation on 10.4 systems.
* Fixed a bug that could cause window confusion if an app changed its LSUIElement at runtime.
* Added support for Sparkle 1.1's behavior of disabling updates when the check interval is 0.
* Sparkle can now handle appending parameters to URLs which already have parameters.
* If an update's sparkle:shortVersionString is the same as the host's CFBundleShortVersionString, the sparkle:version and CFBundleVersion will be presented in parentheticals.

# 1.5.0-beta5

* Important Changes!
 * Made every Sparkle class private except for SUUpdater, SUAppcast, SUAppcastItem, and the SUVersionComparisonProtocol.
 * There is now a single SUUpdater singleton for every host bundle; instead of -[SUUpdater setHostBundle], you can use +[SUUpdater updaterForBundle].
 * Redefined the (entire) delegate protocol accordingly.
 * Renamed -[SUUpdater updatePreferencesChanged] to -[SUUpdater resetUpdateCycle]. This provides better semantics for non-apps, which need to start the update cycle manually.
 * -[SUUpdater checkForUpdatesWithDriver] is private. If you were using SUProbingUpdateDriver, you can now use -[SUUpdater checkForUpdateInformation] for a similar effect.
 * All the user defaults keys are now private; instead, SUUpdater is KVC-compliant for automaticallyChecksForUpdates, updateCheckInterval, and feedURL.
* Reduced the size of the English-only framework by 25%.
* System profiling information is now only submitted to the server once per week; this will help normalize your statistics across users with different interval preferences.
* The feedParamatersForUpdater: delegate method now requires "displayKey" and "displayVersion" keys so that it can inform the user what's being sent.
* Added a delegate method called pathToRelaunchForUpdater: which can be used for plugins to provide the path which should be used when relaunching the client after installing an update.
* Added support for xml:lang to pick localized nodes in appcasts (for release notes, etc).
* Fixed a bug which would cause the "checking for updates" window to not disappear in certain extraordinary error conditions.
* Fixed a DSA signature checking bug for .tar.gz archives.
* Sparkle now refuses to update on any read-only volume, not just dmgs.
* Sparkle will clean up the host app's name and version before sending it as the user agent string; some non-ASCII characters were causing problems.
* Added an Italian localization courtesy Michele Longhi.
* Added a Swedish localization courtesy Daniel Bergman.
* Fixes to the French localization courtesy Ronald Leroux and Yann Ricqueberg.
* Fixes to the German localization courtesy Sven-S. Porst.
* Fixes to the Russian localization courtesy Alexander Bykov and Anton Sotkov.
* Fixed a number of issues related to archive format detection: I reverted back to extensions from UTIs.
* Focus behavior fixes for LSUIElement apps.
* The status window progress bar now animates even when indeterminate.
* Major refactorings to improve functionality for non-app bundles.

# 1.5.0-beta4

* Fixed a critical bug which prevented non-.dmgs from unarchiving properly.
* Added reporting of 64-bit capability to the profiling system.

# 1.5.0-beta3

* Added a new delegate method to SUUpdater.h to allow delegates to specify custom version comparators.
* Added a German localization, courtesy the Camino localizer team: Dominik Tobschall, Tobias Stohr, and Friedemann Bochow.
* Bug fixes:
 * Fixed a serious bug which could cause a server to be DDoS'd (or the host app to crash!) if an appcast fails to be parsed.
 * Fixed .tbz extraction if the archive was made with Stuffit.
 * Fixed support for .tar.bz2 and .tar.gz; Sparkle has to assume the archive is a tar when it sees "bz2" and "gz"; don't use those without tarring.
 * Fixed a typo which caused the shouldPromptForPermissionToCheckForUpdatesToHostBundle: method to not work in 1.5b2.
 * Fixed .zip extraction on Tiger (Apple changed the UTI between releases)
 * Fixed a crasher on Tiger.
 * Fixed display of the default app icon when the host app doesn't have an icon.
 * Sparkle now displays a sensible progress string and uses an indeterminate progress bar when the server doesn't report a file size.
 * Fixed some memory leaks.

 # 1.5.0-beta2

 * Compatibility Issues:
 * Most of the delegate method selectors have changed to scale better. See SUUpdater.h for changes; you'll likely have to make changes if you implement any delegate methods.
 * If you're using .tar.gz or .tar.bz2 archives, name them ".tbz" or ".tgz" instead; Sparkle now uses UTIs for archive detection, and it's not  smart about double extensions.
 * I'm no longer supporting 10.3. This may or may not work on Panther—probably not.
 * Sparkle's no longer built for ppc64 by default. If you want to ship that, feel free to build your own, but this saves a few hundred k.
* Enhancements:
 * Sparkle now detects if the preferences for automatic update checks or the time interval change mid-cycle.
 * If your product is a non-.app, you need to clue Sparkle in on the change by calling [[SUUpdater sharedUpdater] updatePreferencesChanged].
 * Added a cancel to the "checking for updates..." dialog.
 * Sparkle now cleans up all its litter in /tmp.
 * Made SUUpdater's delegate an IBOutlet so you can hook it up in IB.
* Bug fixes:
 * Sparkle no longer crashes on non-GC hosts when the user cancels an update's downloads.
 * Sparkle no longer gets stuck in an inconsistent state or crashes when it can't parse the appcast on scheduled updates.
 * Added the sharedUpdater method to SUUpdater, as it should have been.
 * Fixed a bug where the "checking for updates..." window wouldn't go away if an error occurs while checking for updates.
 * Made the dual-mode build configuration actually use the .xcconfig which builds it with GC support. (oops!)
 * Fixed relaunching for prefpanes.
 * Sparkle no longer fails to install updates on Snow Leopard (though there's still an issue with trashing the old version of the app, but it seems to be a 10.6 bug)
 * Sparkle now handles redirects correctly under Tiger.
 * Fixed the installation path for non-.app bundles.
 * Fixed a bug which could crash Sparkle under non-English locales.
 * Fixed a weird race condition which could cause the relaunch tool to never notice that its target relaunched.
 * Fixed a bug where if the host app is inactive when an update occurs, the update alert sometimes doesn't become key.
 * Minor textual fixes.
* Localizations:
 * Dutch: Maarten Van Coile
 * French: Yann Ricquebourg
 * Spanish: Ernesto Gomez Cereijo

 # 1.5.0-beta1

 * The most important things to know:
 * The 10.3 support is untested at best; sketchy at worst. Test with it thoroughly before you use it.
 * Sparkle now asks for permission to update on second launch; don't be surprised at that. You can change that behavior with a delegate method; read SUUpdater.h for more info.
 * We no longer distinguish between "check on startup" and "scheduled updates"; everything is scheduled, with the default being every day.
 * The test application is using the new profiling features, but that's only for demonstration: these are off by default. More on this later.
 * There are no localizations yet.
* New features:
 * Sparkle now supports .pkgs. Just name the .pkg the name of the app and put in the update archive.
 * Sparkle now sends optional demographic profiling information; set SUEnableSystemProfiling to YES in your Info.plist and check out the GET data sent to your webserver when fetching the appcast. More on this in the documentation. The test application has this on so you can see the behavior.
 * Sparkle now supports updating non-.apps. Just call -setHostBundle: on the global SUUpdater to let it know what you're trying to update.
 * Sparkle now supports garbage collection in the host app. Use "Sparkle-with-GC.framework" for that, but be aware it's 10.5-only.
 * Sparkle is now 64-bit compatible, compiling both ppc64 and x86_64.
 * Sparkle now supports a sparkle:minimumSystemVersion key you can set on appcast items. It does what you think it does.
 * Sparkle now checks to see if the host app is running from a disk image and refuses to update if it is. (10.4+ only)
 * Added support for entities in enclosure paths.
 * The file size output is now formatted prettily.
 * Sparkle now gives visual indication that it's checking for updates when the update's user initiated. ie: it pops up a status controller saying "checking for updates..."
 * Added support for an SUPublicDSAKeyFile, so people don't have to copy/paste their entire key into their Info.plist. Set this key in your Info.plist to the filename of the key in your Resources directory.
 * Added an actually maintainable codebase.
* Changes:
 * Sparkle version comparison is now dramatically less stupid and verified by a bunch of unit tests. If something doesn't work the way you think it should, add a test to SUVersionComparisonTest.m
 * Added a minimum to the check interval so that developers don't accidentally release their apps into the wild with 60-second test check intervals and have DOS-attack-like results. It's an hour now for release mode; feel free to change it.
 * The relaunching process now uses a separate helper app, which is a much more robust method.
 * Changed CFBundleShortVersionString behavior: Sparkle no longer uses Apple's about box style of displaying ShortVersionString (CFBundleVersion) when the latter is available.
 * No more MD5 checking. Use DSA: it's actually secure.
 * The abomination that was SUStatusChecker is dead. Use SUProbingUpdateDriver instead.
* Bugfixes:
 * Fixed a huge bug with fully-automatic updating: before, if the user chose to relaunch later, the app would be running from the trash for a while. Now the buttons are "install and relaunch" or "install later."
 * Sparkle forces Spotlight to reindex the updated app so that it won't keep pointing to the one in the trash.
 * Sparkle trims whitespace from around DSA signatures; this could cause crashes before.
 * Fixed a bug where the user choosing to skip a version would inhibit future automatic updates until the next launch.
 * Fixed a bug that could occur when the app has a localized CFBundleName.
 * .dmgs now work on Leopard.
 * The status controller's button now sizes appropriately to the localization.
 * Sparkle now works correctly with LSUIElement apps: it focuses them before displaying the update alert.
 * Sparkle now deletes failed partial downloads.
 * The update alert no longer floats above everything in the app.
 * Fixed varied and sundry memory leaks.
* A ton of other things that I've forgotten or were too small to mention!

# 1.1

* Optimized framework size: now only 1.4mb with all localizations and 384kb with only English (an English-only version is in the Extras folder).
* Added a new SUStatusChecker class for programmatically determining if a new version is available (see the docs); thanks, Evan Schoenberg!
* Added support for apps using SIGCHLD; thanks, Augie Fackler!
* Added a zh_CN update from JT Lee
* Added a Polish update from Piotr Chylinski
* Fixed DMG support for images with /Applications symlinks.
* Fixed a really stupid interval-checking bug that could cause repeated hits to the appcast.
* Fixed a bug where the check interval would be inconsistent if a value of 0 was stored in the user defaults.

# 1.0

* Additions:
 * Added real version comparison courtesy Kevin Ballard: Sparkle now knows that 0.89 < 1.0a3 < 1.0.
 * Added many localizations courtesy David Kocher's localization team.
 * Added a much better installation mechanism courtesy Allan Odgaard.
 * Added a user agent string to the RSS fetch request.
 * Added support for CFBundleShortVersionString in addition to CFBundleVersion, and support for a sparkle:shortVersionString attribute on the enclosure.
 * Added support for CFBundleDisplayName if available.
* Changes:
 * Automatic updating is now allowed by default, but only if DSA signing is on.
 * Pressing Escape or closing the update alert now reminds the user later.
 * Now when there's a stored check interval, Sparkle doesn't check immediately on startup the first time the app is launched because the user hasn't consented to it yet.
 * The update alert now remembers its size and floats.
* Bug Fixes:
 * Fixed installation of DMGs with multiple files enclosed.
 * Fixed a nasty memory leak.
 * Fixed a bug wherein having no value for allowing automatic updates would display a checkbox for the updates but would not honor it.
 * Fixed a bug in zip extraction that occurred in Panther.
 * Fixed release notes caching.
 * Fixed a bug wherein Sparkle refused to authenticate the installation if the user had cancelled authentication previously in that session.
 * Fixed a weird bug that would cause a second help menu to appear on first launch.
 * Fixed a bug that could occur when changing the scheduled check interval.
 * Fixed a bug wherein the host app could crash if the user clicked Remind Me Later before the release notes finished loading.
 * Fixed a bug wherein the behavior was undefined if the user manually initiated a check when an automatic one was already taking place.
 * Fixed wrapping on the description field in the update alert.

# 1.0-beta3

* Fixed a nasty crasher that occurred often when the user was not connected to the internet.

# 1.0-beta2

* Major Improvements:
 * Fully automatic updating! (see the Documentation: this is beta and off by default)
 * Added support for DSA signatures (see the Documentation).
 * Added support for MD5 sum verification.
 * Added Security.framework-based authentication for installing to privileged directories.
 * Huge refactoring of the codebase: there's now a Sparkle Xcode project, Sparkle is now a framework, and everything is modular / abstracted. And no more code-generated interface.
* Minor Improvements:
 * A SUUpdaterWillRestartNotification is sent out before restarting now.
 * Added key equivalents to alert panel buttons.
 * Error handling is much prettier now: technical messages are not presented to the user anymore.
 * There's now a test app for developers to see what Sparkle's like before using it.
 * Wrote new, pretty, extremely thorough documentation.
* Bug Fixes:
 * Relaunch behavior is much improved and shouldn't fail in huge apps anymore.
 * Fixed a bug wherein a failing tar command could crash the host app.
 * Sparkle now looks at InfoPlist.strings in addition to Info.plist.
 * Fixed some stupid typos.

# 1.0-beta1

* Major New Features:
 * Sparkle now supports scheduled periodic updates—read the Readme for information on how to use it.
 * Sparkle now supports WebKit-based release notes (for CSS and full HTML), which it displays in the main update alert, not a separate panel. The Readme has much more information. Sparkle will, of course, fall back on NSTextView if the host app does not include WebKit.
* Minor New Features:
 * Added support for .zip update archives.
 * Added support for .dmg update archives.
 * Implemented Remind Me Later to replace simple update cancellation.
 * Implemented Skip This Version functionality.
 * Added support for multiple feeds via the user defaults SUFeedURL key taking precedent over the one in Info.plist.
 * Added support for Sparkle's custom XML namespace, which is optional but may prove useful. See the Readme for more information.
* Bug Fixes:
 * Sparkle will no longer enter an inconsistent state if the user tries to update again while one is already in progress.
 * Sparkle now uses CFBundleName to determine the application's name instead of the app's filename.
 * Sparkle no longer crashes if the user cancels during extraction.
 * Lots of code refactoring.

# 0.1

* Initial Release
