【问题标题】:Transfer data from project to widget in swift快速将数据从项目传输到小部件
【发布时间】:2018-10-13 09:57:55
【问题描述】:

在我的项目中,我需要将用户 ID 发送到 iOS 中的小部件。但为此,我的用户需要打开一次应用程序。不打开,信息只保留1天,之后消失,小部件停止显示信息并等待打开应用程序。 为此,我使用了 appGroup。
使用从我的项目传输数据到小部件的正确方法是什么?

【问题讨论】:

    标签: ios swift widget


    【解决方案1】:

    您需要在用户默认值中设置一个字典值并像这样在小部件中读取它

    var dic:[String:String] = ["DateStr":"ID"]
    

    获取小部件中的日期并读取默认值(如果存在)并查找匹配的 DateStr

    请注意每次打开应用时更新 dic

    【讨论】:

    • 那将是一个不完整的过程。必须通过确定使用的 UserDefaults 的套件名称(指定的数据库名称)。
    • @AhmadF 确定他必须使用套件名称作为默认值,并从我期望的组名中理解这一点
    • 但我不认为 OP 会隐含地知道它?
    【解决方案2】:

    为此,我使用了 appGroup。

    使用从我的项目传输数据到的正确方法是什么 小部件?

    到目前为止,您所做的(应用分组)是您应该遵循的步骤之一。接下来,如App Extension Programming Guide - Sharing Data with Your Containing App中提到的:

    启用应用组后,应用扩展及其包含的应用 都可以使用NSUserDefaults API 来共享用户访问权限 优先。要启用此共享,请使用initWithSuiteName: 方法 实例化一个新的 NSUserDefaults 对象,传入标识符 共享组的

    所以,到目前为止,您要做的就是让UserDefautls传输数据。例如:

    if let userDefaults = UserDefaults(suiteName: "group.com.example.myapp") {
        userDefaults.set(true, forKey: "myFlag")
    }
    

    因此您可以将其传递给小部件:

    if let userDefaults = UserDefaults(suiteName: "group.com.example.myapp") {
        let myFlag = userDefaults.bool(forKey: "myFlag")
    }
    

    并且您采用相同的方法来传递数据,反之亦然(从小部件到项目)。

    【讨论】:

    • 我已经用过这个方法了,但是如果用户没有打开应用程序并且1天后,我的数据就会消失。我需要再次强制用户打开应用程序。
    • @Kuroiteiken 这将与您的应用程序的业务相关,与应如何传输数据。
    【解决方案3】:

    斯威夫特 5

    按照这些步骤将数据从主机应用程序传递到扩展程序。

    1. 选择项目目标 > 功能 > 添加新应用组(如果您已为您的开发者帐户启用权限,否则请先启用该权限)
    2. 选择扩展目标并重复相同的操作。
    if let userDefaults = UserDefaults(suiteName: "group.com.yourAppgroup") {
                createEventDic.removeAll()
                let eventDic = NSMutableDictionary()
                eventDic.setValue("YourString", forKey: "timeFontName")
                createEventDic.append(eventDic)
                
                let resultDic = try? NSKeyedArchiver.archivedData(withRootObject: createEventDic, requiringSecureCoding: false)
                userDefaults.set(resultDic, forKey: "setWidget")
                userDefaults.synchronize()
    
            } else {
            }
    
    1. 现在转到您的应用扩展程序并执行以下步骤以获取传递的数据。
    if let userDefaults = UserDefaults(suiteName: "group.com.yourAppGroup") {
                guard let testcreateEvent = userDefaults.object(forKey: "testcreateEvent") as? NSData else {
                    print("Data not found in UserDefaults")
                    
                    return
                }
                
                do {
                    guard let eventsDicArray = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(testcreateEvent as Data) as? [NSMutableDictionary] else {
                        fatalError("loadWidgetDataArray - Can't get Array")
                    }
                    
                    for eventDic in eventsDicArray {
                        let timeFontName = eventDic.object(forKey: "timeFontName") as? String ?? ""
                        
                    }
                } catch {
                    fatalError("loadWidgetDataArray - Can't encode data: \(error)")
                }
            }
    

    希望它会有所帮助。干杯!

    【讨论】:

    • 你不需要.synchronize()。实际上,这已被弃用,并且文档宣传不使用它。
    • 你从哪里得到 createEventDic?
    • createEventDic 是您要在应用组数据中保存和发送的任何字典。请改用您的。
    【解决方案4】:

    在 Xamarin Forms 中,我们需要使用 DI 将数据传递给 ios 项目,然后我们可以将其放入 NSUserDefaults 信息:分组申请是强制性的

    Xamarin iOS 项目 - 将数据放入 NSUserDefaults

     var plist = new NSUserDefaults("group.com.test.poc", NSUserDefaultsType.SuiteName);
     plist.SetBool(true, "isEnabled");
     plist.Synchronize();
    

    Today Extension - 从 NSUserDefaults 获取数据

    var plist = new NSUserDefaults("group.com.test.poc", NSUserDefaultsType.SuiteName);
    var result = plist.BoolForKey("isEnabled");
    Console.WriteLine($"The result of NSUserdefaults: logesh {result}");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多