Thông tin cơ bản về iCloud và mẫu mã [đã đóng]


85

Là một người mới bắt đầu, tôi đang gặp khó khăn với iCloud. Có một số mẫu, nhưng chúng thường khá chi tiết (trên diễn đàn nhà phát triển có một mẫu dành cho iCloud và CoreData rất lớn). Các tài liệu của apple thì OK, nhưng mình vẫn không thấy được hình ảnh lớn. Vì vậy, hãy nhớ với tôi, một số câu hỏi trong số này khá cơ bản, nhưng có thể dễ trả lời.

Bối cảnh: Tôi có một ứng dụng iCloud rất đơn giản đang chạy (mã mẫu đầy đủ bên dưới). Chỉ có một UITextView được hiển thị cho người dùng và thông tin đầu vào của họ được lưu trong một tệp có tên là text.txt.

nhập mô tả hình ảnh ở đây

Txt được đẩy lên đám mây và có sẵn cho tất cả các thiết bị. Hoạt động hoàn hảo, nhưng:

Vấn đề chính: Còn những người dùng không sử dụng iCloud thì sao?

Khi khởi chạy ứng dụng của mình (xem mã bên dưới), tôi kiểm tra xem người dùng đã bật iCloud chưa. Nếu iCloud được kích hoạt, mọi thứ đều ổn. Ứng dụng tiếp tục và tìm kiếm text.txt trên đám mây. Nếu được tìm thấy, nó sẽ tải nó và hiển thị cho người dùng. Nếu text.txt không được tìm thấy trong đám mây, nó sẽ chỉ cần tạo một text.txt mới và sẽ hiển thị điều đó cho người dùng.

Nếu người dùng chưa kích hoạt iCloud thì sẽ không có gì xảy ra. Tôi sẽ làm cách nào để người dùng không sử dụng iCloud vẫn có thể làm việc với ứng dụng văn bản của tôi? Hay tôi chỉ đơn giản là phớt lờ chúng? Tôi có cần viết các chức năng riêng biệt cho người dùng không sử dụng iCloud không? Tức là các chức năng trong đó tôi chỉ cần tải một text.txt từ thư mục tài liệu?

Apple viết :

Xử lý các tệp trong iCloud giống như cách bạn xử lý tất cả các tệp khác trong hộp cát ứng dụng của mình.

Tuy nhiên, trong trường hợp của tôi, không có hộp cát ứng dụng 'bình thường' nữa. Nó ở trên đám mây. Hay tôi luôn tải text.txt của mình từ đĩa trước và sau đó kiểm tra với iCloud nếu có thứ gì đó cập nhật hơn?

Sự cố liên quan: Cấu trúc tệp - Sandbox vs. Cloud

