2012-01-27 10 views
4

iOS用のiCloudドキュメントのサンプルコードを見て、それを使ってをiCloudと同期させたところ、iCloudとを同期しようとしていますUIDocumentを持っていないMac OSXアプリ。iCloudを使用してMac OS XからMac OS XをiPad/iPhoneに同期する方法

UIDocumentNSDocumentに変更しようとしましたが、との同期方法はすべて異なります。 のドキュメントを除き、サンプルコードやチュートリアルは見つかりませんでしたが、これは非常に混乱しており、よく書かれていません。

たとえば、iOSのUIDocumentから以下の方法は、OS X上でNSDocumentに存在しません:

//doc is an instance of subclassed UIDocument 
[doc openWithCompletionHandler:nil]; 

アップルのドキュメントは、OS Xのために、このコードが用意されています

- (void)checkIfCloudAvaliable { 
    NSURL *ubiquityContainerURL = [[[NSFileManager defaultManager] 
            URLForUbiquityContainerIdentifier:nil] 
            URLByAppendingPathComponent:@"Documents"]; 
    if (ubiquityContainerURL == nil) { 
     NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
           NSLocalizedString(@"iCloud does not appear to be configured.", @""), 
           NSLocalizedFailureReasonErrorKey, nil]; 
     NSError *error = [NSError errorWithDomain:@"Application" code:404 
             userInfo:dict]; 
     [self presentError:error modalForWindow:[self windowForSheet] delegate:nil 
     didPresentSelector:NULL contextInfo:NULL]; 
     return; 
    } 
    dest = [ubiquityContainerURL URLByAppendingPathComponent: 
      [[self fileURL] lastPathComponent]]; 
} 

- (void)moveToOrFromCloud { 
    dispatch_queue_t globalQueue = 
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(globalQueue, ^(void) { 
     NSFileManager *fileManager = [[NSFileManager alloc] init]; 
     NSError *error = nil; 
     // Move the file. 
     BOOL success = [fileManager setUbiquitous:YES itemAtURL:[self fileURL] 
            destinationURL:dest error:&error]; 
     dispatch_async(dispatch_get_main_queue(), ^(void) { 
      if (! success) { 
       [self presentError:error modalForWindow:[self windowForSheet] 
          delegate:nil didPresentSelector:NULL contextInfo:NULL]; 
      } 
     }); 
    }); 
    [self setFileURL:dest]; 
    [self setFileModificationDate:nil]; 
} 

どのようにすることができますiOSとOS Xの間で同期します(NSDocumentはiOSにはなく、UIDocumentはOS Xに存在しません)。誰も私がMac OSX用のサンプルを見つけることができるか知っていますか(NSDocument)?

+1

されていません。 – Abizern

+0

私はドキュメントを使用しましたが、それは私のためには機能しませんでした。 –

+1

また、カットアンドペーストできるものを探し出すのではなく、試したコードのいくつかを表示してみてください。あなたはiOSのためにそれをやったので、あなたはその流れをある程度理解しておく必要があります。 – Abizern

答えて

5

私はそれを稼働させることができました!ここでは、サブクラス化ファイルからOS X上の私のコードは次のとおりです。

ヘッダファイル:

#import <Cocoa/Cocoa.h> 
#import <Foundation/Foundation.h> 

@interface subclassedNSDocument : NSDocument 

@property (strong) NSData *myData; 

@end 

実装ファイル:

#define kFILENAME @"mydocument.dox" 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    NSURL *ubiq = [[NSFileManager defaultManager] 
        URLForUbiquityContainerIdentifier:nil]; 
    if (ubiq) { 
     NSLog(@"iCloud access at %@", ubiq); 
     // TODO: Load document... 
     [self loadDocument]; 
    } 
    else 
    { 
     NSLog(@"No iCloud access"); 
    } 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(dataReloaded:) 
               name:@"dataModified" object:nil]; 
} 

