在下面的例子中,我没有写入错误,但在读取时,数据长度为0.为什么我不能写入共享容器?
+ (UIImage *)read {
NSData *data = [NSData dataWithContentsOfFile:[self getPath]];
NSLog(@"Data length: %d", data.length);
UIImage *image = [UIImage imageWithContentsOfFile:[self getPath]];
NSLog(@"%@", image);
return image;
}
+ (void)write:(UIImage *)image {
NSString *pngFilePath = [self getPath];
NSData *data1 = [NSData dataWithData:UIImagePNGRepresentation(image)];
[data1 writeToFile:pngFilePath atomically:YES];
}
+ (NSString *)getPath {
NSURL *containerUrl = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.me.app"];
NSString *pngFilePath = [[containerUrl absoluteString] stringByAppendingPathComponent:@"current.png"];
NSLog(@"%@", pngFilePath);
return pngFilePath;
}
Run Code Online (Sandbox Code Playgroud) 我设置了一个应用程序组与我的 Today Extension 一起使用。我在主应用程序的目标和扩展程序的目标中添加了应用程序组。在开发人员门户的应用程序 ID 配置中,我启用了应用程序组。但由于某种原因,FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: id)每当我调用它时都会返回零。我已经检查了三次该forSecurityApplicationGroupIdentifier字符串并知道它是正确的。
有谁知道为什么这不起作用?
编辑:我能够通过编辑我的调试权利以包含应用程序组来解决零问题。我一直在关注这篇文章,并且能够成功地从 NSPersistentContainer 迁移我的数据,但是当我尝试在用户打开 iCloud 时使用 NSPersistentCloudKitContainer 时,同样的方法不起作用。它仍然能够迁移数据,但不允许我在设备之间同步数据(几乎只是使其成为常规的 NSPersistentContainer)。如果我恢复到以前的方式,我就可以使用 iCloud 同步。
NSPersistentCloudKitContainer任何人都可以帮助我解决迁移时使用应用程序组时的同步问题吗?
核心数据代码:
class CoreDataManager {
static let sharedManager = CoreDataManager()
private init() {}
lazy var persistentContainer: NSPersistentContainer = {
var useCloudSync = UserDefaults.standard.bool(forKey: "useCloudSync")
//Get the correct container
let containerToUse: NSPersistentContainer?
if useCloudSync {
containerToUse = NSPersistentCloudKitContainer(name: "App")
} else {
containerToUse = NSPersistentContainer(name: "App")
}
guard let container = containerToUse else {
fatalError("Couldn't get …Run Code Online (Sandbox Code Playgroud) 我熟悉iCloud同步,但我是应用程序组的新手.这个问题可能有一个简单的答案,但我还没有找到.基本上,我有一个应用程序,我有iCloud集成,现在我想尝试添加今天的扩展.我目前正在使用Core Data作为后端,并希望继续这样做.但是,根据我的阅读,我需要通过定义"应用程序组"将我的数据存储移动到共享位置.(http://blog.sam-oakley.co.uk/post/92323630293/sharing-core-data-between-app-and-extension-in-ios-8和iOS 8扩展中的访问核心数据SQL数据库(共享)应用程序和窗口小部件扩展之间的数据))我无法确定是否使用iCloud同步此位置.或者,因为我使用iCloud,我是否需要一个应用程序组?我感谢任何和所有的帮助/建议.
我已经经历了很多SO帖子,并且可以使用它,但是它停止了工作。我不确定发生了什么。我使用watchOS 1.0开发了这个iPhone + WatchKit应用程序,并且一切正常。
我已经将我的应用程序,项目和Apple Watch升级到watchOS 2.0,现在我无法使用我的应用程序组通过NSUserDefaults获取任何数据。
在主机App和WatchKit Extension的Xcode中启用了App Groups。我什至还尝试为WatchKit App打开它。
我的群组名称称为“ group.com.mycompany.myapp”(带有我的真实公司名称和应用名称),并且在所有目标上均已选择。
我已经确认主机应用程序的构建设置和WatchKit扩展引用了权利文件,并检查了这些权利文件是否包含所选应用程序组的应用程序组安全性选项。
我确保主机应用程序,watchkit扩展程序和watchkit应用程序的捆绑包标识符不同。我分别使用“ com.mycompany.myapp”,“ com.mycompany.myapp.watchkitextension”和“ com.mycompany.myapp.watchkitapp”。
这是我的Xcode配置的一些截图,用于主机应用程序,watchkit扩展程序和watchkit应用程序,以防万一:
这是我的主机应用程序中的代码,能够正确读取数据:
NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kAppGroupName];
NSLog(@"app defaults: %@", [defaults dictionaryRepresentation]);
Run Code Online (Sandbox Code Playgroud)
这会在我的控制台中产生该数据,kKeyEmployeeId并且kKeyStoreNumber是我要在主机和手表之间共享的数据。
2015-12-13 13:51:35.618 MyApp[27516:16126253] app defaults: {
AppleLanguages = (
"en-US",
en
);
INNextHearbeatDate = "472211882.83309";
NSInterfaceStyle = macintosh;
NSLanguages = (
"en-US",
en
);
"com.apple.content-rating.AppRating" = 1000;
"com.apple.content-rating.ExplicitBooksAllowed" = 1;
"com.apple.content-rating.ExplicitMusicPodcastsAllowed" = 1;
"com.apple.content-rating.MovieRating" = 1000;
"com.apple.content-rating.TVShowRating" = 1000;
kKeyEmployeeId = Kenny;
kKeyStoreNumber = …Run Code Online (Sandbox Code Playgroud) 我有一个分享扩展的iOS应用程序.我正在尝试使用NSUserDefaults和App Groups在它们之间共享数据,但是,虽然我可以写入NSUD对象,但是读取它并且synchronize()没有错误,读取扩展名总是会导致nil.
我有一个应用程序组,文字字符串"group.net.foo.bar",应用程序和扩展程序都在功能 - >应用程序组下配置.这个字符串在我的app中的constants结构中:
struct Forum {
static let APP_GROUP = "group.net.foo.bar"
static let AUTH_KEY = "AUTH_KEY"
}
Run Code Online (Sandbox Code Playgroud)
在主应用程序中,我创建一个UserDefaults对象并写入它:
fileprivate lazy var userDefaults: UserDefaults = {
let defaults = UserDefaults()
defaults.addSuite(named: Forum.APP_GROUP)
return defaults
}()
// later
userDefaults.set(apiKey, forKey: Forum.AUTH_KEY)
userDefaults.synchronize()
Run Code Online (Sandbox Code Playgroud)
之后创建一个新的NSUD对象synchronize()并检索AUTH_KEY.在扩展中,我创建了一个NSUD并尝试检索该值,但无济于事:
private lazy var userDefaults: UserDefaults = {
let defaults = UserDefaults()
defaults.addSuite(named: Forum.APP_GROUP)
return defaults
}()
// later
private func getApiKey() -> String? {
return userDefaults.string(forKey: Forum.AUTH_KEY)
}
// returns nil …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用 Realm 作为数据库,并且我有共享扩展来支持从其他应用程序共享的媒体。因为我需要从共享扩展访问我的数据库,所以我将领域文件从 App 的文档目录移动到 Appgroup 的共享容器。我有以下问题。
我将主应用程序中的数据保存在存储在 userDomainMask 某处的文件中。
NSKeyedArchiver.archiveRootObject(stops, toFile: BusStop.ArchiveURL.path)
Run Code Online (Sandbox Code Playgroud)
这是在我的 BusStop 类文件中
static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("stops")
Run Code Online (Sandbox Code Playgroud)
现在我想从我的 Today Extension 和它返回的空集 [] 中读取这些数据,所以我知道问题出在哪里。我需要将此数据保存在我的扩展程序和应用程序所属的共享应用程序组中。
如何保存数据并从中读取数据?
编辑:
我解决了我的问题!
使用此解决方案:
static let ArchiveURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.asd.asd.asd")!
.appendingPathComponent("mypath")
Run Code Online (Sandbox Code Playgroud)
每次对已保存的数据进行操作或保存新内容时,请使用以下解决方案:
干杯!
我已经为这个问题拉了两天了。我在iPhone应用程序中生成了一个小电影文件,该文件要从iPhone发送以在Apple Watch上播放。作为概念证明,我在Apple Watch App捆绑包中放置了一个类似的.mov,并且可以毫无问题地播放它。因此,我想了想,现在,当我想向手表发送一个新的小片段时,我将其放在App Group Shared容器中,然后从那里访问它,而不是从Bundle中访问它。不!
我经历过成千上万的SO职位,尝试了许多不同的方法,但没有达到预期的效果。
在您询问之前,我已对应用程序组进行了多次重做,从iTunes Connect中删除了旧的应用程序,重新生成了配置文件,多次清理了目标,多次删除了DerivedData,删除了应用程序并多次启动,并且几乎尝试了所有细微的调整并修复了我在SO上找不到的内容,但没有任何帮助。
我确实认为我知道问题出在哪里,但不知道如何解决。
这是我在iPhone App和Watch App中都使用的代码,以获取共享容器的路径(如果是从Watch端,则此代码段):
let fileManager = FileManager.default
let sharedContainer = fileManager
.containerURL(
forSecurityApplicationGroupIdentifier: "group.com.mycompany.myappname")
let dirPath = sharedContainer?.path
sharedFilePathOnWatch = (dirPath! as NSString).appendingPathComponent("watchPreview.mov")
print ("Shared File Path on Watch: \(sharedFilePathOnWatch)")
print ("Shared File Path from iPhone: \(sharedFilePath)")
Run Code Online (Sandbox Code Playgroud)
打印语句显示了我从iPhone(通过Watch Connectivity)发送到手表的共享文件路径以及Watch App解析的共享路径。
当运行以下命令时,我得到的是:
监视中的共享文件路径:/private/var/mobile/Containers/Shared/AppGroup/94AA7797-528D-4E96-9623-23285BE0742B/watchPreview.mov
iPhone的共享文件路径:/private/var/mobile/Containers/Shared/AppGroup/4D43C314-CCBD-4861-BF90-69A8AC71198C/watchPreview.mov
现在,我期望只有一个共享容器,并且iPhone和Watch都应该解析相同的路径,但事实并非如此。我还注意到,在多次运行中,这两个应用程序的这些路径保持不变。这并不是我每次怀疑都会在每次运行时更改的动态地址。
作为使此功能发挥作用的最后一次尝试,我发现由于我有通向iPhone上的共享容器和Apple Watch上的共享容器的路径,也许我可以将文件从一个移到另一个,因为,他们应该共享。但是,即使这样也不行。
因此,主要问题是:
我正在考虑将所有数据存储在应用程序组的容器区域中,以创建支持 AppExtensions 的应用程序。
在iOS8上将所有数据存储在App Groups的容器区域中是否有任何弱点?我应该在应用程序组的容器区域中存储有限的数据吗?
I want to share Core Data with the Widget. I guess I'll need to create App Group (I know how to do this). But how do I then share the Core Data database with the Widget?
If I wanna use Core Data in my app, I always just simply create a new Xcode project and check "Use Core Data", and I get this code (Persistence.swift - below), which hooks me up to a database.
How can I modify it, …