ios 在Swift中将数据从项目传输到小部件

yduiuuwa  于 2023-05-23  发布在  iOS
关注(0)|答案(3)|浏览(167)

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

7rtdyuoh

7rtdyuoh1#

*Swift 5

按照以下步骤将数据从主机应用传递到扩展。
1.选择项目目标>功能>添加新应用组(如果您已经为开发者帐户启用权限,否则首先启用)
1.选择扩展目标并重复相同的操作。

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

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

8aqjt8rx

8aqjt8rx2#

在Xamarin Forms中,我们需要使用DI将数据传递给ios项目,然后我们可以将其放入NSUserDefaults Info中:分组申请为必填项
Xamarin iOS项目-将数据放入NSUserDefault

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

今日扩展-从NSUserDefaults获取数据

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

ui7jx7zq3#

为此,我使用了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")
}

这样你就可以把它传递给widget:

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

您可以按照相同的方法传递数据,反之亦然(从小部件到项目)。

相关问题