{"id":13567738,"url":"https://github.com/EightyThreeCreative/ShineUpdater","last_synced_at":"2025-04-04T02:32:49.077Z","repository":{"id":62455334,"uuid":"129100789","full_name":"EightyThreeCreative/ShineUpdater","owner":"EightyThreeCreative","description":"An Enterprise app update framework for iOS","archived":false,"fork":false,"pushed_at":"2024-06-13T19:31:21.000Z","size":520,"stargazers_count":299,"open_issues_count":1,"forks_count":12,"subscribers_count":10,"default_branch":"master","last_synced_at":"2024-10-01T15:34:11.543Z","etag":null,"topics":["ad-hoc","deployment","enterprise","ios","update-checker","updater"],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EightyThreeCreative.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-04-11T13:47:15.000Z","updated_at":"2024-08-08T11:31:55.000Z","dependencies_parsed_at":"2024-08-01T13:25:23.618Z","dependency_job_id":"eea00d4c-1562-4bf2-89c0-fbea8a536118","html_url":"https://github.com/EightyThreeCreative/ShineUpdater","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EightyThreeCreative%2FShineUpdater","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EightyThreeCreative%2FShineUpdater/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EightyThreeCreative%2FShineUpdater/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EightyThreeCreative%2FShineUpdater/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EightyThreeCreative","download_url":"https://codeload.github.com/EightyThreeCreative/ShineUpdater/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223083201,"owners_count":17084829,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ad-hoc","deployment","enterprise","ios","update-checker","updater"],"created_at":"2024-08-01T13:02:41.060Z","updated_at":"2024-11-04T22:33:08.490Z","avatar_url":"https://github.com/EightyThreeCreative.png","language":"Swift","funding_links":[],"categories":["Swift"],"sub_categories":[],"readme":"# Shine ![Pod Version](https://img.shields.io/cocoapods/v/ShineUpdater.svg?style=flat) ![Pod Platform](https://img.shields.io/cocoapods/p/ShineUpdater.svg?style=flat) ![Pod License](https://img.shields.io/cocoapods/l/ShineUpdater.svg?style=flat) [![CocoaPods compatible](https://img.shields.io/badge/CocoaPods-compatible-green.svg?style=flat)](https://cocoapods.org)\nAn Enterprise app update framework for iOS written in Swift\n\n\u003cimg src=\"example.png\" width=\"33%\"\u003e \u003cimg src=\"required.png\" width=\"33%\"\u003e \u003cimg src=\"nonotes.png\" width=\"33%\"\u003e\n\n## Features\n\n* Similar to the well-known [Sparkle framework](https://github.com/sparkle-project/Sparkle) for macOS in design and behavior.\n* Easy to use. Setup with only a couple lines of code, and only needs a few static files hosted on a web server to operate.\n* Uses RSS-based appcasts for release information. Appcasts are a de-facto standard supported by 3rd party update-tracking programs and websites.\n* Stays hidden until second launch for better first impressions.\n* Allows certain versions to be marked as a forced update for critical fixes and changes.\n* Allows configuration of deployment targets for app versions so the user won't be bothered about an app update they can't use.\n* Works with (but doesn't require) new Enterprise deployment features like app thinning to keep downloads small.\n\n## Requirements\n\n* Runtime: iOS 10 or greater\n* Build: Xcode 9.2+ \u0026 Swift 5+\n* HTTPS server for serving updates to comply with App Transport Security and Enterprise Deployment requirements\n\n## Installation\n\n### CocoaPods\n\n[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C and Swift, which automates and simplifies the process of using 3rd-party libraries in your projects. First, add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html):\n\n```ruby\npod 'ShineUpdater', '~\u003e 1.3'\n```\n\nSecond, install Shine into your project:\n\n```ruby\npod install\n```\n\n### Manual\n\n* Drag the `Shine.swift` file into your project.\n* Install the `SWXMLHash` dependency.\n\n### Dependencies\n\nWe use the following libraries as dependencies:\n\n* [SWXMLHash](https://github.com/drmohundro/SWXMLHash), to parse RSS appcast files.\n\n## Usage\n\n### Initialize in App Delegate\n\n```swift\nShine.shared.setup { config in\n  config.feedURL = URL(string: \"https://www.supergoodapp.com/app/appcast.xml\")!\n}\n```\n\nThis is the only code-level requirement to use Shine. Update checks will happen automatically when the app launches, and the update dialog will be shown and managed as necessary.\n\n### Manually checking for updates\n\n```swift\nShine.shared.checkForUpdates(forceNotify: true)\n```\n\nThis is useful if you have a _Check for Updates..._ UI control in the app somewhere. This method will perform a check and will show a dialog telling the user whether or not there is an update available.\n\n## Customization\n\nThe behavior of the checking mechanism can be customized using the following code in the config closure:\n\n```swift\nShine.shared.setup { config in\n  config.feedURL = URL(string: \"...\")!\n  config.updateCheckInterval = 300                // Default: 3600 (1 hour)\n  config.remindLaterInterval = 3600               // Default: 86400 (1 day)\n  config.automaticallyChecksForUpdates = false    // Default: true\n  config.showReleaseNotes = false                 // Default: true\n  config.updateDialogDelay = 3.0                  // Default: 0 (no delay)\n  config.customDisplayName = \"My Great App\"       // Default: nil (use Bundle Display Name)\n}\n```\n\n`updateCheckInterval`: Number of seconds between automatically checking for updates on launch.\n\n`remindLaterInterval`: Number of seconds to suppress update dialogs for when the user selects \"Remind me Later\".\n\n`automaticallyChecksForUpdates`: Whether or not the app automatically checks for updates on launch. If this is changed to `false`, the app will only check for updates and notify when the `checkForUpdates()` func is called.\n\n`showReleaseNotes`: Whether or not to show release notes from the App Cast in the update dialog.\n\n`updateDialogDelay`: Adds a delay to the presentation of the update dialog on launch. Useful if the app UI takes a moment to load or if there is a splash screen to avoid.\n\n`customDisplayName`: Customize the app title used in the update dialog. This dialog uses the `CFBundleDisplayName` by default, but can be overridden if a shortened name is used for the Springboard.\n\n## Version Numbers\n\niOS apps have two version numbers set in the `Info.plist` file: `CFBundleVersion` and `CFBundleShortVersionString`.\n\nShine __only__ compares the `CFBundleVersion` values to decide if a new version is available, but if a `CFBundleShortVersionString` is listed it will show that to the user. If these versions are the same, you do not need to add short version strings to your Appcast file.\n\n## Server Setup\n\n### Appcast Sample\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003crss version=\"2.0\" xmlns:sparkle=\"http://www.andymatuschak.org/xml-namespaces/sparkle\" xmlns:shine=\"http://www.eightythreecreative.com/shinens\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\u003e\n    \u003cchannel\u003e\n        \u003ctitle\u003eInitial Release\u003c/title\u003e\n        \u003cdescription\u003eMost recent changes with links to updates.\u003c/description\u003e\n        \u003clanguage\u003een\u003c/language\u003e\n        \u003citem\u003e\n            \u003ctitle\u003eVersion 1.0\u003c/title\u003e\n            \u003cdescription\u003e\u003c![CDATA[• Initial release]]\u003e\u003c/description\u003e\n            \u003cpubDate\u003eTue, 10 April 2018 10:01:11 -0600\u003c/pubDate\u003e\n            \u003cenclosure url=\"https://www.supergoodapp.com/app/1.0/manifest.plist\"\n                       sparkle:version=\"25\"\n                       sparkle:shortVersionString=\"1.0\" /\u003e\n            \u003csparkle:minimumSystemVersion\u003e10.3\u003c/sparkle:minimumSystemVersion\u003e\n        \u003c/item\u003e\n        \u003citem\u003e\n            \u003ctitle\u003eVersion 2.0\u003c/title\u003e\n            \u003cdescription\u003e\u003c![CDATA[• Some great new feature\n• Another feature\n• A third awesome feature]]\u003e\u003c/description\u003e\n            \u003cpubDate\u003eTue, 11 April 2018 10:01:11 -0600\u003c/pubDate\u003e\n            \u003cenclosure url=\"https://www.supergoodapp.com/app/2.0/manifest.plist\"\n                       sparkle:version=\"40\"\n                       sparkle:shortVersionString=\"2.0\" /\u003e\n            \u003csparkle:minimumSystemVersion\u003e10.3\u003c/sparkle:minimumSystemVersion\u003e\n            \u003cshine:forcedUpdate /\u003e\n        \u003c/item\u003e\n    \u003c/channel\u003e\n\u003c/rss\u003e\n```\n\n#### Appcast caveats and requirements\n\nNot all features of the Appcast spec are supported by Shine. Release notes provided by the `description` tag must be plain text. Any formatting in the description like line breaks will appear in the dialog, so be mindful of this content. If a version does not have any release notes associated with it, the tag can be omited and the release notes will not show in the dialog.\n\nThe only two required tags for each item are the `pubDate` and an `enclosure` that includes attributes for `url` and `sparkle:version`.\n\n### File Layout on Server\n\nThe specific layout of files on an update server is up to you, and is mostly configured by the `manifest.plist` file for that version. Regardless, a suggested directory structure with sample files is provided in the [ServerExample](https://github.com/EightyThreeCreative/ShineUpdater/tree/master/ServerExample) on this repo.\n\nThe `appcast.xml` file is at the root of the structure, and contains entries for version 1.0 and 2.0 of the app. App icons, as requested by Xcode for the `manifest.plist` file, are also here. Each new version gets its own directory, which is useful in case you need to download an old version, or if some users on older devices can't update to the latest version because of a deployment target mismatch, they can still update to the latest version available for their system.\n\nThinned files go in the `bin` directory for each version, and the `manifest.plist` file generated by Xcode is placed in the version's directory. Ensure all the URLs in the `manifest.plist` file are accurate and point to the correct version.\n\nFinally, when releasing a new version, add the new version's info to the `appcast.xml` file, copy the files to the new version directory, and then copy the latest version's completed `manifest.plist` file from the version directory to the root directory, changing the name to `manifest-latest.plist` and overwrite the old file. This way, your website and other materials can always point to the latest version by using the link:\n\n`itms-services://?action=download-manifest\u0026url=https://www.supergoodapp.com/app/manifest-latest.plist`\n\nOf course, your website can also link to specific older/newer versions in their own folders if necessary.\n\n## Contributing to this project\n\nIf you have feature requests or bug reports, feel free to help out by sending pull requests or by [creating new issues](https://github.com/EightyThreeCreative/ShineUpdater/issues/new).\n\n## License\n\nShine is distributed under the terms and conditions of the [MIT license](https://github.com/EightyThreeCreative/ShineUpdater/blob/master/LICENSE).\n\n## Credits\n\nShine is brought to you by the creative minds at [Eighty Three Creative, Inc.](http://www.eightythreecreative.com) and [contributors to the project](https://github.com/EightyThreeCreative/ShineUpdater/contributors). If you're using Shine in your project, attribution would be appreciated though not required.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEightyThreeCreative%2FShineUpdater","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FEightyThreeCreative%2FShineUpdater","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEightyThreeCreative%2FShineUpdater/lists"}