Siren - Notify users when a new version of your app is available and prompt them to upgrade.

Overview

Siren 🚨

Notify users when a new version of your app is available and prompt them to upgrade.

Travis CI Status Swift Support CocoaPods SwiftPM Compatible Accio supported


Table of Contents


Meta

About

Siren checks a user's currently installed version of your iOS app against the version that is currently available in the App Store.

If a new version is available, a language localized alert can be presented to the user informing them of the newer version, and giving them the option to update the application. Alternatively, Siren can notify your app through alternative means, such as a custom user interface.

Siren is built to work with the Semantic Versioning system.

  • Canonical Semantic Versioning uses a three number versioning system (e.g., 1.0.0)
  • Siren also supports two-number versioning (e.g., 1.0) and four-number versioning (e.g., 1.0.0.0)

Features

Current Features


Screenshots

  • The left picture forces the user to update the app.
  • The center picture gives the user the option to update the app.
  • The right picture gives the user the option to skip the current update.
  • These options are controlled by the Rules.AlertType enum.

Ports

  • Objective-C (iOS)
    • Harpy
    • Siren was ported from Harpy, as Siren and Harpy are maintained by the same developer.
    • As of December 2018, Harpy has been deprecated in favor of Siren.
  • Java (Android)
  • React Native (iOS)

Installation and Integration

Installation Instructions

Swift Version Branch Name Will Continue to Receive Updates?
5.5+ master Yes
5.1-5.4 swift5.4 No
5.0 swift5.0 No
4.2 swift4.2 No
4.1 swift4.1 No
3.2 swift3.2 No
3.1 swift3.1 No
2.3 swift2.3 No

CocoaPods

pod 'Siren' # Swift 5.5+
pod 'Siren', :git => 'https://github.com/ArtSabintsev/Siren.git', :branch => 'swift5.4' # Swift 5.1-5.4
pod 'Siren', :git => 'https://github.com/ArtSabintsev/Siren.git', :branch => 'swift5.0' # Swift 5.0
pod 'Siren', :git => 'https://github.com/ArtSabintsev/Siren.git', :branch => 'swift4.2' # Swift 4.2
pod 'Siren', :git => 'https://github.com/ArtSabintsev/Siren.git', :branch => 'swift4.1' # Swift 4.1
pod 'Siren', :git => 'https://github.com/ArtSabintsev/Siren.git', :branch => 'swift3.2' # Swift 3.2
pod 'Siren', :git => 'https://github.com/ArtSabintsev/Siren.git', :branch => 'swift3.1' # Swift 3.1
pod 'Siren', :git => 'https://github.com/ArtSabintsev/Siren.git', :branch => 'swift2.3' # Swift 2.3

Swift Package Manager

.Package(url: "https://github.com/ArtSabintsev/Siren.git", majorVersion: 5)

Implementation Examples

Implementing Siren is as easy as adding two lines of code to your app in either AppDelegate.swift or SceneDelegate.swift:

AppDelegate.swift Example

import Siren // Line 1
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        window?.makeKeyAndVisible()

	Siren.shared.wail() // Line 2

        return true
    }
}

SceneDelegate.swift Example

import Siren // Line 1
import UIKit

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        window?.makeKeyAndVisible()

	Siren.shared.wail() // Line 2

        return true
    }
}

Siren also has plenty of customization options. All examples can be found in the Example Project's AppDelegate file. Uncomment the example you'd like to test.


Device-Specific Checks

Localization

Siren is localized for the following languages:

Arabic, Armenian, Basque, Chinese (Simplified and Traditional), Croatian, Czech, Danish, Dutch, English, Estonian, Finnish, French, German, Greek, Hebrew, Hungarian, Indonesian, Italian, Japanese, Korean, Latvian, Lithuanian, Malay, Norwegian (Bokmål), Persian (Afghanistan, Iran, Persian), Polish, Portuguese (Brazil and Portugal), Romanian, Russian, Serbian (Cyrillic and Latin), Slovenian, Spanish, Swedish, Thai, Turkish, Ukrainian, Urdu, Vietnamese

