Created
July 7, 2015 20:29
-
-
Save phatblat/b10a463ff40d9dc6a808 to your computer and use it in GitHub Desktop.
Darwin notifications in swift
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// MARK: - Darwin Notifications | |
static private let defaultsOnPhoneChangedDarwinNotificationName = "UserDefaultsOnPhoneDidChangeDarwinNotification" | |
static private let defaultsOnWatchChangedDarwinNotificationName = "UserDefaultsOnWatchDidChangeDarwinNotification" | |
static var notificationNameForReceiving: String? | |
static var notificationNameForSending: String? | |
/// Sets up the broadcast and receiving darwin notification names as well as | |
/// as the necessary observer callbacks. | |
static private func setupDarwinNotifications() { | |
// Assume the only .appex bundle is the watch extension | |
if NSBundle.mainBundle().bundleURL.pathExtension == "appex" { | |
// Running inside an extension | |
notificationNameForReceiving = defaultsOnPhoneChangedDarwinNotificationName | |
notificationNameForSending = defaultsOnWatchChangedDarwinNotificationName | |
} | |
else { | |
// Main app bundle | |
notificationNameForReceiving = defaultsOnWatchChangedDarwinNotificationName | |
notificationNameForSending = defaultsOnPhoneChangedDarwinNotificationName | |
} | |
registerForDarwinNotificationsWithIdentifier(notificationNameForReceiving!) | |
} | |
static private func registerForDarwinNotificationsWithIdentifier(identifier: String) { | |
//func CFNotificationCenterAddObserver(_ center: CFNotificationCenter!, | |
// _ observer: UnsafePointer<Void>, | |
// _ callBack: CFNotificationCallback, | |
// _ name: CFString!, | |
// _ object: UnsafePointer<Void>, | |
// _ suspensionBehavior: CFNotificationSuspensionBehavior) | |
//typealias CFNotificationCallback = CFunctionPointer<((CFNotificationCenter!, UnsafeMutablePointer<Void>, CFString!, UnsafePointer<Void>, CFDictionary!) -> Void)> | |
let center = CFNotificationCenterGetDarwinNotifyCenter() | |
let suspensionBehavior = CFNotificationSuspensionBehavior.DeliverImmediately | |
// let suspensionBehavior = CFBooleanGetValue(true) // Session 224 | |
let callback: @objc_block | |
(CFNotificationCenter!, UnsafeMutablePointer<Void>, CFString!, UnsafePointer<Void>, CFDictionary!) -> Void = { | |
(center, observer, name, object, userInfo) in | |
println("darwin callback") | |
NSNotificationCenter.defaultCenter().postNotificationName(EBWUserDefaultsDidChangeNotification, object: nil, | |
userInfo: nil) | |
} | |
let imp: COpaquePointer = imp_implementationWithBlock(unsafeBitCast(callback, AnyObject.self)) | |
let notificationCallback: CFNotificationCallback = CFunctionPointer(imp) | |
CFNotificationCenterAddObserver(center, | |
nil, | |
notificationCallback, | |
identifier, | |
nil, | |
suspensionBehavior) | |
} | |
static private func sendDarwinNotificationWithIdentifier(identifier: String) { | |
let center = CFNotificationCenterGetDarwinNotifyCenter() | |
let deliverImmediately: Boolean = Boolean() | |
CFNotificationCenterPostNotification(center, identifier as CFString, nil, nil, deliverImmediately) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I am also struggling for CFunctionPointer in swift. It is unavailable.