我是Swift的新手。
我正在尝试创建一个包含两个应用程序的项目,其中一个应用程序包含一些数据文件,而另一个应用程序访问这些文件。
我认为,解决方案是使用App Groups授权来实现这一目的,并通过这些方式访问文件。我已经可以按照此处的示例进行操作:Communicating and persisting data between apps with App Groups。特别是第二个答案,是Swift式的(我猜可能是旧版本吗?)。它似乎可以使用正确的权利。因此,现在的问题是,如何从一个应用程序访问文件,而又将其分离?我不熟悉我可以使用的API和正确的功能(如我所说,这是Swift的新增功能)。
这些应用是基本的。设置为单视图应用程序,除ViewController
,权利和包含测试数据的所有内容外,其他所有内容均默认。 Xcode项目结构为:
testingData/
testingData/
testingData.entitlements
TestData/
testdata.txt
AppDelegate.swift
ViewController.swift
Main.storyboard
Assets.xcassets
LaunchScreen.storyboard
Info.plist
sharedContainerTest/
sharedContainerTest.entitlements
AppDelegate.swift
ViewController.swift
Main.storyboard
Assets.xcassets
LaunchScreen.storyboard
Info.plist
Products/
testingData.app
sharedContainerTest.app
权利都相同。它们每个都启用了应用程序组,并且具有相同的字符串:group.com.example.name
。在testingData
目标上,该示例的ViewController
函数中的viewDidLoad
具有以下块(已为Swift 4.x修改):
var userDefaults = UserDefaults(suiteName: "group.com.example.name")!
userDefaults.set("user12345", forKey: "userId")
userDefaults.synchronize()
在sharedContainerTest
目标上,其ViewContoller
具有
var userDefaults = UserDefaults(suiteName: "group.com.example.name")
if let testUserId = userDefaults?.object(forKey: "userId") as? String {
print("User Id: \(testUserId)")
}
在其viewDidLoad
函数中。就像我说的那样,这似乎可行,但是现在我需要添加什么才能从testdata.txt
应用访问testingData
文件?是否需要将其存储为变量?还是有一个Bundle
对象可以做到这一点?
如果在其他地方都回答过此问题,请指出来,我会记下来。
答案 0 :(得分:0)
经过反复尝试,答案如下:
代替传递字符串"user12345"
,您需要将URL传递到要为userDefaults.set
方法读取的文件,如下所示:
var userDefaults = UserDefaults(suiteName: "group.com.example.name")!
userDefaults.set(Bundle.main.url(forResource: "testdata", withExtension: ".txt"), forKey: "userId")
userDefaults.synchronize()
然后在接收器应用程序中,调用该对象并设置URL:
let userDefaults = UserDefaults(suiteName: "group.com.example.name")
let test = userDefaults?.object(forKey: "userId") as? String
let testURL = URL(fileURLWithPath: test!)
您可以从这里正常读取内容。