1

既存のアプリをiCloudに移行したい。

何をすべきかを学ぶために、デモで説明されているように機能するサンプルアプリを試しました(iTunesスタンフォード大学のコースの講義17に見られるように)。

この問題を抱えている人は、次の問題を引き起こすために私が台無しにしたステップを診断するのを手伝ってくれますか?これは基本的に、クエリするデータがないことを示しているだけですか?または、適切に構成されていない何かが起こっていますか?

私は私のコンソールで次のものを取得しています(これは私が呼び出した直後に以下のコードで発生します[self.iCloudQuery startQuery];

item update error: 0, Error Domain=LibrarianErrorDomain Code=10 "The operation couldn’t be completed.
(LibrarianErrorDomain error 10 - Unable to configure the collection.)" UserInfo=0x11ee00 {NSDescription=Unable to
configure the collection.}

iTunes接続でiCloudがオンになっている開発プロビジョニングプロファイルを作成しました。

資格をオンにしました。内容は次のとおりです。

ここに画像の説明を入力してください

コードは、スタンフォード大学のiTunes講義から直接引用したものです。

#import "DocumentViewController.h"

@interface DocumentViewController ()
@property (strong, nonatomic) NSArray* documents; // of NSURLs
@property (strong, nonatomic) NSMetadataQuery* iCloudQuery;
@end

@implementation DocumentViewController
@synthesize documents = _documents;
@synthesize iCloudQuery = _iCloudQuery;

- (void)setDocuments:(NSArray*)documents {
    // always sort documents alphabetically
    documents
      = [documents sortedArrayUsingComparator:^NSComparisonResult(NSURL* url1, NSURL* url2) {
            return [[url1 lastPathComponent] caseInsensitiveCompare:[url2 lastPathComponent]];
        }];
    if (![documents isEqualToArray:_documents])
    {
        _documents = documents;
        [self.tableView reloadData];
    }
}

- (NSMetadataQuery*)iCloudQuery {
    if (!_iCloudQuery)
    {
        _iCloudQuery = [[NSMetadataQuery alloc] init];
        _iCloudQuery.searchScopes
          = [NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope];
        _iCloudQuery.predicate
          = [NSPredicate predicateWithFormat:@"%K like '*'", NSMetadataItemFSNameKey];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(processCloudQueryResults:)
                                                     name:NSMetadataQueryDidFinishGatheringNotification
                                                   object:_iCloudQuery];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(processCloudQueryResults:)
                                                     name:NSMetadataQueryDidUpdateNotification
                                                   object:_iCloudQuery];
    }
    return _iCloudQuery;
}

#pragma mark - private implementation

- (NSURL*)iCloudURL {
    return [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
}

- (NSURL*)iCloudDocumentsURL {
    return [self.iCloudURL URLByAppendingPathComponent:@"Documents"];
}

- (NSURL*)filePackageURLForCloudURL:(NSURL*)url
{
    if ([url.path hasPrefix:self.iCloudDocumentsURL.path])
    {
        NSArray* iCloudDocumentsURLComponents = self.iCloudDocumentsURL.pathComponents;
        NSArray* urlComponents = url.pathComponents;
        if (iCloudDocumentsURLComponents.count < urlComponents.count)
        {
            NSRange newRange = NSMakeRange(0, iCloudDocumentsURLComponents.count+1);
            urlComponents = [urlComponents subarrayWithRange:newRange];
            url = [NSURL fileURLWithPathComponents:urlComponents];
        }
    }
    return url;
}

- (void)processCloudQueryResults:(NSNotification*)notification
{
    [self.iCloudQuery disableUpdates];
    NSMutableArray* documents = [NSMutableArray array];
    NSUInteger resultCount = self.iCloudQuery.resultCount;
    for (NSUInteger i = 0; i < resultCount ; ++i)
    {
        NSMetadataItem* item = [self.iCloudQuery resultAtIndex:i];
        NSURL* url = [item valueForAttribute:NSMetadataItemURLKey];
        url = [self filePackageURLForCloudURL:url];
        [documents addObject:url];
    }
    self.documents = documents;
    [self.iCloudQuery enableUpdates];
}

#pragma mark - overrides

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (![self.iCloudQuery isStarted])
        [self.iCloudQuery startQuery];
    [self.iCloudQuery enableUpdates];
}

- (void)viewWillDisappear:(BOOL)animated {
    [self.iCloudQuery disableUpdates];
    [super viewWillDisappear:animated];
}
4

1 に答える 1

4

これに遭遇した他の人のために…どうやら、これはテストしているデバイスでiCloudを有効にしていない場合に発生するエラーです。デバイスで iCloud を有効にすると、ログでエラーが発生しなくなりました。

それで、「システム設定でiCloudにサインアップするまで、iCloudへの接続は機能しません」というダイアログをユーザーに提示するために、どのエラーを確認する必要があるかがわかりました。

于 2012-07-17T09:10:03.773 に答える