如何在Today扩展中发送和接收数据

时间:2015-07-04 07:42:53

标签: ios swift cocoa-touch uiviewcontroller today-extension

我想开发一款适用于iOS的app,它有一个Widget for notification center,但我不知道如何在View Controller和And Today Extension之间发送和接收数据(传递数据)。

我尝试使用结构,但它不起作用,我也使用了应用程序组,但我不想使用这种方法。

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

2 个答案:

答案 0 :(得分:1)

除了NSUserDefaults,您可以使用NSNotificationCenter在任何地方发送或接收数据。

您需要将观察者设置为可以接收如下数据的位置:

override func viewDidLoad() {
    super.viewDidLoad()

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

Funciton捕获数据:

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

    println("Received Data")
}

您需要从需要发送数据的位置定义NSNotificationCenter:

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

参考文献:

The complete guide to NSNotificationCenter

希望它有所帮助!

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

答案 1 :(得分:0)

对于那些没有找到实现调用功能的方法或者从App Extension(Widget)点击按钮的人:

注意:这是使用Swift

注意2 :将NSNotification和方法的名称替换为您的实现

  1. 首先,创建NotificationCenter post方法(在Swift 2.0 - NSNotification Center中)
  2. 在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类中,要执行函数或单击Widget的语句,请在super.viewDidLoad()中添加以下内容:

      NotificationCenter.default.addObserver(self,selector: #selector(self.YOUR_METHOD_NAME),
      name: NSNotification.Name(rawValue: "NOTIFICATION_NAME"),
      object: nil)
      
    2. 您要调用的方法:

          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() }

      2. 以及通过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中指定的方案,如果您没有,请转到此链接并按照说明操作: Add URL Scheme to Xcode

        对于YOUR_HOST_NAME,您可以将其删除,并且只能通过网址方案打开应用。

        快乐的编码!