Code Quality Rank: L5
Programming language: Swift
License: MIT License
Tags: Tools    
Latest version: v3.0.0

Ecno alternatives and similar libraries

Based on the "Tools" category.
Alternatively, view Ecno alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of Ecno or a related project?

Add another 'Tools' Library


By Xmartlabs SRL.


Ecno was inspired by Once Android library. It's a task state manager built on top of UserDefaults in pure Swift 4. This abstraction allows you to mark 'tasks' as done, 'to-do' and check for those states.

Ecno is ideal for:

  • Show tutorials once within the application.
  • Perform certain task periodically.
  • Trigger a task based on a user action.


First you need to initialize it:


Note: you should initialize it when your app gets launched.

Then, you can check whether a task was done by:

if !Ecno.beenDone("task") {

Also, you can check for specific requirements about a certain task:

if Ecno.beenDone("task", scope: .appSession, numberOfTimes: .moreThan(3)) {
  // do stuff


if Ecno.beenDone("task", scope: .since(20.minutes), numberOfTimes: .lessThan(3)) {
  // do stuff

Additionally, you can program a 'to do' task by:

Ecno.toDo("show banner", scope: .until(3.hours), info: ["name": "bannerName"])

and then query if you need to do that task:

if Ecno.needToDo("show banner") {
  let info = Ecno.infoForToDo("show banner") // ["name": "bannerName"]
  // ...


Any type conforming to the Task protocol. Since it would be the most common case, the String type already conforms to Task.

public protocol Task {

    var tag: String { get }



Scopes represents periods of time within the application.

  • .appInstall
    This period represents all times for the application.
  • .appVersion
    Period starting when the current version of the app was installed.
  • .appSession
    Period starting when the application was launched.
  • .since(TimeInterval)
    Period starting since TimeInterval time ago from now. For instance, .since(2.days)
  • .until(TimeInterval)
    Period valid until TimeInterval from now. For instance, .until(3.hours). This should be useful to set a 'to do' task that expires.


  • func toDo(_ task: Task, scope: Scope? = nil, info: [AnyHashable: Any]? = nil)
    Marks a task as 'to do' within a given scope, if it has already been marked as to do or been done within that scope then it will not be marked. If the scope is nil, then it will be marked as to do anyways.
  • func needToDo(_ task: Task) -> Bool
    Checks if a task is currently marked as 'to do'.
  • func infoForToDo(_ task: Task) -> [AnyHashable: Any]?
    Gets the info associated with a 'to do' task. (only if you provided it in the toDo(...) function)
  • func lastDone(_ task: Task) -> Date?
    Last done timestamp for a given task.
  • func beenDone(_ task: Task, scope: Scope = .appInstall, numberOfTimes: CountChecker = .moreThan(0)) -> Bool
    Checks if a task has been done with the given requirements.
  • func markDone(_ task: Task)
    Marks a task as done.


  • iOS 8.0+
  • Swift 4.0+
  • Xcode 9.0+

Getting involved

  • If you want to contribute please feel free to submit pull requests.
  • If you have a feature request please open an issue.
  • If you found a bug or need help please check older issues

Before contribute check the CONTRIBUTING file for more info.

If you use Ecno in your app We would love to hear about it! Drop us a line on twitter.


Follow these 3 steps to run Example project:

  • Clone Ecno repository
  • Open Ecno workspace and run the Example project.



CocoaPods is a dependency manager for Cocoa projects.

To install Ecno, simply add the following line to your Podfile:

pod 'Ecno', '~> 3.0'


Carthage is a simple, decentralized dependency manager for Cocoa.

To install Ecno, simply add the following line to your Cartfile:

github "xmartlabs/Ecno" ~> 3.0


Change Log

This can be found in the [CHANGELOG.md](CHANGELOG.md) file.

*Note that all licence references and agreements mentioned in the Ecno README section above are relevant to that project's source code only.