gpt4 book ai didi

ios - 将 iOS 8 文档保存到 iCloud Drive

转载 作者:技术小花猫 更新时间:2023-10-29 10:55:34 26 4
gpt4 key购买 nike

我想让我的应用程序将它创建的文档保存到 iCloud Drive,但我很难理解 Apple 所写的内容。到目前为止,这是我所拥有的,但我不确定从这里到哪里去。

更新 2

我的代码中有以下代码可以手动将文档保存到 iCloud Drive:

- (void)initializeiCloudAccessWithCompletion:(void (^)(BOOL available)) completion {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
self.ubiquityURL = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (self.ubiquityURL != nil) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"iCloud available at: %@", self.ubiquityURL);
completion(TRUE);
});
}
else {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"iCloud not available");
completion(FALSE);
});
}
});
}
if (buttonIndex == 4) {



[self initializeiCloudAccessWithCompletion:^(BOOL available) {

_iCloudAvailable = available;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:selectedCountry];

NSURL* url = [NSURL fileURLWithPath: pdfPath];


[self.manager setUbiquitous:YES itemAtURL:url destinationURL:self.ubiquityURL error:nil];


}];

}

我已经为 App ID 和 Xcode 本身设置了权利。我单击按钮保存到 iCloud Drive,没有弹出任何错误,应用程序没有崩溃,但我的 Mac 上没有任何内容显示在 iCloud Drive 中。该应用程序在我的 iPhone 6 Plus 上通过 Test Flight 使用 iOS 8.1.1 运行。

如果我在模拟器上运行它(我知道它不会工作,因为 iCloud Drive 不能与模拟器一起工作),我会收到崩溃错误:'NSInvalidArgumentException',原因:'*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: 尝试从 objects[3]' 中插入 nil 对象

最佳答案

嗯,你让我自己对这个问题产生了兴趣,因此我在这个问题上花了很多时间,但现在我已经开始工作了,我希望它也对你有帮助!

File on my Mac

要查看后台实际发生的情况,您可以查看 ~/Library/Mobile Documents/,因为这是文件最终将显示的文件夹。另一个非常酷的实用程序是 brctl,用于监视将文件存储到 iCloud 后 mac 上发生的情况。从终端窗口运行 brctl log --wait --shorten 以启动日志。

启用 iCloud 功能(选择 iCloud 文档)后,要做的第一件事是提供 iCloud Drive 支持信息 (Enabling iCloud Drive Support)。 在再次运行该应用程序之前,我还必须提高我的 bundle 版本;我花了一些时间来解决这个问题。将以下内容添加到您的 info.plist:

<key>NSUbiquitousContainers</key>
<dict>
<key>iCloud.YOUR_BUNDLE_IDENTIFIER</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
<key>NSUbiquitousContainerName</key>
<string>iCloudDriveDemo</string>
</dict>
</dict>

接下来是代码:

- (IBAction)btnStoreTapped:(id)sender {
// Let's get the root directory for storing the file on iCloud Drive
[self rootDirectoryForICloud:^(NSURL *ubiquityURL) {
NSLog(@"1. ubiquityURL = %@", ubiquityURL);
if (ubiquityURL) {

// We also need the 'local' URL to the file we want to store
NSURL *localURL = [self localPathForResource:@"demo" ofType:@"pdf"];
NSLog(@"2. localURL = %@", localURL);

// Now, append the local filename to the ubiquityURL
ubiquityURL = [ubiquityURL URLByAppendingPathComponent:localURL.lastPathComponent];
NSLog(@"3. ubiquityURL = %@", ubiquityURL);

// And finish up the 'store' action
NSError *error;
if (![[NSFileManager defaultManager] setUbiquitous:YES itemAtURL:localURL destinationURL:ubiquityURL error:&error]) {
NSLog(@"Error occurred: %@", error);
}
}
else {
NSLog(@"Could not retrieve a ubiquityURL");
}
}];
}

- (void)rootDirectoryForICloud:(void (^)(NSURL *))completionHandler {

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *rootDirectory = [[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]URLByAppendingPathComponent:@"Documents"];

if (rootDirectory) {
if (![[NSFileManager defaultManager] fileExistsAtPath:rootDirectory.path isDirectory:nil]) {
NSLog(@"Create directory");
[[NSFileManager defaultManager] createDirectoryAtURL:rootDirectory withIntermediateDirectories:YES attributes:nil error:nil];
}
}

dispatch_async(dispatch_get_main_queue(), ^{
completionHandler(rootDirectory);
});
});
}

- (NSURL *)localPathForResource:(NSString *)resource ofType:(NSString *)type {
NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *resourcePath = [[documentsDirectory stringByAppendingPathComponent:resource] stringByAppendingPathExtension:type];
return [NSURL fileURLWithPath:resourcePath];
}

我在 Documents 文件夹中存储了一个名为 demo.pdf 的文件,我将“上传”该文件。

我会强调一些部分:

URLForUbiquityContainerIdentifier: 提供了存放文件的根目录,如果你想让它们显示在你Mac上的de iCloud Drive中,那么你需要将它们存放在Documents文件夹中,所以这里我们将该文件夹添加到根目录:

NSURL *rootDirectory = [[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]URLByAppendingPathComponent:@"Documents"];

您还需要将文件名添加到 URL,这里我从 localURL 复制文件名(即 demo.pdf):

// Now, append the local filename to the ubiquityURL
ubiquityURL = [ubiquityURL URLByAppendingPathComponent:localURL.lastPathComponent];

基本上就是这样......

作为奖励,查看如何提供 NSError 指针以获取潜在的错误信息:

// And finish up the 'store' action
NSError *error;
if (![[NSFileManager defaultManager] setUbiquitous:YES itemAtURL:localURL destinationURL:ubiquityURL error:&error]) {
NSLog(@"Error occurred: %@", error);
}

关于ios - 将 iOS 8 文档保存到 iCloud Drive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27051437/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com