如何在 Today 扩展中发送和接收数据
How to send and receive data in Today extensions
我想为 iOS 开发一个应用程序,它有一个通知中心小部件,但我不知道我应该如何在 View Controller 和 And Today Extension 之间发送和接收数据(传递数据)。
我试过用structs,但没用,我也用过app groups,但我不想用这个方法。
let shared = NSUserDefaults(suiteName: "group.Demo.Share-Extension-Demo.mahdi")
shared?.setObject("Hello", forKey: "kkk")
除了 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
对于还没有找到实现呼叫功能或点击 App Extension (Widget) 按钮的人:
注意:这是使用Swift
注释 2:用您的实现替换 NSNotification 和方法的名称
- 首先,创建 NotificationCenter post 方法(在 Swift 2.0 - NSNotification Center 中)
在 App Delegate 中创建方法 class -
var scheme: String!
var host: String!
然后,在class的底部(最后一个之后)添加如下函数:
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
}
在你的ViewControllerclass中,你想要执行的函数或点击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方案处理打开应用的函数:
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 中指定的方案,如果没有,请转至此 link 并按照说明进行操作:
Add URL Scheme to Xcode
对于YOUR_HOST_NAME,可以去掉这个,只用URL方案打开应用。
编码愉快!
我想为 iOS 开发一个应用程序,它有一个通知中心小部件,但我不知道我应该如何在 View Controller 和 And Today Extension 之间发送和接收数据(传递数据)。
我试过用structs,但没用,我也用过app groups,但我不想用这个方法。
let shared = NSUserDefaults(suiteName: "group.Demo.Share-Extension-Demo.mahdi")
shared?.setObject("Hello", forKey: "kkk")
除了 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
对于还没有找到实现呼叫功能或点击 App Extension (Widget) 按钮的人:
注意:这是使用Swift
注释 2:用您的实现替换 NSNotification 和方法的名称
- 首先,创建 NotificationCenter post 方法(在 Swift 2.0 - NSNotification Center 中)
在 App Delegate 中创建方法 class -
var scheme: String!
var host: String!
然后,在class的底部(最后一个之后)添加如下函数:
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
}
在你的ViewControllerclass中,你想要执行的函数或点击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方案处理打开应用的函数:
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 中指定的方案,如果没有,请转至此 link 并按照说明进行操作: Add URL Scheme to Xcode
对于YOUR_HOST_NAME,可以去掉这个,只用URL方案打开应用。
编码愉快!