我有一个应用程序,我将把它放在Mac App Store中.我想为偏好同步添加iCloud支持,因此,我想分发以他们可以访问iCloud的方式签名的beta.
但是,我无法在Mac文档库中找到有关在App Store外部分发应用程序,使用分发密钥签名以及能够访问iCloud的任何内容.
到目前为止,我分发此类应用程序的尝试无法在测试人员的计算机上启动,控制台中的消息抱怨该应用程序具有iCloud权利.
是我可能的,或者我应该放弃iCloud支持?如果可能的话,我需要做些什么来制作可分发的,支持iCloud的版本?
编辑:要清楚,您可以将此问题中的"iCloud支持"替换为仅适用于App Store应用程序的任何其他功能.我提到它确定解决方案不是"只是将它分配给无符号".iCloud是我特定案例的目标; 我在询问一般过程.
在我的应用程序中,我必须存储核心数据数据库和音频文件,所以我解码将它们放在Documents目录中.为了防止它们备份,当我第一次启动应用程序时,我把这样的Do not BackUp标志
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self addSkipBackupAttributeToItemAtURL:[self applicationDocumentsDirectory]];
}
- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
if (&NSURLIsExcludedFromBackupKey == nil) { // iOS <= 5.0.1
const char* filePath = [[URL path] fileSystemRepresentation];
const char* attrName = "com.apple.MobileBackup";
u_int8_t attrValue = 1;
int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
return result == 0;
} else { // iOS >= 5.1
return [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:nil]; …Run Code Online (Sandbox Code Playgroud) 我有一个Mac和iOS应用程序,通过一个"鞋盒"文件使用iCloud共享数据.
大多数情况下,更改会以有效和迅速的方式正确同步.但是,每隔一段时间(特别是现在),我在一台设备上进行的更改只会坐在那里.
我在Mac上对共享数据文件进行了更改,数据已保存到磁盘.但是,我不知道系统是否未能将数据上传到iCloud,或者iOS设备未能检查新数据,但我正在弄乱我的拇指.

下面的5KB文件是应该更改的文件.无论我在Mac应用程序中做了多少更改,在测试过程中,iCloud都会暂时停止同步更改.如果我走了20分钟然后回来,它可能会再次启动.
此外:如果我在Xcode中运行Mac应用程序并密切关注同一文件,即使我对文件进行了更改并且可以确认磁盘上的文件(在Finder /终端中)实际上正在发生变化,iCloud面板也会在Xcode也不会很快得到这些变化:

请注意,我的Mac上的本地文件系统(9:01)上的相同5KB文件已更改,但iCloud只是没有提取它.此文件中存在实际内容更改,而不仅仅是修改日期更改.
所以,我想找到一种方法:
以编程方式触发同步,甚至使用Xcode.我知道可以使用模拟器触发iCloud同步,但这仅适用于在iOS上进行测试时,我更喜欢在实际硬件上进行测试.要么,
确定没有共享数据的人(或什么)"有过错".我从一开始就遵循iCloud文档,确保我使用协调写入来保存更改等.这只是一个非常间歇性的事情,iCloud会打瞌睡,并使测试非常令人沮丧.
如何在已使用本地存储核心数据的应用程序中启用iCloud核心数据?
我试图NSPersistentStoreUbiquitousContentNameKey在我的持久存储选项中使用.不幸的是,此选项启用iCloud但不会将任何本地数据传输到iCloud.我似乎migratePersistentStore:toURL:options:withType:error:无法上班.我提供持久性存储,URL,iCloud选项等,它仍然不会将现有的本地数据迁移到iCloud.这是我使用该方法的方式:
- (void)migratePersistentStoreWithOptions:(NSDictionary *)options {
NSError *error;
self.storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.sqlite", self.SQLiteFileName]];
NSPersistentStore *store = [self.persistentStoreCoordinator migratePersistentStore:self.persistentStoreCoordinator.persistentStores.firstObject toURL:self.storeURL options:options withType:NSSQLiteStoreType error:&error];
if (store) NSLog(@"[CoreData Manager] Store was successfully migrated");
else NSLog(@"[CoreData Manager] Error migrating persistent store: %@", error);
}
Run Code Online (Sandbox Code Playgroud)
本地存储与iCloud存储分开.如果可能的话,我想将本地Core Data移动到iCloud,而无需手动转移每个实体.
有任何想法吗?我可以找到很多关于从 iCloud 移回本地存储的文章,教程和帖子- 但我想从本地存储迁移到 iCloud.
我正在运行OS X Yosemite.我想将我的代码文件夹保存在iCloud Drive中,以便自动备份.我经常需要从终端访问文件,那么如何从终端访问iCloud Drive?
有没有办法检测启动是否来自iCloud备份?(恢复)
我看过这里,但没有任何关于它.
他们关于允许备份的规则是非常严格的(多次被拒绝)支持数据库,只有一个用户生成的更改 - 现在我必须将数据备份到其他地方并重新插入从备份恢复.
我想要实现的是当用户创建,更改或删除数据时,persistent store它将与之同步,iCloud store然后更新登录到同一iCloud帐户的其他设备.
我创建了一个Core Data Stack使用Objective-C资源并尝试在Swift中编写自己的资源,但是我在使用登录到同一个iCloud帐户的两个设备同步数据时遇到问题.
例如,当iDevice A登录到iCloud时,它会将数据备份到iCloud,但是当iDevice B登录到iCloud时,应用程序会删除持久存储上已有的任何数据以保存iCloud备份,并且不会出现商店设备之间的任何更改在另一方面,但似乎保存到iCloud商店作为最新的备份,所以如果应用程序被删除并重新安装我看到其他设备做的最新备份 - 考虑到这一点,如果iDevice B已经登录,它除非重新安装应用程序并且最后一次备份是由其他设备完成的,否则不会使用来自iDevice A的数据.
有人知道在Core data stack使用相同的iCloud帐户在两台设备之间同步数据时我出错了吗?
核心数据堆栈:
// MARK: - Core Data stack
// All the following code is in my appDelgate Core data stack
func observeCloudActions(persistentStoreCoordinator psc: NSPersistentStoreCoordinator?) {
// Register iCloud notifications observers for;
//Stores Will change
//Stores Did Change
//persistentStoreDidImportUbiquitousContentChanges
//mergeChanges
}
//Functions for notifications
func mergeChanges(notification: NSNotification) {
NSLog("mergeChanges notif:\(notification)") …Run Code Online (Sandbox Code Playgroud) 以下是来自Apple Docs的句子:"如果未配置iCloud,请询问用户是否要配置它(如果他们想要配置iCloud,最好将它们传输到启动设置)."
如何检查是否配置了iCloud以及如何启动iCloud的设置?
我有一个iCloud鞋盒应用程序的问题,希望有人可以帮助我(我花了很多时间徒劳地对抗它).
应用程序: - 一个简单的库样式应用程序 - 包含一组类别(Cat1 .. CatN),每个类别包含项目(Item1 ... ItemM).我使用Apple的iPhoneCoreDataRecipes来设置iCloud CoreData堆栈.
一切都与iCloud完美配合,除了 - 用户可以在第一次打开应用程序后开始使用一些预先填充的空类别(他当时也可以离线).这是魔鬼.
这是我的工作 - 一旦我的persistentStoreCoordinator设置我发送通知
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter]
postNotificationName: @"RefetchAllDatabaseData"
object: self
userInfo: nil];
});
Run Code Online (Sandbox Code Playgroud)
这是我的MasterViewController收到的.收到通知后,MasterViewController会检查存储中的类别数.如果可用类别的数量等于0 - 则插入预填充类别.
仅供参考 - 我使用NSMergeByPropertyObjectTrumpMergePolicy作为我的ManagedObjectContext
问题:这适用于第一台设备.但对于第二个设备,iCloud的默认类别通常比设置的persistentStoreCoordinator(以及第二个设备插入的默认类别)晚收到.最后,我在两个设备上都有两组具有相同名称的类别.
有什么想法可以解决这个问题吗?
尝试过的解决方案:我试过两种策略来解决这个问题.两者都以同样的方式开始.我打电话后
[moc mergeChangesFromContextDidSaveNotification: note];
Run Code Online (Sandbox Code Playgroud)
我打电话
[self materializeKeysWithUserInfo: note.userInfo forContext: moc];
Run Code Online (Sandbox Code Playgroud)
非常感谢来自https://devforums.apple.com/thread/126670?start=400&tstart=0的 Jose Ines Cantu Arrambide 的参考代码 - 实质上
materializeKeysWithUserInfo:forContext:
Run Code Online (Sandbox Code Playgroud)
从note.userInfo获取managedObjectIds,并从ManagedObjectContext中检索相应的对象,将它们放入字典中.
策略1:
这些策略甚至在它们出现在UI BUT之前就有效地消除了两个设备上的重复项
1)来自第一个设备的物品在第二个设备上丢失 - 当他们来到第二个设备时,他们的父类别不存在,他们的类别字段等于零,所以我不知道放在哪里.
2)在短时间内,由于冲突,第二台设备上丢失的物品也会在第一台设备上丢失.
3)源于第二设备的一些项目也因冲突而丢失.
我试图更喜欢较新的类别而不是更新,但它没有产生任何影响 …
在文档中,它表示即使用户没有使用正确的iCloud帐户登录,CloudKit公共数据库也可以读取.但是,如果我没有将我的iOS模拟器或设备连接到iCloud,我无法从我的云数据库中获取任何内容.当我激活我的iCloud帐户时,我可以从我的公共数据库中获取数据.如果有人对我有答案或同样的问题可以回答那会很好.谢谢.
CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:@"mycontainer"] publicCloudDatabase];
CKRecordID *recordID = [[CKRecordID alloc] initWithRecordName:@"idofmyrecord"] ;
[publicDatabase fetchRecordWithID:recordID completionHandler:^(CKRecord *fetchedRecord, NSError *error) {
if(!error){
NSLog(@"****Success***** %@",fetchedRecord[@"field1"]);
}else{
NSLog(@"****Failed***** %@",fetchedRecord[@"field2"]);
}
}];
Run Code Online (Sandbox Code Playgroud)