如何使用共享容器/应用程序组从Swift中的其他目标访问文件

时间:2019-04-29 23:48:51

标签: ios swift

我是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对象可以做到这一点?

如果在其他地方都回答过此问题,请指出来,我会记下来。

1 个答案:

答案 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!)

您可以从这里正常读取内容。