If your user's device is set to one of the supported locales, an update message will appear in that language. If a locale is not supported, than the message will appear in English.

You may want the update dialog to always appear in a certain language, ignoring the user's device-specific setting. You can enable it like so:

// In this example, we force the `Russian` language.
Siren.shared.presentationManager = PresentationManager(forceLanguageLocalization: .russian)

Device Compatibility

If an app update is available, Siren checks to make sure that the version of iOS on the user's device is compatible with the one that is required by the app update. For example, if a user has iOS 11 installed on their device, but the app update requires iOS 12, an alert will not be shown. This takes care of the false positive case regarding app updating.


Testing

Testing Siren Locally

Temporarily change the version string in Xcode (within the .xcodeproj file) to an older version than the one that's currently available in the App Store. Afterwards, build and run your app, and you should see the alert.

If you currently don't have an app in the store, change your bundleID to one that is already in the store. In the sample app packaged with this library, we use Facebook's Bundle ID: com.facebook.Facebook.

Words of Caution

Occasionally, the iTunes JSON will update faster than the App Store CDN, meaning the JSON may state that the new version of the app has been released, while no new binary is made available for download via the App Store. It is for this reason that Siren will, by default, wait 1 day (24 hours) after the JSON has been updated to prompt the user to update. To change the default setting, please modify the value of showAlertAfterCurrentVersionHasBeenReleasedForDays.


App Submission

App Store Review

The App Store reviewer will not see the alert. The version in the App Store will always be older than the version being reviewed.

Phased Releases

In 2017, Apple announced the ability to rollout app updates gradually (a.k.a. Phased Releases). Siren will continue to work as it has in the past, presenting an update modal to all users. If you opt-in to a phased rollout for a specific version, you have a few choices:

  • You can leave Siren configured as normal. Phased rollout will continue to auto-update apps. Since all users can still manually update your app directly from the App Store, Siren will ignore the phased rollout and will prompt users to update.
  • You can set showAlertAfterCurrentVersionHasBeenReleasedForDays to 7, and Siren will not prompt any users until the latest version is 7 days old, after the phased rollout is complete.
  • You can remotely disable Siren until the rollout is done using your own API / backend logic.

Attribution

Special Thanks

A massive shout-out and thank you goes to the following folks:

  • Aaron Brager for motivating me and assisting me in building the initial proof-of-concept of Siren (based on Harpy) back in 2015. Without him, Siren may never have been built.
  • All of Harpy's Contributors for helping building the feature set from 2012-2015 that was used as the basis for the first version of Siren.
  • All of Siren's Contributors for helping make Siren as powerful and bug-free as it currently is today.

Creator

Arthur Ariel Sabintsev

