Как отправлять и получать данные в расширениях Today
Я хочу разработать приложение для iOS, в котором есть виджет для центра уведомлений, но я не знаю, как мне отправлять и получать данные (передавать данные) между View Controller и And Today Extension.
Я пытался использовать структуры, но это не работает, а также я использовал группы приложений, но я не хочу использовать этот метод.
let shared = NSUserDefaults(suiteName: "group.Demo.Share-Extension-Demo.mahdi")
shared?.setObject("Hello", forKey: "kkk")
2 ответа
Помимо NSUserDefaults, вы можете использовать NSNotificationCenter для отправки или получения данных в любом месте.
Вам нужно установить наблюдателя, где вы можете получить данные, как показано ниже:
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "dataReceived:", name: "SpecialKey", object: nil)
}
Функция для сбора данных:
func dataReceived(notification: NSNotification) {
//deal with notification.userInfo
println(notification.userInfo)
println("Received Data")
}
И вам нужно определить NSNotificationCenter, откуда вам нужно отправить данные:
NSNotificationCenter.defaultCenter().postNotificationName("SpecialKey", object: nil, userInfo: ["MyData": "Demo"])
Рекомендации:
Полное руководство по NSNotificationCenter
Надеюсь, поможет!
http://moreindirection.blogspot.in/2014/08/nsnotificationcenter-swift-and-blocks.html
Для людей, которые не нашли способ реализовать функцию вызова или нажатие кнопки из Расширения приложения (виджет):
Примечание: это использует Swift
Примечание 2: замените имена NSNotification и методы вашими реализациями
- Во-первых, создайте метод публикации NotificationCenter (в Swift 2.0 - NSNotification Center)
Создание методов в классе App Delegate -
var scheme: String!
var host: String!
Затем добавьте следующую функцию внизу класса (после последней):
func application(_ app: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
scheme = url.scheme
host = url.host
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NOTIFICATION_NAME"), object: nil)
return true
}
В вашем классе ViewController, где вы хотите выполнить функцию или инструкцию, щелкнув Виджет, добавьте следующее в
super.viewDidLoad()
:NotificationCenter.default.addObserver(self,selector: #selector(self.YOUR_METHOD_NAME), name: NSNotification.Name(rawValue: "NOTIFICATION_NAME"), object: nil)
И метод, который вы хотите вызвать:
func YOUR_METHOD_NAME(notification: NSNotification) {
let appDelegate =
UIApplication.shared.delegate as! AppDelegate
if appDelegate.scheme != nil {
startRecording()
}
}
Я предполагаю, что вы уже создали свою цель виджета и представление для нее. Добавьте это к вашей кнопке в TodayViewController, из которой вы хотите обработать щелчок:
@IBAction func openApp(_ sender: UIButton) { openApp() }
И функция для управления открытием приложения по URl Scheme:
func openApp(){
let myAppUrl = NSURL(string: "YOUR_URL_SCHEME://YOUR_HOST_NAME")!
extensionContext?.open(myAppUrl as URL, completionHandler: { (success) in
if (!success) {
self.textView.text = "There was a problem opening app!"
}
})
}
Для YOUR_URL_SCHEME добавьте свою схему, которую вы указали в Info.plist, если нет, перейдите по этой ссылке и следуйте инструкциям: Добавить схему URL в Xcode
Для YOUR_HOST_NAME вы можете удалить это и открыть приложение только по схеме URL.
Удачного кодирования!