Có lẽ vấn đề chính của tôi là sự hiểu lầm cơ bản về cách thức hoạt động của iCloud. Khi tôi tạo một phiên bản mới của UIDocument, tôi sẽ phải ghi đè hai phương thức. Đầu tiên - (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outErrorđể tải tệp từ đám mây và sau đó -(id)contentsForType:(NSString *)typeName error:(NSError **)outErrorlà tải tệp vào đám mây.

Tôi có phải kết hợp các chức năng riêng biệt cũng sẽ lưu bản sao cục bộ của text.txt vào hộp cát của tôi không? Điều này sẽ hoạt động đối với người dùng không sử dụng iCloud? Theo tôi hiểu iCloud, nó sẽ tự động lưu một bản sao cục bộ của text.txt. Vì vậy, tôi không cần thiết phải lưu bất kỳ thứ gì vào hộp cát 'cũ' của ứng dụng của mình (tức là nó đã từng ở trong những ngày cũ, trước iCloud). Hiện tại, hộp cát của tôi hoàn toàn trống, nhưng tôi không biết điều này có chính xác không. Tôi có nên giữ một bản sao khác của text.txt trong đó không? Điều này giống như làm lộn xộn cấu trúc dữ liệu của tôi ... vì có một text.txt trên đám mây, một trong hộp cát iCloud trên thiết bị của tôi (sẽ hoạt động ngay cả khi tôi ngoại tuyến) và một tệp thứ ba trong hộp cát cũ tốt của ứng dụng của tôi...


MÃ CỦA TÔI: Một mã mẫu iCloud đơn giản

Điều này dựa trên một ví dụ tôi tìm thấy trong diễn đàn nhà phát triển và trên video phiên WWDC. Tôi tước nó xuống mức tối thiểu trần. Tôi không chắc rằng cấu trúc MVC của tôi là tốt. Mô hình trong AppDelegate không phải là lý tưởng. Mọi đề xuất để làm cho nó tốt hơn đều được hoan nghênh.


CHỈNH SỬA: Tôi đã cố gắng trích xuất câu hỏi chính và đăng nó [tại đây]. 4


TỔNG QUAT:

Tổng quat

Bit quan trọng nhất tải text.txt từ đám mây:

//  AppDelegate.h
//  iCloudText

#import <UIKit/UIKit.h>

@class ViewController;
@class MyTextDocument;

@interface AppDelegate : UIResponder <UIApplicationDelegate> {
    NSMetadataQuery *_query;
}

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *viewController;
@property (strong, nonatomic) MyTextDocument *document;

@end

//  AppDelegate.m
//  iCloudText

#import "AppDelegate.h"
#import "MyTextDocument.h"
#import "ViewController.h"

@implementation AppDelegate

@synthesize window = _window;
@synthesize viewController = _viewController;
@synthesize document = _document;

- (void)dealloc
{
    [_window release];
    [_viewController release];
    [super dealloc];
}

- (void)loadData:(NSMetadataQuery *)query {

    // (4) iCloud: the heart of the load mechanism: if texts was found, open it and put it into _document; if not create it an then put it into _document

    if ([query resultCount] == 1) {
        // found the file in iCloud
        NSMetadataItem *item = [query resultAtIndex:0];
        NSURL *url = [item valueForAttribute:NSMetadataItemURLKey];

        MyTextDocument *doc = [[MyTextDocument alloc] initWithFileURL:url];
        //_document = doc;
        doc.delegate = self.viewController;
        self.viewController.document = doc;

        [doc openWithCompletionHandler:^(BOOL success) {
            if (success) {
                NSLog(@"AppDelegate: existing document opened from iCloud");
            } else {
                NSLog(@"AppDelegate: existing document failed to open from iCloud");
            }
        }];
    } else {
        // Nothing in iCloud: create a container for file and give it URL
        NSLog(@"AppDelegate: ocument not found in iCloud.");

        NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
        NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:@"text.txt"];

        MyTextDocument *doc = [[MyTextDocument alloc] initWithFileURL:ubiquitousPackage];
        //_document = doc;
        doc.delegate = self.viewController;
        self.viewController.document = doc;

        [doc saveToURL:[doc fileURL] forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            NSLog(@"AppDelegate: new document save to iCloud");
            [doc openWithCompletionHandler:^(BOOL success) {
                NSLog(@"AppDelegate: new document opened from iCloud");
            }];
        }];
    }
}

- (void)queryDidFinishGathering:(NSNotification *)notification {

    // (3) if Query is finished, this will send the result (i.e. either it found our text.dat or it didn't) to the next function

    NSMetadataQuery *query = [notification object];
    [query disableUpdates];
    [query stopQuery];

    [self loadData:query];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSMetadataQueryDidFinishGatheringNotification object:query];
    _query = nil; // we're done with it
}

-(void)loadDocument {

    // (2) iCloud query: Looks if there exists a file called text.txt in the cloud

    NSMetadataQuery *query = [[NSMetadataQuery alloc] init];
    _query = query;
    //SCOPE
    [query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]];
    //PREDICATE
    NSPredicate *pred = [NSPredicate predicateWithFormat: @"%K == %@", NSMetadataItemFSNameKey, @"text.txt"];
    [query setPredicate:pred];
    //FINISHED?
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query];
    [query startQuery];

}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"AppDelegate: app did finish launching");
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease];
    } else {
        self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil] autorelease];
    }

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    // (1) iCloud: init

    NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
    if (ubiq) {
        NSLog(@"AppDelegate: iCloud access!");
        [self loadDocument];
    } else {
        NSLog(@"AppDelegate: No iCloud access (either you are using simulator or, if you are on your phone, you should check settings");
    }


    return YES;
}

@end

UIDocument

//  MyTextDocument.h
//  iCloudText

#import <Foundation/Foundation.h>
#import "ViewController.h"

@interface MyTextDocument : UIDocument {

    NSString *documentText;
    id delegate;

}

@property (nonatomic, retain) NSString *documentText;
@property (nonatomic, assign) id delegate;

