Source for many of The Omni Group's frameworks
Objective-C C HTML Ruby Swift Shell Other
Latest commit 48ae64e Sep 30, 2016 @tjw tjw Updated with changes from OmniGroup svn [r267469:271228]
  - More nullability annotations.
  - Continuing work on encryption support.
  - Fix uses of deprecated API.


  - BuildStringsFromTarget now ignores "empty" output files.
  - Added couple more of our helper scripts, ChangeStringEncoding and
  - rubylib/xcworkspace.rb #add_dir_ref now handles folder references

  - Extend -[NSError(OBExtensions) causedByMissingFile] to also include
    NSOSStatusErrorDomain/fnfErr on the Mac. We see this in practice from some
    OFSFileManager instances.
  - Added `-[OBLogger processLogFilesWithHandler:]`.
  - Wrap `__attribute__((constructor))` function bodies with `@autoreleasepool`.
  - Added an ARM variant for `_OBStopInDebugger`.
  - Added a modulemap for OmniBase on watchOS.

  - Added `+ (id)addObserverForPreference:(nullable OFPreference *)preference
    usingBlock:(void (^)(OFPreference *preference))block`.
  - Updated our +remove:fromReferences: debug assertion to stop giving false
    positives when removing a weak reference during an object's -dealloc method.
  - Added support for comparing two similar weak references with -isEqual:,
    so you can remove a weak reference by creating a new weak reference to
    the same object and using -removeObject:.
  - When creating a temporary OFWeakReference to remove a matching
    weak reference, we now use the API -initWithDeallocatingObject: which
    doesn't try to take out a new weak reference.
  - Added Some NOESCAPE annotations
  - Reworked OFXMLParser so that we can handle unparsed elements without access
    to a contiguous buffer representing the entire docucument.
  - Add -[NSArray(OFExtensions) any:], a sibling to -all:
  - Did a nullification pass in NSFileCoordinator(OFExtensions) to make it
    easier to use in Swift. But Swift doesn't support bridging throwing
    closures, it still isn't great. This probably calls for writing a Swift
    wrapper in OmniFoundation that hides the ugly.

  - Convert NSView-OAExtensions to ARC in order to fix a crashing bug involving
    a zombie.
  - Define OAPlatformColorClass.
  - Added a hook for OAAppearance subclasses to specify a bundle other than
    their own in which to look for their plist.
  - Update NSAttributedString extension method drawInRectangle:alignment:verticallyCentered:
    to draw using API that handles truncation appropriately (since 10.5).
  - Factored out -isLightLuma: instead of repeating it in the iOS and Mac sides
    of this code (and making available for use elsewhere).
  - Give OAWebPageViewer's WebView its own independent .preferenceIdentifier,
    so changing the preference settings for one of them doesn't affect the
    settings for the others.
  - Use dispatch_once() to initialize the combined color table used by
    +colorWithSimilarName: and -similarColorNameFromColorLists in a
    thread-safe way.
  - Updated OALabelField to disallow vibrancy.
  - Copying the "CredentialsPrompt" class from OmniFocus down into OmniAppKit
    (as OAPassphrasePrompt) and generalizing it for use with document encryption.
  - Changed -[NSWindow addConstructionWarning] to always add the bar at the top
    of the list of title view accessor controllers.
  - Moved OASwoopView to the obsolete group.

  - Don’t delay for a double-click except when it’s the selected cell.
    This makes tab-switching faster, because you don’t have that
    double-click delay.
  - Updated to avoid vibrancy in attached inspectors.
  - Deleted -[OITabbedInspector shouldHideTabWithIdentifier:], which is a hook
    for subclasses to hide tabs.
  - Support for the app delegate to decide that certain inspector tabs should
    just not be loaded.
  - Support for inspecting text views in the content area of a document with
    attached inspectors.

  - Updated for the Mac App Store requiring the OSUCheckService XPC service
    having a registered bundle identifier.
  - Copy handler block to avoid a crash.
  - Give each WebView its own independent .preferenceIdentifier.
  - Make sure we're not passing nil data to -[NSXMLDocument initWithData:options:error:]
  - Add iPhone 7 and 7 Plus to the OSU device list
  - Stop using http when fetching track info for our software update feeds.
    This lets us get rid of the ATS exception for
  - Invoke -processTrackInformation: on the main queue.

  - Removed this framework

  - Converted to ARC.
  - Replaced the OWFWeakRetain protocol (and its implementations) with
    __weak references.
  - Fixed deprecated API usage in OWFileProcessor.

  - Make sure that we fill in outError when we return NO
    from FetchObjectFaultWithContext.
  - Use the error's description, not its plist representation, when logging.
  - Updated the insert and update object validation in ODOEditingContext to
    use fast enumeration instead of CFSetApplyFunction.
  - Removed deprecated RunUnitTests shell script from build phase.
  - Add a missing type to an ODODatabase method parameter.
  - Fixed an over-release of the objectID in an error case in
    _fetchObjectCallback in ODOEditingContext-Internal.m
  - Added a convenience to run a SQL SUM statement over an attribute in
    the database.
  - Fleshed out missing support for ODOAttributeTypeInt64.

  - Better support for macOS Sierra's syncing of ~/Documents and ~/Desktop.
    If an account's sync folder is on your Desktop or in your Documents folder,
    we return a "Local documents folder cannot be used" error and refuse to sync.

  - Support for 1Password integration when adding server account.

  - Update for iOS 10 removing URL-ificition of links in UITextView.
  - Add an option to OUIPasswordAlert to require passphrase confirmation.
  - Support for deferring URL actions while the app is locked.

  - -[OUUnzipArchive unzipArchiveToURL:error:] now allows its target directory
    to exist, unzipping its contents alongside any existing files
  - Added a method to OUUnzipArchive to get input stream for an entry rather
    than an NSData instance
  - Factoring out some zipfile <--> NSFileWrapper code from OmniUI-Internal.



Checking out the source

git clone git://
git submodule update --init


  • We currently use Xcode 8.0 for iOS, watchOS, and Mac OS X. You'll probably have the best results if you do too.
  • Add the projects you want to your workspace.
  • Take a look in the Workspaces directory for a sample workspace for the TextEditor iPad example app.

Supported Targets

  • We require iOS 10.0 and Mac OS X 10.11.

Configuring the Source

We place our project-wide configuration options in xcconfig files, under OmniGroup/Configurations. The naming scheme of the files is fairly straightforward, hopefully. Each project has Omni-Global-{Debug,Release,...}.xcconfig as the basis for the corresponding configuration. Each Mac target has Omni-{Bundle,Application,Tool,...}-{Debug,Release,...}.xcconfig and each iOS target has Touch-{Application,Library}-{Debug,Release,...}.xcconfig. Each of these end point configurations when #includes 'superclass' configurations (with "Common" in the name).


The Workspaces directory contains a couple sample workspace that can be built from Xcode.