使用 iCloud 共享 plist 文件

2024-01-01

我有一个相对简单的应用程序,它将数据保存到位于文档文件夹中的 plist 文件中。数据在启动时加载到 UITableView 中。然后,用户可以编辑、删除或添加记录,任何更改都会保存回 plist 文件。

现在我想使用 iCloud 在设备之间共享此数据(plist 文件)。我查看了文档,我的理解是我需要创建一个 UIDocument 来“管理”plist 文件。

我看过几个 iCloud 教程,但是它们都在 UIDocument 类的属性中存储一个简单的字符串,而不是整个文件(如 plist)。

如何使用 UIDocument 对象将我的 plist 文件(或任何其他文件)共享到 iCloud?

我是否可以将 plist 文件内容转换为 NSData,然后将其保存在 UIDocument 的属性中?我应该使用 NsFileWrapper 代替吗?

我似乎很难理解 UIDocument/iCloud 的安排。我可能让事情变得比实际情况更复杂。


不确定是否有人仍然需要解决方案,但我找到了一个很好的方法来让它发挥作用。

由于 UIDocument 只接受 NSData 或 NSFilewrapper 形式的数据,因此我首先为 NSDictionary 类创建一个类别,该类从 NSData 返回 NSDictionary。这是该类别的两个文件:

NSDictionary+DictFromData.h:

#import <Foundation/Foundation.h>

@interface NSDictionary (DictFromData)
+ (id)dictionaryWithData:(NSData *)data;
- (id)initWithData:(NSData *)data;
@end

和 NSDictionary+DictFromData.m

#import "NSDictionary+DictFromData.h"
@implementation NSDictionary (DictFromData)

+ (id)dictionaryWithData:(NSData *)data {
    return [[[NSDictionary alloc] initWithData:data] autorelease];
}

- (id)initWithData:(NSData *)data {
    NSString *tmp = nil;

    self = (NSDictionary *)[NSPropertyListSerialization
                            propertyListFromData:data
                            mutabilityOption:NSPropertyListImmutable
                            format:NULL
                            errorDescription:&tmp];

    NSAssert1(tmp == nil,@"Error in plist: %@",tmp);
    return [self retain];
}
@end

