Как отправлять и получать данные в расширениях 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 и методы вашими реализациями

  1. Во-первых, создайте метод публикации 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
}
  1. В вашем классе 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()
    }
}
  1. Я предполагаю, что вы уже создали свою цель виджета и представление для нее. Добавьте это к вашей кнопке в 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.

Удачного кодирования!

Другие вопросы по тегам