我今天已将我的Xcode 8更新为beta 2,并且我正在尝试在App和Today Extension之间共享数据.我正面对这个日志警告:
2016-07-08 18:00:24.732472 ProjetctX [941:42801] [用户默认值]无法读取CFPrefsPlistSource <0x1700f1280>中的值(域:group.xpto,用户:kCFPreferencesAnyUser,ByHost:是,容器:(null)) :将kCFPreferencesAnyUser与容器一起使用仅允许System Containers与cfprefsd分离
有人可以帮帮我吗?
在XCode中添加应用程序组后,它会显示一个警告符号(将"应用程序组"权利添加到您的应用程序ID并将"应用程序组容器"权利添加到您的应用程序ID).在警告之前有一个像这样的加载微调器:
完成加载后,我收到以下警告:
我该怎么做才能纠正这两个错误的步骤?如果我是对的,它已经添加到我的App ID中.
有时,但并非总是(我已经有一点工作),app/extension处于一种状态,我无法读取我的应用程序组在我的随播应用程序和我的应用程序扩展之间设置的标志.不知道它是如何处于这种状态或为什么值不同,但它对我的应用程序至关重要,它们始终是同步的.
Companion app viewDidLoad:
NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"];
.....
[myAppSettings setBool:true forKey:@"myBool"];
[myAppSettings synchronize];
NSLog([myAppSettings boolForKey:@"myBool"] ? @"Companion app - bool TRUE" : @"Companion app - bool FALSE");
Run Code Online (Sandbox Code Playgroud)
应用扩展程序viewDidLoad
NSUserDefaults *myAppSettings = [[NSUserDefaults alloc] initWithSuiteName:@"group.myapp"];
[myAppSettings synchronize];
NSLog([myAppSettings boolForKey:@"myBool"] ? @"App extension app - bool TRUE" : @"App extension - bool FALSE");
Run Code Online (Sandbox Code Playgroud)
控制台输出
Companion app - bool TRUE
App extension - bool FALSE
Run Code Online (Sandbox Code Playgroud)
我也会在我的同伴应用程序进入后台之前进行同步.我在门户网站等设置了我的应用程序组
我究竟做错了什么?
编辑
显然其他人也有这个问题:https: //devforums.apple.com/message/977151#977151
"我认为这目前非常糟糕.
有时数据共享起作用,然后进行更改,并且窗口小部件突然无法再看到共享数据(在模拟器和设备上).
烦人并希望它在下一个测试版中更加可靠!"
编辑2 看起来另一个人也报告了这个问题: …
我创建了Today Extension
第一次在iOS 8中引入的.为了在Today extension
它之间共享数据container App
,我定义了一个app group
,并将它们绑定到这个组.(实际上我还添加了一个嵌入式框架来重用两边的代码.)
Apple的文档中描述了此方法的详细信息.
我创建了一些核心数据模型并将其作为sqlite存储在组容器中.然后一切都按照我的想法运作.
但是,当我卸载容器应用程序时,我的iPhone上仍然有共享容器及其内容.我想当卸载应用程序组的最后一个成员时,必须自动删除此容器.在我的情况下,应用程序组的成员只附带一个应用程序,因此,卸载此应用程序应该必须清除共享容器.
我错了吗?
PS.我找不到以用户身份删除此共享容器的方法.只有拥有访问app-group权限的开发人员才能通过编程删除此容器.
我已经看过关于在主机应用和应用扩展之间共享NSUserDefaults数据的所有其他帖子,但我仍然无法工作.以下是我所做的一切:
毕竟,这段代码仍然不起作用:
// in the host app
NSUserDefaults *testDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mycompany.foo"];
[testDefaults setObject:@"TEST" forKey:@"foo"];
[testDefaults synchronize];
Run Code Online (Sandbox Code Playgroud)
然后:
// in the extension
NSUserDefaults *testDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.mycompany.foo"];
NSLog(@"%@", [testDefaults objectForKey:@"foo"]);
Run Code Online (Sandbox Code Playgroud)
这导致:
(null)
Run Code Online (Sandbox Code Playgroud)
当我查看Xcode首选项时,我注意到这些图标,其中没有一个具有"App Group"图标:
但正如我之前所说,我在设置应用程序组后清除了我的钥匙串,证书和配置文件.因此,如果这实际上是问题,我如何将权利添加到配置文件?
我错过了什么?我是新鲜的想法.
救命?
编辑:访问组正在我的今日和Safari扩展中工作,而不是在WatchKit扩展中.我不知道为什么,并且所有构建设置似乎都以相同的方式配置.
编辑2:对于那些坚持我的功能设置不正确的人,这里有一个截图:
我使用以下代码在共享容器路径下创建文件夹/文件.这将有助于应用扩展程序和包含应用程序的扩展程序可以访问数据.
获取共享容器url位置的代码:
+(NSURL*)getSharedContainerURLPath
{
NSFileManager *fm = [NSFileManager defaultManager];
NSString *appGroupName = APP_EXTENSION_GROUP_NAME; /* For example */
NSURL *groupContainerURL = [fm containerURLForSecurityApplicationGroupIdentifier:appGroupName];
return groupContainerURL;
}
Run Code Online (Sandbox Code Playgroud)
用于创建目录的代码
+(void)createDirAtSharedContainerPath
{
NSString *sharedContainerPathLocation = [[self getSharedContainerURLPath] absoluteString];
NSString *directoryToCreate = @"user_abc";
//basically this is <shared_container_file_path>/user_abc
NSString *dirPath = [sharedContainerPathLocation stringByAppendingPathComponent:directoryToCreate];
BOOL isdir;
NSError *error = nil;
NSFileManager *mgr = [[NSFileManager alloc]init];
if (![mgr fileExistsAtPath:dirPath isDirectory:&isdir]) { //create a dir only that does not exists
if (![mgr createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:&error]) {
NSLog(@"error while …
Run Code Online (Sandbox Code Playgroud) 我想知道我们是否可以在具有新iOS 8功能的应用程序之间共享数据:应用程序组(使用NSUserDefaults) - 或者如果应用程序组仅在主应用程序及其扩展程序之间共享数据?
我实际上在两个应该共享数据的应用程序上启用了应用程序组功能(它们属于同一家公司).它们也具有相同的App Groups(例如group.com.company.myApp).
这是第一个代码(在Swift中)
NSUserDefaults.standardUserDefaults().setBool(true, forKey:"Bool")
NSUserDefaults.standardUserDefaults().synchronize()
Run Code Online (Sandbox Code Playgroud)
这是第二个代码(在Objective-C中)
NSUserDefaults *datas = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.company.myApp"];
NSLog(@"%@", [datas boolForKey:@"Bool"]);
Run Code Online (Sandbox Code Playgroud)
可悲的是,布尔总是回归零.
如果有人有解决方案:)
谢谢
我已成功通过userDefaults在我的应用程序和今日扩展程序之间共享数据,但是我遇到位于应用程序的Documents文件夹中的实际文件时遇到了问题.
当我在我的应用程序中使用此代码时:
var documentsDir:NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
Run Code Online (Sandbox Code Playgroud)
它返回:
/var/mobile/Containers/Data/Application/296494AA-946C-40E0-8646-F0895E131DCB/Documents/
Run Code Online (Sandbox Code Playgroud)
但在扩展中它返回:
/var/mobile/Containers/Data/PluginKitPlugin/AB484342-537A-4CE7-9EF3-F2CAE352C8A3/Documents/
Run Code Online (Sandbox Code Playgroud)
显然,文件不在那里.
我读到了我应该使用的地方:
let containerURL = manager.containerURLForSecurityApplicationGroupIdentifier("group.com.company.app")
let filePath = containerURL.path
Run Code Online (Sandbox Code Playgroud)
但它返回:
/private/var/mobile/Containers/Shared/AppGroup/CD7CF610-EB5F-4246-8D30-D7F8BFA6A219
Run Code Online (Sandbox Code Playgroud)
这也没用.
如何让我的iOS 8 Today Extension读取位于Documents中的容器应用程序文件?
谢谢!
我有一个存储在App Group容器中的sqlite数据库,以便注册自定义快捷方式.
我可以从应用程序读取/写入,但不能从键盘扩展名读取/写入.似乎数据库处于扩展的只读模式.
我正在使用以下代码来访问它:
let appGroupDirectoryPath = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(appGroupId)
let dataBaseURL = appGroupDirectoryPath!.URLByAppendingPathComponent("database.sqlite")
Run Code Online (Sandbox Code Playgroud)
是否有一种解决方法可以从扩展键盘写入数据库,还是完全不可能?
数据库可以从模拟器写入,但不能与真实设备一起写入.我想这是因为MacOS X和iOS上的权限管理方式不同.
我正在向我现有的应用程序添加 Today Extension。我添加了一个应用程序组并使用这篇文章成功地将我的核心数据的数据迁移到了应用程序组的商店。我的应用程序同时使用 NSPersistentCloudKitContainer(当 iCloud 开启时)和一个 NSPersistentContainer(iCloud 关闭时)。虽然两个容器中的数据都成功迁移,但在使用 NSPersistentCloudKitContainer 时,我无法再在我的设备之间同步。在控制台中,我收到以下两个错误:
CoreData: 错误: CoreData+CloudKit: -[NSCloudKitMirroringDelegate _performSetupRequest:]_block_invoke(837): : 无法为商店设置 CloudKit 集成: (URL: file://path/name.sqlite)
错误域=NSCocoaErrorDomain 代码=134060 “发生核心数据错误。” UserInfo={NSLocalizedFailureReason=镜像委托无法初始化,因为它的存储已从协调器中删除。}
第一条错误消息的路径是切换到 App Groups 之前的 oldURL 的路径。所以我相信我只需要告诉 iCloud 不要尝试在该商店位置集成 CloudKit 并使用应用程序组的商店位置。
但我不知道如何做到这一点。任何人都可以帮忙吗?
核心数据代码:
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 …
Run Code Online (Sandbox Code Playgroud) xcode core-data swift ios-app-group nspersistentcloudkitcontainer
ios-app-group ×10
ios ×7
ios8 ×5
xcode ×3
objective-c ×2
swift ×2
core-data ×1
ios10 ×1
nspersistentcloudkitcontainer ×1
sqlite ×1
watchkit ×1