- (void)update_iCloud 
{ 
    NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; 
    NSURL *ubiquitousPackage = [[ubiq URLByAppendingPathComponent:@"Documents"] URLByAppendingPathComponent:kFILENAME]; 
    self.doc.myData = [NSKeyedArchiver archivedDataWithRootObject:[@"Your Data Array or any data", nil]]; 
    [self.doc saveToURL:ubiquitousPackage ofType:@"dox" forSaveOperation:NSSaveOperation error:nil]; 
} 

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

    if ([query resultCount] == 1) { 

     NSMetadataItem *item = [query resultAtIndex:0]; 
     NSURL *url = [item valueForAttribute:NSMetadataItemURLKey]; 
     NSLog(@"url = %@",url); 
     subclassedNSDocument *doc = [[subclassedNSDocument alloc] initWithContentsOfURL:url ofType:@"dox" error:nil]; 
     [doc setFileURL:url]; 
     self.doc = doc; 
    } 
    else { 

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

     dataUrls *doc = [[dataUrls alloc] init]; 
     [self.doc setFileURL:ubiquitousPackage]; 
     self.doc = doc; 
     [self.doc saveToURL:ubiquitousPackage ofType:@"dox" forSaveOperation:NSSaveOperation error:nil]; 
    } 

} 

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

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

    [[NSNotificationCenter defaultCenter] removeObserver:self 
                name:NSMetadataQueryDidFinishGatheringNotification 
                object:query]; 

    _query = nil; 

    [self loadData:query]; 

} 

- (void)loadDocument { 

    NSMetadataQuery *query = [[NSMetadataQuery alloc] init]; 
    _query = query; 
    [query setSearchScopes:[NSArray arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]]; 
    NSPredicate *pred = [NSPredicate predicateWithFormat: @"%K == %@", NSMetadataItemFSNameKey, kFILENAME]; 
    [query setPredicate:pred]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query]; 

    [query startQuery]; 

} 

- (void)dataReloaded:(NSNotification *)notification 
{ 
    self.doc = notification.object; 

    NSArray *arrFromCloud = [NSKeyedUnarchiver unarchiveObjectWithData:self.doc.myData]; 

    //Update you UI with new data 
} 
- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError 
{ 
    BOOL readSuccess = NO; 
    if (data) 
    { 
     readSuccess = YES; 
     [self setMyData:data]; 
    } 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"dataModified" 
                 object:self]; 

    return readSuccess; 
} 

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError 
{ 
    if (!myData && outError) { 
     *outError = [NSError errorWithDomain:NSCocoaErrorDomain 
             code:NSFileWriteUnknownError userInfo:nil]; 
    } 
    return myData; 
} 

とAppDelegate.mファイルで

私が働いていない唯一のことは、私が文書のデータをiPad、MacアプリはiCloudからreadFromDataメソッドを更新する方法を呼び出さないので、誰かが迷っていることを知っていますか?

iOSでは、iCloudのUIDocumentが変更されるたびに、同等のメソッドloadFromContentsが自動的に呼び出されます。 OS Xでは、readFromDataはロード時に1回呼び出されますが、再度呼び出されることはありません。

私のコードは私のためにMacからiPadへの片方向の作業に役立つことを願っています。

+0

ipadからmacに更新してもらえましたか? – Olof

+0

@ user1173374 StackOverflowで回答内にさらに質問を投げかけてはいけません。代わりに、新しい質問を開始してください。あなたの新しい質問では、この答えにリンクして参考にすることができます。 –

+0

@Olof iPadからMacにアップデートするための質問を投稿しました: http://stackoverflow.com/questions/20984512/how-to-sync-an-nsdocument-from-ipad-iphone-to-mac-osx- icloudと –

2

私はNSMetadataQueryDidUpdateNotificationが文書の更新を検出するために探しているものだと思います。

NSMetadataQueryDidFinishGatheringNotificationのように使用できます。

0

コアデータに加えてファイルを扱っている場合。ここで私たちのすべて「混乱なくよく書かれ、」ドキュメントを見つけるより良いチュートリアル

http://samvermette.com/312