@end

//  MyTextDocument.m
//  iCloudText

#import "MyTextDocument.h"
#import "ViewController.h"

@implementation MyTextDocument

@synthesize documentText = _text;
@synthesize delegate = _delegate;

// ** READING **

- (BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError
{
    NSLog(@"UIDocument: loadFromContents: state = %d, typeName=%@", self.documentState, typeName);

    if ([contents length] > 0) {
        self.documentText = [[NSString alloc] initWithBytes:[contents bytes] length:[contents length] encoding:NSUTF8StringEncoding];
    }
    else {
        self.documentText = @"";
    }

    NSLog(@"UIDocument: Loaded the following text from the cloud: %@", self.documentText);


    // update textView in delegate...
    if ([_delegate respondsToSelector:@selector(noteDocumentContentsUpdated:)]) {
        [_delegate noteDocumentContentsUpdated:self];
    }

    return YES;

}

// ** WRITING **

-(id)contentsForType:(NSString *)typeName error:(NSError **)outError
{
    if ([self.documentText length] == 0) {
        self.documentText = @"New Note";
    }

    NSLog(@"UIDocument: Will save the following text in the cloud: %@", self.documentText);

    return [NSData dataWithBytes:[self.documentText UTF8String] length:[self.documentText length]];
}
@end

NGƯỜI ĐĂNG KÝ XEM

//
//  ViewController.h
//  iCloudText

#import <UIKit/UIKit.h>

@class MyTextDocument;

@interface ViewController : UIViewController <UITextViewDelegate> {

    IBOutlet UITextView *textView;

}

@property (nonatomic, retain) UITextView *textView;
@property (strong, nonatomic) MyTextDocument *document;

-(void)noteDocumentContentsUpdated:(MyTextDocument *)noteDocument;

@end

//  ViewController.m
//  iCloudText

#import "ViewController.h"
#import "MyTextDocument.h"

@implementation ViewController

@synthesize textView = _textView;
@synthesize document = _document;

-(IBAction)dismissKeyboard:(id)sender {

    [_textView resignFirstResponder];

}

-(void)noteDocumentContentsUpdated:(MyTextDocument *)noteDocument
{
    NSLog(@"VC: noteDocumentsUpdated");
    _textView.text = noteDocument.documentText;
}

-(void)textViewDidChange:(UITextView *)theTextView {

     NSLog(@"VC: textViewDidChange");
    _document.documentText = theTextView.text;
    [_document updateChangeCount:UIDocumentChangeDone];

}

4
Tôi thực sự khuyên bạn nên chia điều này thành một vài câu hỏi. Tôi thấy một số câu hỏi khác nhau được chôn giấu ở đây và rất khó để chọn chúng trong tường văn bản bạn có ở đây. Tôi muốn hoàn nguyên câu hỏi này để chỉ hỏi về những việc cần làm đối với những người chưa bật iCloud và chia những người khác (chỉ với các phần liên quan của mã mẫu của bạn) thành các câu hỏi riêng biệt. Chúng là những câu hỏi hay, nhưng tôi nghĩ chúng nên được tách ra.
Brad Larson

@BradLarson Cảm ơn bình luận của bạn. Tôi xin lỗi nếu (các) câu hỏi hơi lộn xộn với nhau, nhưng tôi nghĩ câu hỏi chính (như tôi đã cố gắng chỉ ra) là vấn đề hộp cát ứng dụng so với hộp cát iCloud. Tôi đã cung cấp mã đầy đủ (là ví dụ mã iCloud ngắn nhất, btw) vì tôi nghĩ rằng ngữ cảnh TOÀN BỘ là rất quan trọng để biết điều gì đang xảy ra ... Nhưng tôi có thể chỉ mở một câu hỏi khác và liên kết lại câu hỏi này với có được bức tranh lớn hơn.
n.evermind

@BradLarson OK, tôi đã mở một câu hỏi mới ở đây: stackoverflow.com/questions/7798555/…
n.evermind

Đối với những người vẫn đang cố gắng để có được một ngày xử lý Core Data và iCloud thử liên kết này ossh.com.au/design-and-technology/software-development/...
Duncan Groenewald

Không cần phải đóng cửa này thực sự là một trong những bài viết mang tính xây dựng hơn mà tôi đã nhìn thấy trên iCloud ..
Andrew Smith

Câu trả lời:


22

Tôi vừa đọc lại tài liệu và có vẻ như cách tiếp cận chung của tôi là sai. Trước tiên, tôi nên tạo tệp trong hộp cát và sau đó di chuyển tệp đó lên đám mây. Nói cách khác, Apple dường như gợi ý rằng tôi nên có ba phiên bản của cùng một tệp mọi lúc: một trong thư mục ứng dụng của tôi, một trong thư mục quỷ iCloud trên thiết bị của tôi (cũng có thể truy cập nếu ngoại tuyến) và một trong đám mây:

Các ứng dụng sử dụng các công nghệ tương tự để quản lý tệp và thư mục trong iCloud mà chúng thực hiện đối với tệp và thư mục cục bộ. Tệp và thư mục trong iCloud vẫn chỉ là tệp và thư mục. Bạn có thể mở chúng, tạo chúng, di chuyển chúng, sao chép chúng, đọc và ghi từ chúng, xóa chúng hoặc bất kỳ thao tác nào khác mà bạn có thể muốn thực hiện. Sự khác biệt duy nhất giữa tệp và thư mục cục bộ và tệp và thư mục iCloud là URL bạn sử dụng để truy cập chúng. Thay vì URL có liên quan đến hộp cát của ứng dụng của bạn, URL cho các tệp và thư mục iCloud có liên quan đến thư mục chứa iCloud tương ứng.

Để di chuyển một tệp hoặc thư mục vào iCloud:

Tạo tệp hoặc thư mục cục bộ trong hộp cát ứng dụng của bạn. Trong khi sử dụng, tệp hoặc thư mục phải được quản lý bởi người trình bày tệp, chẳng hạn như đối tượng UIDocument.

Sử dụng phương thức URLForUbiquityContainerIdentifier: để truy xuất URL cho thư mục vùng chứa iCloud mà bạn muốn lưu trữ mục. Sử dụng URL thư mục vùng chứa để tạo một URL mới chỉ định vị trí của mục trong iCloud. Gọi setUbiquitous: itemAtURL: destinationURL: error: phương thức của NSFileManager để di chuyển mục đó vào iCloud. Không bao giờ gọi phương thức này từ chuỗi chính của ứng dụng của bạn; làm như vậy có thể chặn chuỗi chính của bạn trong một khoảng thời gian dài hoặc gây ra bế tắc với một trong những trình trình bày tệp của chính ứng dụng của bạn. Khi bạn di chuyển một tệp hoặc thư mục sang iCloud, hệ thống sẽ sao chép mục đó ra khỏi hộp cát ứng dụng của bạn và vào một thư mục cục bộ riêng để có thể giám sát nó bởi daemon iCloud. Mặc dù tệp không còn trong hộp cát của bạn, ứng dụng của bạn vẫn có toàn quyền truy cập vào tệp đó. Mặc dù bản sao của tệp vẫn còn cục bộ trên thiết bị hiện tại, tệp cũng được gửi tới iCloud để có thể phân phối cho các thiết bị khác. Daemon iCloud xử lý tất cả các công việc đảm bảo rằng các bản sao cục bộ đều giống nhau. Vì vậy, từ góc độ ứng dụng của bạn, tệp chỉ nằm trong iCloud.

Tất cả các thay đổi bạn thực hiện đối với tệp hoặc thư mục trong iCloud phải được thực hiện bằng đối tượng điều phối tệp. Những thay đổi này bao gồm di chuyển, xóa, sao chép hoặc đổi tên mục. Người điều phối tệp đảm bảo rằng daemon iCloud không thay đổi tệp hoặc thư mục đồng thời và đảm bảo rằng các bên quan tâm khác được thông báo về những thay đổi bạn thực hiện.

Tuy nhiên, nếu bạn tìm hiểu sâu hơn một chút về các tài liệu liên quan đến setUbiquitous, bạn sẽ thấy:

Sử dụng phương pháp này để di chuyển tệp từ vị trí hiện tại của nó sang iCloud. Đối với các tệp nằm trong hộp cát của ứng dụng, điều này liên quan đến việc xóa tệp khỏi thư mục hộp cát . (Hệ thống mở rộng đặc quyền hộp cát của ứng dụng của bạn để cấp cho ứng dụng quyền truy cập vào các tệp mà ứng dụng di chuyển sang iCloud.) Bạn cũng có thể sử dụng phương pháp này để di chuyển tệp ra khỏi iCloud và quay lại thư mục cục bộ.

Vì vậy, điều này có nghĩa là một tệp / thư mục bị xóa tạo thành hộp cát cục bộ và được chuyển vào đám mây.


1
liên kết url bị hỏng ...
NGB

5

Tôi đã sử dụng ví dụ của bạn và tôi thích nó vì đã giúp tôi nắm được những điều cơ bản về iCloud. Bây giờ tôi đang băn khoăn với câu hỏi của bạn cho ứng dụng của riêng tôi, ứng dụng này phải hỗ trợ những người dùng hiện tại của ứng dụng có nội dung được lưu trữ cục bộ, những người có thể hoặc có thể không sử dụng iCloud tạo ra những trường hợp này theo như tôi có thể nói:

Các trường hợp:

  1. Người dùng mới
    • có icloud - tạo tài liệu trong icloud
    • không có icloud - tạo tài liệu cục bộ
  2. Người dùng hiện tại
    • có icloud
      • vừa được thêm vào - di chuyển tài liệu cục bộ sang icloud
      • không chỉ được thêm vào - mở / lưu tài liệu vào icloud
    • không có icloud
      • vừa bị xóa - di chuyển tài liệu icloud cũ sang cục bộ
      • không chỉ bị xóa - mở / lưu tài liệu vào cục bộ

Nếu ai đó xóa iCloud - các cuộc gọi đến URL phổ biến sẽ không trả về con số không? Nếu đúng như vậy, làm cách nào để di chuyển tài liệu trở lại bộ nhớ cục bộ? Tôi sẽ tạo một pref người dùng ngay bây giờ nhưng có vẻ như một chút giải pháp.

Tôi cảm thấy như tôi đang thiếu một cái gì đó rõ ràng ở đây nên nếu ai có thể nhìn thấy nó, vui lòng gọi điện cho tôi.


Tôi nên nói thêm rằng tôi đang tự hỏi liệu có lớp nào xử lý những trường hợp này không nên tôi chỉ sử dụng nó và không phải lo lắng về nơi lưu nó.
seekhavian

Hãy xem developer.apple.com/library/ios/#documentation/DataManagement/… cung cấp một số mã mẫu để xác định xem nên đặt thứ gì đó vào hộp cát cục bộ hay đám mây.
n.evermind

Cảm ơn vì điều đó. Tôi đã xem tài liệu đó nhưng trước đó trong nhiệm vụ iCloud của mình nên tôi đã quên mã mà nó cung cấp. Tôi sẽ cố gắng điều chỉnh mẫu của bạn để hỗ trợ địa phương và vùng sâu vùng xa. Tôi vẫn chưa rõ cách chúng tôi xử lý người dùng vô hiệu hóa iCloud vì chúng tôi mất URL phổ biến nhưng tôi sẽ có bản crack và chia sẻ bản cập nhật.
kiếm được từ

1
Vì vậy, theo một cách nào đó, hơi ngu ngốc khi chúng ta phải sử dụng URL cho đám mây và PATH cho hộp cát cục bộ. Sẽ thật tuyệt nếu iCloud có thể xử lý mọi thứ cho chúng ta ... nhưng theo cách này, về cơ bản chúng ta cần mã hai phương thức khác nhau cho mỗi tệp chúng ta mở.
n.evermind

Tôi vừa đọc lại bài viết của bạn. Bây giờ tôi đang lưu tùy chọn của người dùng (tức là người dùng muốn / không muốn sử dụng iCloud) trong NSUserDefaults. Đây cũng là những gì Apple đề xuất. Tôi luôn kiểm tra xem iCloud có thể truy cập được không. Nếu không thể truy cập được, tôi yêu cầu người dùng bật nó lên - nhưng chỉ khi họ không nói rõ với ứng dụng rằng họ không muốn sử dụng nó. Nếu không, nó sẽ gây khó chịu cho những người không muốn sử dụng iCloud. Khi tôi đã xác định xem iCloud có được bật hay không, tôi sẽ đi theo đường dẫn URL phổ biến và sử dụng UIDocument HOẶC sẽ chỉ cần mở tệp từ hộp cát như ngày xưa.
n.evermind

4

Nếu bạn muốn người dùng có thể chia sẻ văn bản giữa các thiết bị chạy trước iOS 5.0, bạn sẽ phải làm những gì mọi người phải làm trước iCloud và di chuyển thông tin đến máy chủ của riêng bạn.

Tất cả những gì bạn thực sự cần là một máy chủ ở đâu đó cho phép ứng dụng của bạn lưu các tệp văn bản và liên kết chúng với tài khoản người dùng.

Bạn sẽ cần người dùng tạo tài khoản và bạn sẽ cần tự quản lý quá trình di chuyển thông tin mới trên một thiết bị vào 'đám mây' của riêng bạn.

Người dùng sẽ đăng ký bằng cùng một tài khoản trên các thiết bị khác và bạn sẽ cần phải quan tâm đến việc phát hiện khi thiết bị khác đã chuyển dữ liệu lên đám mây của riêng bạn và cập nhật thiết bị hiện tại với thông tin mới.

Rõ ràng, đối với các thiết bị iOS 5.0, bạn có thể muốn phát hiện các tệp đã thay đổi cho các thiết bị trước iOS 5.0 trong đám mây của riêng mình và cũng có thể nói chuyện với iCloud.


Cảm ơn. Vì vậy, nói cách khác, nếu tôi không muốn hỗ trợ các thiết bị chạy trước iOS 5, tôi chỉ cần sử dụng UIDocument và quên nội dung của thư mục doc trong hộp cát của ứng dụng của mình.
n.evermind

Khá nhiều, mặc dù theo như tôi có thể nói, bạn sẽ vẫn có một tài liệu trong hộp cát mà UIDocument sẽ giúp dàn xếp với iCloud cho bạn, nhưng bạn sẽ được thông báo khi nào bạn có thể truy cập nó ... Tôi vẫn đang nhận được để tự mình nắm bắt những thứ này!
Jonathan Watmough

3

Có vẻ như bạn đang gặp sự cố iCloud / notICloud nhiều như vấn đề iOS5 / notIOS5.

Nếu mục tiêu triển khai của bạn là iOS5, thì chỉ cần sử dụng cấu trúc UIDocument. Nếu nó phổ biến, thì NSMetaDataQuery của bạn sẽ tìm thấy nó trên đám mây; nếu không nó sẽ tìm thấy nó trên thiết bị.

Mặt khác, nếu bạn muốn cung cấp quyền truy cập trước 5.0 vào ứng dụng của mình, thì bạn sẽ cần phải kiểm tra có điều kiện để xem liệu iOS đang chạy có phải là 5.0 trở lên hay không. Nếu đúng thì hãy sử dụng UIDocument; nếu không thì đọc / ghi dữ liệu theo cách cũ.

Cách tiếp cận của tôi là viết một phương thức saveData có điều kiện để kiểm tra iOS5. Nếu nó tồn tại, tôi cập nhật số lượng thay đổi (hoặc sử dụng trình quản lý hoàn tác). Trong trường hợp của bạn, textViewDidChange sẽ gọi phương thức này. Nếu không, nó sẽ lưu vào đĩa theo cách cũ. Khi tải, điều ngược lại xảy ra.


1

Bạn bị bối rối bởi "Xử lý tệp trong iCloud giống như cách bạn xử lý tất cả các tệp khác trong hộp cát ứng dụng của mình." Điều này đúng với những thứ như Keynote và Numbers nơi bạn lưu giữ một loạt tệp và nếu bạn có iCloud, chúng sẽ bắt đầu đồng bộ hóa một cách kỳ diệu.

Tuy nhiên, bạn đang xây dựng thứ gì đó phụ thuộc vào chức năng giống như iCloud. Bạn không thể giữ vững tuyên bố đó vì ứng dụng của bạn phụ thuộc vào iCloud để mọi thứ hoạt động theo cách của nó. Bạn sẽ phải đóng ứng dụng của mình và chỉ cần nói "vui lòng thiết lập iCloud để cái này hoạt động" hoặc sao chép chức năng giống iCloud (của riêng bạn hoặc của người khác) mà bạn luôn có thể sử dụng, bất kể.


Cảm ơn. Vì vậy, tôi đoán tôi phải chọn xem tôi làm một ứng dụng chỉ iCloud hay một loại kết hợp nào đó cho những người sử dụng chức năng iCloud. Vì iCloud rất phức tạp nên tôi có xu hướng sử dụng một ứng dụng chỉ iCloud. Cảm ơn.
n.evermind
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.