Comments
  • sample code does not work (at least with a pod)

    sample code does not work (at least with a pod)

    let siren = Siren.sharedInstance
    
    siren.appID = 12345
    

    The latter does not work as the compiler cannot find appID:

    AppDelegate.swift:32:9: 'Siren' does not have a member named 'appID'
    
    opened by skandragon 46
  • Siren 4.0.0

    Siren 4.0.0

    This PR will usher in a head-to-tail rewrite of Siren. Specifically, the following will occur:

    • [x] Interface rewrite
    • [x] Move core logic from Siren.swift to configurable managers
    • [x] Scope more data structures under Siren.
    • [x] Implement #237 and #190
    • [x] Add Documentation
    • [x] Update README

    This PR is a WIP.

    Enhancement 
    opened by ArtSabintsev 23
  • Localizations not working, even with forceLanguageLocalization

    Localizations not working, even with forceLanguageLocalization

    If you're experiencing a problem integrating Siren into your app, please provide the following information when posting a new issue:

    • Are you using the latest version of Siren?: Yes (5.4.0 as of now)
    • What is your app's Bundle ID?: n/a
    • When was the latest version of your app published to the App Store?: Not published yet
    • Is your app published in the US App Store? If not, what App Store is it published in?: n/a
    • Does Siren work if you plugin your app's BundleID (and countryCode, if necessary) into the Example app?: Yes and no, see below

    Related issue

    Potentially related issue: https://github.com/ArtSabintsev/Siren/issues/67 but it provided no clue.

    Issue description

    When running an app with Siren on a phone set to Japanese, the update alert showed up in English. Trying to set forceLanguageLocalization to .japanese (or other localizations) did not work either, the alert was still in English.

    We ended up specifying strings manually, but this is not ideal: it does not extrapolate the app name and version number in the alertMessage.

    Example app

    With the example app:

    • The hyperCriticalRulesExample alert shows up in English by default, even though the device is set to Japanese.
    • but forceLanguageLocalization does work and shows the alert in Japanese.

    Our code:

    import Siren
    
    struct UpdatesMonitor {
      static func configure() {
        let siren = Siren.shared
        // siren.presentationManager = PresentationManager(
        //   forceLanguageLocalization: .japanese
        // )
        // Unfortunately, the forceLanguageLocalization above had no effect, so:
        siren.presentationManager = PresentationManager(
          alertTitle: "アップデートのお知らせ",
          alertMessage: "新規バージョンがご利用になれます。\n今すぐアップデートしてください。",
          updateButtonTitle: "アップデート"
        )
        siren.rulesManager = RulesManager(
          globalRules: .critical,
          showAlertAfterCurrentVersionHasBeenReleasedForDays: 0
        )
        siren.wail()
      }
    }
    

    And we do UpdatesMonitor.configure() after window?.makeKeyAndVisible().

    Potential Bug 
    opened by yemartin 21
  • Error when trying to retrieve App Store data

    Error when trying to retrieve App Store data

    I'm getting this error when I run the app. [Siren] JSON results: ["resultCount": 0, "results": <__NSArray0 0x15de15b60>()] [Siren] Error retrieving App Store data as an error was returned.

    I don't know where to specify my App Id now when that property is private. My app is active on the app store so this don't happen because of it doesn't exist there.

    What am I missing?

    opened by troligtvis 19
  • Not updating app from app store

    Not updating app from app store

    I have implemented Siren and when updates is available it is showing popUp and onClick update it is going to app store but there is no option for update. its showing only open button. my previous version is 1.0.2 and new version is 1.0.3

    opened by pradeep-chauhan 17
  • Version check comparison error.

    Version check comparison error.

    This issue simply shouldn't be happening.

    There needs to be another way to compare version numbers, 16.0 is certainly the same as 16 and shouldn't be treated as requiring a new version! :O I was shocked when I saw this.. Did some debugging and found the problem area... Today our app was accepted only for siren to cause our users to go into a never ending loop of installs..

    screen shot 2016-06-16 at 02 50 53

    opened by pavankataria 17
  • Error parsing App Store JSON data. No value associated with key CodingKeys(stringValue:

    Error parsing App Store JSON data. No value associated with key CodingKeys(stringValue: "results", intValue: nil) ("results").

    • Are you using the latest version of Siren?: Yes.
    • What is your app's Bundle ID?: Com.Greyscale.School-App
    • When was the latest version of your app published to the App Store?: 24 june 2020.
    • Is your app published in the US App Store? If not, what App Store is it published in?: published in App Store globally.
    • Does Siren work if you plugin your app's BundleID (and countryCode, if necessary) into the Example app?: Can't test this. Couldn't find where to add these.

    Applying this code in my App delegate in didFinishLaunchingWithOptions function

    func initForceUpdate() {
                let siren = Siren.shared
                siren.apiManager = APIManager(countryCode: "\(Locale.current.languageCode ?? "")") // that is "en"
    
                 siren.presentationManager = PresentationManager(alertTitle: "UPDATE",
                                                            nextTimeButtonTitle: "NEXT_TIME")
                    let rules = Rules(promptFrequency: .immediately, forAlertType: .force)
                   siren.rulesManager = RulesManager(globalRules: rules, showAlertAfterCurrentVersionHasBeenReleasedForDays: 1)
                    siren.rulesManager = RulesManager(globalRules: .critical)
            siren.wail { results in
                switch results {
                case .success(let updateResults):
                    print("AlertAction ", updateResults.alertAction)
                    print("Localization ", updateResults.localization)
                    print("Model ", updateResults.model)
                    print("UpdateType ", updateResults.updateType)
                case .failure(let error):
                    print(error.localizedDescription)
                }
            }
        }
    

    And getting this error

    [Siren Error] Error parsing App Store JSON data. Also, the following system level error was returned: keyNotFound(CodingKeys(stringValue: "results", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: "results", intValue: nil) ("results").", underlyingError: nil))

    what I am doing wrong. Any help would be appreciated. Thanks

    Question 
    opened by asn111 16
  • Alert not displaying

    Alert not displaying

    I have just installed Siren version 5.4.0 using pod 'Siren' in my pod file.

    I have an app version 1.5 which was last published in the appStore approx 2 months ago.

    The version details in my xcode project file are:

    Version: 0.0.5 Build: 1

    (AppStore published version: 1.5)

    When testing I change to Version 0.0.1 then build/run the app and no alert pops up.

    I am testing using the provided sample in my AppDelegate.swift file

    import Siren

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    
    window?.makeKeyAndVisible()
    defaultExampleUsingCompletionHandler()
    
    //...other code eg; Firebase, Facebook initialisation code, present login VC if currentUser == nil
    
    }
    
    private extension AppDelegate {
    
        // The simplest implementation of Siren.
        // All default rules are implemented and the
        // results of the completion handler are ignored.
        func defaultExample() {
            Siren.shared.wail()
        }
    
        // The simplest implementation of Siren.
        // All default rules are implemented and the
        // results of the completion handler are returned or an error is returned.
        func defaultExampleUsingCompletionHandler() {
            
            print("defaultExampleUsingCompletionHandler")
            
            Siren.shared.wail { results in
                switch results {
                case .success(let updateResults):
                    print("AlertAction ", updateResults.alertAction)
                    print("Localization ", updateResults.localization)
                    print("Model ", updateResults.model)
                    print("UpdateType ", updateResults.updateType)
                case .failure(let error):
                    print(error.localizedDescription)
                }
            }
        }
        
    }//end extension
    
    
    Question 
    opened by rigaldamez 16
  • Blocking UI when the alert is dismissed

    Blocking UI when the alert is dismissed

    I removed the predefined text because this behaviour can be seen in the Example app too.

    Steps to reproduce:

    1. Click on the Example project in the Project Navigator. In the Targets select Example if it is not selected.
    2. Under General tab, under Deployment Info change the Main interface option to Main.storyboard .
    3. Open the Main.storyboard in the Supporting Files group/folder.
    4. Put UISwitch in the scene and add constraints to it.
    5. Run the application in simulator. After the popup for update appears and the user taps on something, the user can't flip the switch. If you comment the line annoyingRuleExample() in the application(_:didFinishLaunchingWithOptions:), and run the app again the user can flip the switch.

    I tested it with the newest version (5.2.2) and this behaviour is happening to me in the simulator and on real device too. I don't know if it has something to do with the UIWindow the alert creates because after dismissal the window for the alert is still there in the view hierarchy.

    Potential Bug 
    opened by ibeleliev 16
  • Ability to control alert display timing?

    Ability to control alert display timing?

    I am glad to see new version 4 coming up. The simple method of Siren.wail is fine. Siren add observer to wait didBecomeActive. However, I'd like to trigger version check on my own, for example, after editing photos, user may see update alert. How about make Siren.performVersionCheck method to public?

    Request Question 
    opened by erichsu 16
  • Siren is getting an old version number

    Siren is getting an old version number

    Hi I am seeing a weird bug.

    https://itunes.apple.com/lookup?bundleId=com.xxx.xxxx

    If I visit this directly, it gives me version 2.0.

    But when running Siren in the app, somehow it keeps on returning 1.3 (the previous version). I tried to debug the Siren code and the url looks correct, not sure where this is cached. This behavior is causing the update message to not show up for Apps with v1.3 installed. The region is US.

    I don't think theres a delay in appstore because the url is already showing 2.0. Is this a bug, and will v1.3 users ever get the update message?

    Thanks! Jason

    opened by wy1024 16
Releases(6.1.0)
  • 6.1.0(Sep 21, 2022)

    • #404: Custom Bundle Identifiers can now be passed into the wail() method (thanks @developforapple)
    • #405: Fixes a very old bug respecting the skipped version flag even if the app was remotely triggered to change the siren setting to be a .force update (via some config file). (thanks @aburgel)
    Source code(tar.gz)
    Source code(zip)
  • 6.0.3(Jun 2, 2022)

    • #397 & #396: Fixes a very specific edge case scenario around having the update dialog not appear if the user is launching the app via a notification center. If in this scenario the update modal is scheduled to appear, it wouldn't appear in the past. With this fix, it now appears. Thanks to @keyboardseokmin for discovering this issue and submitting the fix.
    Source code(tar.gz)
    Source code(zip)
  • 6.0.2(May 20, 2022)

  • 6.0.1(Mar 24, 2022)

    • #391: You can set the language locale when initializing the APIManager enabling it return a localized verison of the patch notes. It defaults to nil which is the same as passing in en_us. More information can be found here: https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/Searching.html#//apple_ref/doc/uid/TP40017632-CH5-SW1

    Thanks to @kientux for this change.

    Source code(tar.gz)
    Source code(zip)
  • 6.0.0(Sep 17, 2021)

    #375

    • Changes min deployment version to iOS 15
    • Changes networking call to use async/await
      • This is the only technical change and it requires a minimum iOS version bump.

    If you are supporting older versions of iOS, please use Siren version 5.8.1 (also found on branch swift5.4), which targets

    • Swift 5.4
    • iOS 13+.
    Source code(tar.gz)
    Source code(zip)
  • 5.8.1(Jan 19, 2021)

  • 5.8.0(Jan 17, 2021)

    • Bumped minimum version of iOS to 13.0 since < 2% are below that version.
    • Merged in #360 which adds support for pinging the App Store on tvOS apps running at least tvOS 13 (thanks to @frydiggity)
    Source code(tar.gz)
    Source code(zip)
  • 5.7.1(Dec 21, 2020)

  • 5.7.0(Dec 21, 2020)

  • 5.6.2(Nov 23, 2020)

    #355: Thanks to @hkellaway for adding a couple more countries that were missing from his #352 PR which added support for type safe App Store declarations. Specifically, Korea and The Maldives were added.

    Source code(tar.gz)
    Source code(zip)
  • 5.6.1(Nov 22, 2020)

    This is a version bump that only affects folks using SPM. This change results in less metadata files being brought into an installation now that the architecture of this repo has changed.

    Source code(tar.gz)
    Source code(zip)
  • 5.6.0(Nov 22, 2020)

    I took the time to cleanup the repository a bit prior to this release.

    Notable changes (not related to the repo cleanup):

    • #352: Thanks to @hkellaway's work, these is now explicit, type-safe support for every country that Apple has an App Store in. Checkout AppStoreCountry.swift
    • Updated the minimum version to iOS 11
    • Removed support for Carthage
    Source code(tar.gz)
    Source code(zip)
  • 5.5.1(Oct 31, 2020)

    • #351: Removed old UI code that may not have been working properly (thanks to @giofid for bringing this to my attention)
    • Updated base support from 9.0 to 10.0
    Source code(tar.gz)
    Source code(zip)
  • 5.5.0(Oct 31, 2020)

  • 5.4.5(Jul 21, 2020)

    Thanks to @iKefir for his solution in #342 that fixes an issue with the after-effects of the Siren AlertController interfering with system AlertControllers.

    Addresses: #335, #338, #341, #342.

    Source code(tar.gz)
    Source code(zip)
  • 5.4.4(Jun 13, 2020)

  • 5.4.3(Jun 12, 2020)

  • 5.4.2(Jun 12, 2020)

  • 5.4.1(Jun 12, 2020)

  • 5.4.0(Feb 20, 2020)

  • 5.3.0(Feb 11, 2020)

  • 5.2.3(Oct 12, 2019)

    This release should finally fix the iOS 13 issue around layered AlertViews.

    Note, that I have not been able to faithfully reproduce this issue, but a couple others have reported that the problem seems to be solved.

    This should address: #314, #313, #312, #310, #309, #308

    Source code(tar.gz)
    Source code(zip)
  • 5.2.2(Oct 7, 2019)

    This release attempts to fix the iOS 13 issue around layered AlertViews. I've changed the ordering of the calls for all UIAlertAction, pushing UIWindow cleanup to happen earlier in the sequence.

    Note, that I have not been able to faithfully reproduce this issue, so this is a shot in the dark that it will solve this issue.

    Closes #312 Closes #310 Closes #309 Closes #308

    Source code(tar.gz)
    Source code(zip)
  • 5.2.1(Sep 15, 2019)

    In the conversion to Swift 5.1, I accidentally committed a generic-ized version of this method. The change has been reverted to its previous state.

    Source code(tar.gz)
    Source code(zip)
  • 5.2.0(Sep 15, 2019)

  • 5.1.2(Sep 3, 2019)

  • 5.1.1(Aug 8, 2019)

    I fixed the Package.swift so that it is now compatible with Xcode 11 and the latest Swift Package Manifest file (// swift-tools-version:4.0).

    Source code(tar.gz)
    Source code(zip)
  • 5.1.0(May 15, 2019)

    • #288: It was discovered that Siren would prompt the user with an update if the same version of the app was installed that also happened to be the latest version of the app. This was due to an improper handling of that specific case. This is now fixed in #289. Thanks to @ergunkocak for pointing out this bug!
    Source code(tar.gz)
    Source code(zip)
  • 5.0.1(Apr 17, 2019)

  • 5.0.0(Mar 28, 2019)

    • Adds Swift 5 Support (#277)
    • Implements Swift 5's Result type in Siren.swift and APIManager.swift
    • Renames LookupModel.swift to APIModel.swift
    • Exposes all values in APIModel.swift in a nice public API on a new struct, Model.swift. (#276)
    • Siren's public completion handler now uses the Result type and returns Model.swift instead of APIModel.swift
    • Fixes the placement of the Update button on .optional alerts (#278)

    If you still need access to the Swift 4.2 version of Siren, please use the swift4.2 branch which is equivalent to Siren v4.2.2.

    Source code(tar.gz)
    Source code(zip)
Owner
Arthur Ariel Sabintsev
Senior Engineering Manager
Arthur Ariel Sabintsev
AppVersion - Keep users on the up-to date version of your App.

?? App Version Don't let you users to get stuck on outdated version of your app. Automatic update tracking using Semantic Versioning Buil-in UI alerts

Ameba Labs 31 Sep 30, 2022
Appirater - A utility that reminds your iPhone app's users to review the app.

Introduction Appirater is a class that you can drop into any iPhone app (iOS 4.0 or later) that will help remind your users to review your app on the

Arash Payan 4.7k Jan 7, 2023
Apphud SDK is a lightweight open-source Swift library to manage auto-renewable subscriptions and other in-app purchases in your iOS app.

Apphud SDK Apphud SDK is a lightweight open-source Swift library to manage auto-renewable subscriptions and other in-app purchases in your iOS app. No

Apphud 143 Dec 16, 2022
An easy way to access reviews for your app instead of writing repetitive and redundant codes for every app.

AppStoreReviewManager An easy way to access reviews for your app instead of writing repetitive and redundant codes for every app. Requirements iOS 9.0

Jinya 4 Dec 23, 2022
🍎 An App to check whether a non-App Store app is in App Store.

AppStorify ?? An App to check whether a non-App Store app is in App Store. Benfits Use App Store's upgrade mechanism instead of app's. App Store apps

seedgou 58 Dec 7, 2022
Appstore-Review-Guidelines - A curated list of guideline which has to be taken care before submitting your application to Appstore.

Appstore Review Guidelines The App Review Guidelines provide rules and examples across a range of topics, including user interface design, functionali

Aashish Tamsya 14 Dec 16, 2022
Apple's Framework to support in-app purchases and interaction with the App Store

Apple's Framework to support in-app purchases and interaction with the App Store.

paigeshin 0 Dec 5, 2021
InAppPurchase - A Simple and Lightweight framework for In App Purchase

InAppPurchase A Simple, Lightweight and Safe framework for In App Purchase Feature Simple and Light ?? Support Promoting In-App Purchases ?? No need t

Jin Sasaki 269 Dec 15, 2022
SwiftyStoreKit is a lightweight In App Purchases framework for iOS, tvOS, watchOS, macOS, and Mac Catalyst ⛺

SwiftyStoreKit is a lightweight In App Purchases framework for iOS, tvOS, watchOS, macOS, and Mac Catalyst. Features Super easy-to-use block-based API

Andrea Bizzotto 6.1k Jan 7, 2023
Mercato is a lightweight In-App Purchases (StoreKit 2) library for iOS, tvOS, watchOS, macOS, and Mac Catalyst.

Mercato Mercato is a lightweight In-App Purchases (StoreKit 2) library for iOS, tvOS, watchOS, macOS, and Mac Catalyst. Installation Swift Package Man

Pavel T 49 Jan 4, 2023
An App where you can find product and see its detail.

MeliProductos Project ???? > An App where you can find product and see its detail. ???? > Una App donde puedes encontrar tus productos y ver su detall

Joaquin Segovia 3 May 6, 2022
MerchantKit - A modern In-App Purchases management framework for iOS developers

MerchantKit dramatically simplifies the work indie developers have to do in order to add premium monetizable components to their applications. Track purchased products, offer auto-renewing subscriptions, restore transactions, and much more.

Benjamin Mayo 1.1k Dec 17, 2022
Notify users when a new version of your app is available and prompt them to upgrade.

Siren ?? Notify users when a new version of your app is available and prompt them to upgrade. Table of Contents Meta About Features Screenshots Ports

Arthur Ariel Sabintsev 4.1k Dec 27, 2022
Harpy - Notify users when a new version of your app is available and prompt them to upgrade.

After 6 years of Harpy and 4 years of Siren, I have decided to deprecate Harpy in favor of Siren. Why? Siren is written in Swift and has a feature set

Arthur Ariel Sabintsev 2.6k Dec 29, 2022
Alert popup to notify your users if they use an unsupported iOS version

UnsupportedOSVersionAlert This source code alerts your users if they use your app with an unsupported version of iOS (e.g. iOS 10.0 beta). The alert l

Josef Moser 8 Mar 11, 2019
A framework to provide logic designed to prompt users at the ideal moment for a review of your app/software

ReviewKit ReviewKit is a Swift package/framework that provides logic designed to prompt users at the ideal moment for a review of your app. At a basic

Simon Mitchell 25 Jun 7, 2022
Silent Rock app: to notify users when approaching silent rock

silent-rock Silent Rock app - to notify users when approaching silent rock. Capstone Concept - Michelle Bodart Team members none Problem Statement #1

null 0 Jan 4, 2022
ReleaseNotesKit - a brand new, elegant, and extremely simple way to present the recent version’s release notes to your users

ReleaseNotesKit This is ReleaseNotesKit, a brand new, elegant, and extremely simple way to present the recent version’s release notes to your users. R

Swapnanil Dhol 22 Jun 30, 2022
A blog project where you can write your articles, upload photos, categorize them, and add them to your favorites

A blog project where you can write your articles, upload photos, categorize them, and add them to your favorites. The aim of the project is to learn the use of Core Data.

Cem 7 Mar 21, 2022