How to send and receive data in Today extensions

删除回忆录丶 提交于 2019-12-30 10:14:27

问题


I want to develop an app for iOS that have a Widget for notification center, but I don't know how I should send and receive data (pass data) between View Controller and And Today Extension.

I tried to use structs, but it doesn't work, and also I used app groups but I don't want to use this method.

let shared = NSUserDefaults(suiteName: "group.Demo.Share-Extension-Demo.mahdi")
shared?.setObject("Hello", forKey: "kkk")

回答1:


Apart from NSUserDefaults, you can use the NSNotificationCenter to send or receive data anywhere.

You need to set the observer where you can receive the data like below:

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "dataReceived:", name: "SpecialKey", object: nil)    
}

Funciton to catch data:

func dataReceived(notification: NSNotification) {
    //deal with notification.userInfo
    println(notification.userInfo)

    println("Received Data")
}

And you need to define NSNotificationCenter from where you need to send the data:

NSNotificationCenter.defaultCenter().postNotificationName("SpecialKey", object: nil, userInfo: ["MyData": "Demo"])

References:

The complete guide to NSNotificationCenter

Hope it helps!

http://moreindirection.blogspot.in/2014/08/nsnotificationcenter-swift-and-blocks.html




回答2:


For the people who haven't found a way to implement calling function or button click from App Extension (Widget):

Note: This is using Swift

Note 2: Replace the names of NSNotification and methods with your implementations

  1. First, create NotificationCenter post method (In Swift 2.0 - NSNotification Center)

Create methods in App Delegate class -

var scheme: String!
var host: String!

Then, add the following function on the bottom of the class (after the last one):

    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. In your ViewController class, where you want to execute the function or the statement from clicking Widget, add the following in super.viewDidLoad():

    NotificationCenter.default.addObserver(self,selector: #selector(self.YOUR_METHOD_NAME),
    name: NSNotification.Name(rawValue: "NOTIFICATION_NAME"),
    object: nil)
    

And the method you want to call:

    func YOUR_METHOD_NAME(notification: NSNotification) {
    let appDelegate =
        UIApplication.shared.delegate as! AppDelegate
    if appDelegate.scheme != nil {
            startRecording()
    }
}
  1. I'm assuming that you have already created your widget target, and the view for it. Add this to your button in TodayViewController from which you want to handle the click:

    @IBAction func openApp(_ sender: UIButton) { openApp() }

And the function to handle opening app by 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!"
        }
    })
}

For YOUR_URL_SCHEME, add your scheme that you have specified in Info.plist, if your don't, go to this link and follow instructions: Add URL Scheme to Xcode

For YOUR_HOST_NAME, you can remove this, and only open app by URL Scheme.

Happy coding!



来源:https://stackoverflow.com/questions/31218262/how-to-send-and-receive-data-in-today-extensions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!