如何在 iOS 应用程序和今日视图扩展程序之间共享数据
Posted
技术标签:
【中文标题】如何在 iOS 应用程序和今日视图扩展程序之间共享数据【英文标题】:How do I share data between iOS app and today view extension 【发布时间】:2020-04-19 20:02:41 【问题描述】:我正在尝试在今日视图扩展中显示人员姓名;但我似乎无法做到这一点。我看过很多 YouTube 视频,但它们从来没有帮助过。所以如果可以的话,我希望你回答这个问题。
应用程序的工作原理:您在应用程序中输入您的姓名。并且它将显示在今天的视图扩展中。
关于应用程序:我有一个文本字段和按钮。文本字段是人名,按钮是保存名称。
我想在今天的扩展中显示这个名字。
谢谢。
【问题讨论】:
【参考方案1】:将组添加到权利/功能。
-
转到应用目标的功能选项卡
启用应用组
创建一个新的应用程序组,命名为适当的东西。它必须以组开头..
让 Xcode 为您完成创建此组的过程。
使用组 ID 将数据保存到 NSUserDefaults 并在您的扩展程序中使用。
来自 Apple 的应用扩展指南:
https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html
在主应用中,保存人名:
let defaults = UserDefaults(suiteName: "your group ID")
defaults!.set("person name", forKey: "key for person name")
defaults!.synchronize()
在扩展中,您可以使用保存的人名:
let defaults = UserDefaults(suiteName: "your group ID")
let savedPersonName = defaults!.string(forKey: "key for person name")
【讨论】:
我使用的是 Xcode 11.4.1,所以我没有看到启用选项。但是,如果我单击顶部的添加按钮,我会看到应用程序组。即使我启用它,我该怎么办 保存人名到 UserDefaults : 检索人名: 如果您可以编辑您的答案并将这些 cmets 放入您的答案中会更好。 :)【参考方案2】:这里是这个例子中今天扩展的一个简单例子,我只是显示和更新用户名
这是我今天的扩展故事板图片 today-view-Controller 代码是:
import UIKit
import NotificationCenter
class TodayViewController: UIViewController, NCWidgetProviding
@IBOutlet weak var lnameLabel: UILabel!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
override func viewDidAppear(_ animated: Bool)
if let name = UserDefaults.init(suiteName: "group.com.ahmad.widget")?.value(forKey: "name")
lnameLabel.text = name as? String
else
lnameLabel.text = "Wait..."
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void))
// Perform any setup necessary in order to update the view.
// If an error is encountered, use NCUpdateResult.Failed
// If there's no update required, use NCUpdateResult.NoData
// If there's an update, use NCUpdateResult.NewData
completionHandler(NCUpdateResult.newData)
我创建了一个故事板并在其中添加了一个按钮,而不是在他的按钮操作上我更新了今天扩展上的用户名
viewController 的代码是:
class ViewController: UIViewController
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var nameTextfield: UITextField!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
@IBAction func SetNameOnWigetAction(_ sender: Any)
nameLabel.text = nameTextfield.text
UserDefaults.init(suiteName: "group.com.ahmad.widget")?.setValue(nameTextfield.text, forKey: "name")
【讨论】:
好的,但是我使用哪个捆绑包 ID?应用程序或今天的扩展程序 UserDefaults.init(suiteName: "group.com.ahmad.widget")?.setValue(nameTextfield.text, forKey: "name") 这里是 "group.com.ahmad.widget"不是 App ID 或 Today Extension ID,它只是一个唯一的 ID,你可以根据需要更改它但是当你从观察者那里获得价值时,他会是一样的 这里是视频链接 bro chill 如何为应用添加小部件youtube.com/watch?v=skbWSQlcN5k 好的,我刚刚测试了项目,但它总是显示“等待...”。我应该使用 UserDeafualts 来保存名称吗? 我看过那个视频,但我在今天视图中的标签显示错误【参考方案3】:只是一个简短的通知,因为我也错过了它
为了让它正常工作,请在应用目标上创建组 然后在 Today's target 上也添加 Group Capability 并勾选刚刚从主应用程序的目标创建的那个(它应该被列出)
【讨论】:
以上是关于如何在 iOS 应用程序和今日视图扩展程序之间共享数据的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 应用程序及其扩展程序之间共享 Storyboard
如何在主 iOS 应用程序及其共享扩展程序之间使用相同的经过身份验证的用户令牌
应用程序扩展 iOS9:如何将字符串 / URL 从共享视图发送到我的应用程序?