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

Posted

技术标签:

【中文标题】如何在 Today 扩展中发送和接收数据【英文标题】:How to send and receive data in Today extensions 【发布时间】:2015-07-04 07:42:52 【问题描述】:

我想为 ios 开发一个具有通知中心小部件的应用程序,但我不知道应该如何在 View Controller 和 And Today Extension 之间发送和接收数据(传递数据)。

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

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

【问题讨论】:

App Groups 是您在扩展程序和 App 之间共享数据的唯一方式。您还可以使用应用组在您的应用和扩展程序之间共享一个通用数据库。 【参考方案1】:

除了 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"])

参考资料:

The complete guide to NSNotificationCenter

希望对你有帮助!

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

【讨论】:

@MohammedMaherAloha 给你! dev.iachieved.it/iachievedit/… @MohammedMaherAloha 查看已编辑答案中的更多参考链接! 这种方法可以在后台唤醒应用程序并接收响应吗?我以为通知中心正在处理中【参考方案2】:

对于尚未找到从App Extension(Widget)实现调用功能或按钮点击的方法的人:

注意:这是使用 Swift

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

    首先,创建 NotificationCenter post 方法(在 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 类中,您希望通过单击 Widget 执行函数或语句,在 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 中指定的方案,如果没有,请转到此链接并按照说明操作: Add URL Scheme to Xcode

对于 YOUR_HOST_NAME,您可以删除它,并且只能通过 URL Scheme 打开应用程序。

编码愉快!

【讨论】:

以上是关于如何在 Today 扩展中发送和接收数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 chrome 扩展本机消息传递和 c# 应用程序之间发送/接收消息

如何在 libreoffice calc 中编写 python 宏来发送和接收数据

如何从发送意图接收数据?

如何在PeerJS中的呼叫者和接收者之间发送数据?

C# Socket 如何完全发送/接收数据

TCP接收数据的问题,发送过来的都是结构体,应该如何接收