(source http://ck.kennt-wayne.de/2009/apr/nsdictionary-aus-nsdata)

如果您现在将此类别导入 UIDocument 子类中,则可以轻松加载 Plist 文件并将其保存到 iCloud 容器中。

要从 iCloud 加载 Plist,请将其添加到 UIDocument 子类中(属性内容是 NSDictionary):

- (BOOL)loadFromContents:(id)contents
                  ofType:(NSString *)
        typeName error:(NSError **)outError {

    if ([contents length] > 0){
        self.contents = [NSDictionary dictionaryWithData:contents];
    } else {
        self.contents = nil;
    }

    // call some Methods to handle the incoming NSDictionary 
    // maybe overwrite the old Plist file with the new NSDictionary

    return YES;
}

要将数据保存回 iCloud,请添加以下内容:

- (id)contentsForType:(NSString *)typeName error:(NSError **)outError {
    NSData * plistData = [[[NSData alloc]initWithContentsOfFile:YOUR_PLIST_FILE]autorelease];
    return plistData;
}

如果您现在致电:

[myUIDocument updateChangeCount:UIDocumentChangeDone];

YOUR_PLIST_FILE 正在同步。请记住,您的 iCloud 容器更新大约需要 10-15 秒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 iCloud 共享 plist 文件 的相关文章

  • org.hibernate.HibernateException:如果没有活动事务,保存无效

    我正在创造JSF应用程序并在其中使用一些休眠功能 我想做的就是将实体保存到数据库中 但我不断收到此异常 org hibernate HibernateException save is not valid without active tr
  • 如何配置 persistence.xml 提供者标签

    嘿 我正在学习这些东西 我并没有真正理解所有内容 而且我有一个问题 我不知道在 persistence xml 的提供者标签中写什么 这是我的 persistence xml 和 pom xml 文件 pom xml
  • 处理应用程序:openURL:sourceApplication:在iOS应用程序中打开文件

    我有一个应用程序 它使用一些已知的大文件格式 并且自 iOS4 时代起就支持 iOS 的 打开方式 功能 直到最近 某些应用程序 例如 iOS 内置的邮件应用程序 都运行良好 可以通过在我的应用程序内的 Documents Inbox 目录
  • 从 iCloud 下载 iPhone 备份

    有谁知道如何以编程方式从 iCloud 下载 iPhone iPad 备份 None
  • 当涉及多个设备时,核心数据 iCloud 迁移会“丢失”数据

    我最近在更新我的应用程序时遇到了一些重大问题 许多用户抱怨迁移到最新版本后数据丢失 几个小时后 我仍然不确定发生了什么 但我有一个理论想要证实 苹果在文档中说 迁移和 iCloud 对于与给定 NSPersistentStoreUbiqui
  • NSMetadataQuery 未完成收集(无通知)

    我正在为我的应用程序制作一个备份管理器 通过 iCloud 我做了一些测试 基本原理有效 但几天后就停了 我在用着NSMetadataQuery用于搜索备份文件是否存在 我的备份文件名为例如Backup29112011154133 xml其
  • OpenJPA 2.1.1 - 找不到元素“persistence”的声明

    我刚刚下载了http www apache org dyn closer cgi openejb 4 0 0 beta 1 apache tomee 1 0 0 beta 1 webprofile zip http www apache o
  • 首次启动时无法识别 iCloud 键值存储

    我的应用程序使用 iCloud 键值存储 在多个设备之间同步唯一 ID 在应用程序首次启动时 如果它确实必须工作 那么就可以接受 看起来设备在首次启动时还不熟悉 iCloud 的值 只有在应用程序安装并运行一段时间后才熟悉 我在应用程序主视
  • 为什么Python的shelf要求所有键都是字符串?

    有据可查 Python 的 shelve 模块要求所有键都是字符串 并且有各种解决方法 请参阅线程here https stackoverflow com questions 4013452 how do i take integer ke
  • 从字典和数组的 plist 中读取/写入数据,并将不同级别加载到 TableView 中

    我对使用属性列表有点困惑 我已经阅读了有关该主题的大多数其他问题 但我仍然很困惑 因为它们只进入一层 因此任何帮助将不胜感激 我想加载一个存储数据的plist 如下所示 我的故事板中有三个视图控制器 两个 TableView 控制器和一个空
  • 在 Hibernate 中禁用延迟加载

    如何在 Hibernate 中禁用延迟加载 我使用的是持久性注释 而不是 hbm xml 文件 我正在按 ID 获取单个对象 并希望加载所有属性 在我使用该对象之前会话已关闭 Thanks 您需要使用 FetchType EAGER 注释您
  • NSUserDefaults 和 Lion 下的沙箱

    根据 Apple 的要求 将我的项目之一移至支持沙箱 我像这样使用 UserDefaults NSUserDefaults standardUserDefaults setObject myNumber forKey myNumberKey
  • c#.NET USB设备持久标识符

    我正在寻找一种在 C 中为 USB 插槽 更具体地说是 SD 卡读卡器 提供持久标识符 在最终用户拔下集线器 重新启动计算机时 的方法 驱动器号并不总是分配给同一个插槽 但我需要一种方法来物理识别插槽 A 一旦我能够识别它 我就可以连接到驱
  • 没有名为 EntityManager 的持久性提供程序

    我有我的persistence xml使用相同的名称TopLink在下面META INF目录 然后 我的代码使用以下方式调用它 EntityManagerFactory emfdb Persistence createEntityManag
  • React Context API - 在页面刷新时保留数据

    假设我们设置了一个上下文提供程序以及一些初始数据属性值 在此过程中 假设消费者随后修改了这些属性 页面重新加载时 这些更改将丢失 保存数据以便我们可以保留这些数据修改的最佳方法是什么 除了本地存储之外还有其他方法吗 是的 如果您希望数据在重
  • SugarORM 中的持久化对象

    我有一个图书课 public class Book extends SugarRecord private String mBookName private String mAuthorName private List
  • UIImagePickerController 和 iCloud 照片

    切换到 iCloud Photo 后 似乎 UIImagePickerController 返回的一些图像非常模糊 看起来该图像是从 iCloud 照片中获取的 我是否能够检索原始图像 或过滤掉 iCloud 照片图像 或者我是否必须切换到
  • 具有持久性无知对象的持久性和领域事件

    我一直在研究领域驱动设计领域事件 http www udidahan com 2009 06 14 domain events salvation 我真的很喜欢这些事件提供的关注点分离 我遇到了保留域对象和引发域事件的顺序问题 我想在域对象
  • 如何为 Weblogic 10.3.6 启用 Java 持久性 2.0

    我正在使用 eclipse 和 weblogic 服务器 为了将项目添加到 weblogic 服务器 它需要支持 Java Persistance 2 0 但是当尝试安装它时 我不断收到此消息 在 Weblogic Server 安装中启用
  • DDD:持久聚合

    让我们考虑一下典型的Order and 订单项目例子 假如说订单项目是的一部分Order聚合 只能通过订单添加 所以 要添加一个新的订单项目 to an Order 我们必须通过存储库加载整个聚合 将新项目添加到Order对象并再次保留整个

随机推荐

  • 如何限制应用程序可以分配的内存

    我需要一种方法来限制服务可以分配的内存量 以防止服务导致系统饥饿 类似于 SQL Server 允许您设置 最大服务器内存 的方式 我知道 SetProcessWorkingSetSize 并不完全符合我的要求 但我试图让它按照我认为应该的
  • 启动应用程序时 Py2App PIL 图像错误

    我正在使用 py2app 将 python 文件转换为应用程序 但遇到了此错误 Traceback most recent call last File Users MYUSER PycharmProjects webstuff BotTe
  • 从大表达式中提取与模式匹配的表达式

    我有一个包含单个平方根的 Mathematica 表达式 示意性地 expr a b Sqrt c where a b c是大表达式 我想提取 sqrt 下的表达式 例如通过匹配模式 例如 Match expr Sqrt x should
  • 如何在 Liferay 中检索用户个人资料图片

    我想检索用户个人资料图片 我该怎么做 您能分享一下代码片段吗 我使用 Liferay 6 0 6 它只有 user getPortraitId 而没有 user getPortraitURL 那么一旦我在 JAVA 类中获得了肖像 id 我
  • Modaldialog 对 Enter/ESC 没有反应

    I have a modaldialog with an OK and a Cancel button For the OK I set the Default property to True and for the Cancel but
  • 如何在Java中使用keystore来存储私钥?

    我用过KeyPairGenerator生成 RSA 密钥对 如果我没记错的话 KeyStore 仅用于存储证书而不是密钥 如何在电脑上正确存储私钥 注意 此代码仅用于演示目的 将私钥存储在磁盘上时必须对其进行加密 不要按原样使用它 你可以这
  • 时间:2019-05-17 标签:c#MainWindowHandlealwayszero

    我读了一些关于 MainWindowHandle 的线程 但我找不到问题的解决方案 我正在启动一个 gui 应用程序 并希望通过进程对象获取 MainWindowHandle 但如果我不打算 则句柄值始终为零等待 thread sleep
  • 自动或使用快捷方式删除尾随空格

    有没有办法删除 Visual Studio Code 中的尾随空格 自动或使用快捷方式 我一直在命令选项板和编辑器设置中寻找此内容 但找不到我要找的内容 您可以启用空白修剪文件保存时间从设置 打开 Visual Studio Code 用户
  • zone.js 和 Jasmine 时钟之间的冲突

    我正在使用 Jasmine 测试套件 其中包括 普通 Jasmine 测试以及一些 Angular 2 组件的 Jasmine 测试 由于 Angular 2 的包含 zone js 被加载 这与 Jasmine 的时钟产生了冲突 例如 以
  • 为什么不在构造函数中调用可重写的方法?

    这是一个过于简化的示例 但我有一些现实生活中的代码在概念上执行相同的操作 尝试验证派生类的值 设置 访问器方法 并且分析器给我 不要在构造函数中调用可重写的方法 我试图弄清楚是否应该更改代码 或者忽略警告 我想不出有什么理由应该留意这个警告
  • 前向声明 cv::Mat

    您好 我正在尝试转发声明 cv Mat 类 但我无法让它工作 它给出了消息字段 frame 的类型不完整 OpenGlImpl h namespace cv class Mat class OpenGLImpl private cv Mat
  • 删除所有构造函数(或其他函数)的最佳样式?

    假设我想创建一个无法构造的类型 不要问为什么 struct Impossible 我可以这样做 Impossible delete disable automatically generated constructors don t dec
  • 如何获取Vim中所有环境变量的列表?

    当 Vim 启动时 它会从操作系统获取许多环境变量 例如PATH 并且它还设置了自己的环境变量 例如MYVIMRC 我如何list或者查看 Vim 理解的所有环境变量 以及 Vim 内部它们各自的值 在 Vimscript 中 没有直接的方
  • Firebase 身份验证/未经授权的域。域名未授权

    我正在尝试运行这个sample https github com firebase functions samples tree master quickstarts email usersfirebase 项目 但我不断在浏览器控制台中收
  • Jquery.inputmask 不工作

    尝试使用 Robin Herbots Inputmask 模块 但无法使其工作 查看所有其他类似的帖子 一个常见问题是确保 docment ready 函数调用 inputmask 但这对我来说看起来很好 Scripts
  • 将 CDN url 添加到 mvc 4 捆绑器输出

    使用内置的 MVC4 捆绑器 如何将我的 CDN url 添加到它生成的链接标签中 我已经设置了 Amazon Cloudfront 以便它在第一次请求时从我的网络服务器中提取资产 所以当我像这样定义一个包时 bundles Add new
  • 本地运行 jekyll 时出错(rvm gemset 问题)

    我通过 RVM 安装了 ruby 1 9 3 现在想要获取 rekyll gem 以便我可以在本地测试我的博客 当我gem install jekyll它安装正常 但是当我尝试运行时jekyll server我收到错误 Users matt
  • 指向具有多个对象的成员函数的指针向量 C++

    考虑以下代码 class A public void aFoo class B public void bFoo class C public void c1Foo void c2Foo 无论代码架构如何 是否可以创建指向成员函数的指针向量
  • Azure DevOps 中的代理作业和部署组作业有什么区别?

    Azure DevOps 中的代理作业和部署组作业有什么区别 创建其中之一的原因是什么 代理作业和部署组之间有什么区别 在 Azure DevOps 工作 代理工作 运行步骤在代理上其中在一个 部署组作业 Run 在机器上 in a 部署组
  • 使用 iCloud 共享 plist 文件

    我有一个相对简单的应用程序 它将数据保存到位于文档文件夹中的 plist 文件中 数据在启动时加载到 UITableView 中 然后 用户可以编辑 删除或添加记录 任何更改都会保存回 plist 文件 现在我想使用 iCloud 在设备之