我知道如何使用XCode 6的Devices窗口下载和替换特定iOS应用程序的文件系统容器.
但是对于我正在开发的应用程序,我需要能够下载和替换共享的AppGroup容器以进行调试.这将使我能够模拟AppGroup文件夹内容中的情况以进行测试.
任何人都可以告诉我如何做到这一点?可能吗?
更新:我应该澄清这是用于在真实的iOS设备上进行测试.使用iOS模拟器时,我已成功修改AppGroup文件夹 - 因为可以通过Finder/Mac的文件系统直接访问这些文件夹.
如您所知,当我们在 iOS 中的两个应用程序之间共享数据时,我们可以使用钥匙串。而iOS8以后,我们也可以使用app group来实现同样的功能;我的问题是钥匙串和应用程序组之间有什么区别,哪个更好,为什么?
我以前做过这个,但似乎没有任何效果.这是我的代码:
保存在iOS应用程序中
let groupDefaults = NSUserDefaults(suiteName: "group.company.appSharedDefaults")
groupDefaults?.setObject(theArray, forKey: "theKey")
groupDefaults?.synchronize()
Run Code Online (Sandbox Code Playgroud)
阅读(适用于iOS但不适用于WatchOS 2)
let groupDefaults = NSUserDefaults(suiteName: "group.company.appSharedDefaults")
if groupDefaults!.objectForKey("theKey") != nil {
textEmojiArray = NSMutableArray(array: groupDefaults!.objectForKey("theKey") as! NSArray)
} else {
//error
}
Run Code Online (Sandbox Code Playgroud)
这两个.entitlements文件包含group.company.appSharedDefaults
已打开应用程序组功能,并在两个目标上检查了相应的组.
现在,当我在监视对象上运行读取代码时,objectForKey返回nil,但它在iOS上有效(设备和模拟器结果相同).
我错过了什么!?
我想创建一个需要 App Groups 功能的 iOS 扩展。根据支持的功能列表,无需开发人员帐户即可使用应用程序组。根据该文件,应该可以使用 Apple ID 帐户。
当我尝试为我的应用程序启用应用程序组时,它无法:
将“应用组容器”权利添加到您的应用 ID
与苹果沟通失败
Xcode有一个问题的答案:Enable App Groups without developer account? 其中声明需要开发者帐户,这与官方文档相矛盾。
问题XCode 在添加应用程序组后显示警告(将“应用程序组”权利添加到您的应用程序 ID)不包含有用的答案,因为它们也引用了现有的开发者帐户。他们指出 Xcode 提供的错误消息没有帮助。
所以我的问题是,如何在没有开发者帐户的情况下实际使用 App Groups 或者官方文档有误?
我可以与应用程序组共享iOS领域数据库吗?如果有,怎么样?如果没有,我如何将我的Realm数据库共享给我的其他应用程序?
我知道如果我在我的iOS应用程序的Info.plist中提供UIFileSharingEnabled和LSSupportsOpeningDocumentsInPlace键,我的应用程序的Documents文件夹中的文件将显示在Files.app("在此iPad上")和文档浏览器中.
现在我的问题 - 除了编写文件提供程序扩展 - 是否有任何方法可以添加应用程序组的文件夹或将文档文件夹替换为应用程序组文件夹中的文件夹?为了在我的扩展之间共享,我将所有内容保存在App Group文件夹而不是Documents中,但当然,Files.app无法访问这些文件,这就是我要问的原因.
我尝试创建从文档文件夹到实际文件的符号链接,并显示它们,但无法正常工作("文件不存在").
我还创建了一个文件提供程序扩展,但它被Apple拒绝,因为我的扩展程序不是云支持的,只适用于本地文件.根据我的评论者,文件提供程序扩展必须支持云存储.
感谢您的帮助和见解,
-Matt
“与包含的应用程序共享数据”下的应用程序扩展文档使用 NSUserDefaults 来执行此操作,并进一步写一下
“为了避免数据损坏,您必须同步数据访问。使用 Core Data、SQLite 或 >Posix 锁来帮助协调共享容器中的数据访问。”
但是当我查看 NSUserDefaults 的文档时说
“NSUserDefaults 类是线程安全的。”
那么,在我的扩展程序和容器应用程序之间使用 NSUserDefaults 时,我是否需要使用某种锁?
我已经为我的应用程序创建了 WatchKit 扩展。两者共享一个通用的应用程序组容器来存储和获取数据文件。
我的应用程序及其扩展程序之间共享的应用程序组容器的最大存储限制是多少?
我刚刚App Groups使用此StackOverFlow 帖子添加到我的应用程序中。不幸的是,由于defaultDirectoryURL正在发生变化,我无法获取在使用应用程序组目录之前制作的任何旧数据。我知道数据仍然存在,因为当我切换回使用常规NSPersistentContainer而不是 时GroupedPersistentContainer,我可以获取数据。
如何将旧数据迁移到我正在获取应用组数据的位置?
核心数据代码:
class CoreDataManager {
static let sharedManager = CoreDataManager()
private init() {}
lazy var persistentContainer: NSPersistentContainer = {
var useCloudSync = UserDefaults.standard.bool(forKey: "useCloudSync")
let containerToUse: NSPersistentContainer?
if useCloudSync {
containerToUse = NSPersistentCloudKitContainer(name: "App")
} else {
containerToUse = GroupedPersistentContainer(name: "App")
let description = containerToUse!.persistentStoreDescriptions.first
description?.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
}
guard let container = containerToUse, let description = container.persistentStoreDescriptions.first else {
fatalError("Hey Listen! ###\(#function): Failed …Run Code Online (Sandbox Code Playgroud) migration core-data swift ios-app-group nspersistentcontainer
我一直在为我的核心数据应用程序开发一个今日小部件。我NSFetchedResultsController对小部件和主应用程序使用 a ,并在使用 UserDefaults 和这篇文章的帮助从相反目标更改/添加数据时收到通知。
但是更新数据或NSFetchedResultsController查看更改/添加不起作用。我努力了:
NSFetchedResultsControllerstalenessInterval为 0 并调用viewContext.refreshAllObjects()then 尝试重新获取数据(并且不重新获取数据)shouldRefreshRefetchedObjects在 fetchedController 上设置为 true ,这样它就会自动调用。我知道数据正在保存,因为如果我强制退出应用程序或重新运行小部件,新数据就在那里。但我不知道当相反的情况发生变化时如何刷新应用程序或小部件。
过去几天我一直在寻找解决方案,这实际上是我需要用这个小部件完成的最后一件事。请如果有人知道如何做到这一点请帮忙!
我如何设置我的NSFetchedResultsController:
lazy var fetchedResultsController: NSFetchedResultsController<Item> = setupFetchedController()
override func viewDidAppear(_ animated: Bool) {
loadData()
//check to see if any data was changed. Being notified about changes works every time
subscribeForChangesObservation()
}
private func setupFetchedController() -> NSFetchedResultsController<Item> {
let managedContext = CoreDataManager.sharedManager.persistentContainer.viewContext
let sortDescriptor = NSSortDescriptor(key: "date", ascending: true) …Run Code Online (Sandbox Code Playgroud) core-data nsfetchedresultscontroller swift ios-app-group today-extension