2011-10-21 17 views
31

मेरे पास पहले से एक आईफोन ऐप है जो स्थानीय दस्तावेज़ फ़ोल्डर में फ़ाइल में डेटा संग्रहीत करता है। अब मैंने आईक्लाउड टेक्नोलॉजीज के बारे में सीखा और मेरा पहला सवाल था: क्या iCloud को निर्देशिका के रूप में उपयोग करने का कोई तरीका है जब कभी-कभी मैं नए संस्करणों की जांच करता हूं?ऐप फ़ाइलों को स्टोर और सिंक करने के लिए iCloud का उपयोग कैसे करें

मेरा मतलब है: क्या मैं UIDocument, फ़ाइल समन्वयक और फ़ाइल प्रस्तुतियों का उपयोग करने से बच सकता हूं? मैं सिर्फ यह जानना चाहता हूं कि iCloud को एक विशेष फ़ोल्डर की तरह व्यवहार कर सकता है और फ़ाइलों को धक्का और पुनर्प्राप्त करने के लिए केवल NSFileManager का उपयोग कर सकता है।

अंतिम नोट: मैं कोर डेटा या किसी डेटाबेस का उपयोग नहीं करता, मेरे पास केवल एक डेटा फ़ाइल है।

संपादित करें:

मैं पहले से ही तो मेरे उन से लिंक नहीं करते आधिकारिक एप्पल iCloud दस्तावेज़ पढ़ें। मुझे केवल कुछ कोड उदाहरण चाहिए।

उत्तर

15

मुझे पता है कि आप कैसा महसूस करते हैं, iCloud थोड़ा मुश्किल है। हालांकि, मुझे लगता है कि UIDocument, फ़ाइल समन्वयक इत्यादि के आसपास कोई रास्ता नहीं है और बस एक साधारण फ़ोल्डर के रूप में iCloud का उपयोग करने के लिए।

iCloud basics and code sample

मैं एक पूर्ण नमूना कोड जो iCloud के नंगे न्यूनतम और काफी का उपयोग करता है को शामिल किया गया शामिल हैं:

आप के लिए नमूना कोड को समझने के लिए एक आसान, कृपया इस पोस्ट पर एक नजर है देख रहे हैं यह एक निर्देशिका की तरह है। शायद यह आपके लिए यूआईडी दस्तावेज़, फ़ाइल समन्वयक आदि का उपयोग करने के लिए कम कठिन बनाता है

लेकिन, जैसा कि आप चाहते हैं, मैं चाहता हूं कि पुराने पुराने वृत्तचित्र फ़ोल्डर विचार के साथ एक आसान और अधिक संगत तरीका था। हालांकि, चूंकि यह iCloud है और iCloud कई चीजें करता है (जैसे कि विभिन्न उपकरणों पर सिंक में सबकुछ रखना, क्लाउड को लगातार अद्यतन करना आदि), यूआईडी दस्तावेज़ आदि के आसपास कोई रास्ता नहीं होगा।

+0

मैं सहमत हूं, अगर आप कहते हैं कि कोई रास्ता नहीं है, तो मैं ट्यूटोरियल पढ़ूंगा। लेकिन मैंने सोचा कि ऐसा करने का एक आसान तरीका होना चाहिए, जैसे कि जब आप ऐप सैंडबॉक्स में फ़ाइल लिखते हैं या पढ़ते हैं। धन्यवाद – edo42

+0

लिंक के लिए धन्यवाद। – Shajo

24

मेरे लिए क्या "काम करता है" बस सरल है:

NSFileManager *fm = [NSFileManager defaultManager]; 

NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; 

if (ubiq == nil) { 
    return NO; 
} 

NSError *theError = nil; 

[fm setUbiquitous:true itemAtURL:backupUrl destinationURL:[[ubiq URLByAppendingPathComponent:@"Documents" isDirectory:true] URLByAppendingPathComponent:backupName] error:&theError]; 

ऐप्पल गैर-यूआई थ्रेड पर कॉल करने के लिए कहता है। फाइलें "स्थानांतरित" होने के बाद।

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

[self.query startQuery]; 

- (void)queryDidFinishGathering:(NSNotification *)notification { 
    NSMetadataQuery *query = [notification object]; 
    [query disableUpdates]; 
    [query stopQuery]; 

    [self loadData:query]; 

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

    self.query = nil; 
} 

क्वेरी परिणामों के माध्यम से गणना का नमूना:

- (void)loadData:(NSMetadataQuery *)query { 
    [self.backups removeAllObjects]; 

    for (NSMetadataItem *item in [query results]) { 
     NSURL *url = [item valueForAttribute:NSMetadataItemURLKey]; 
     [self.backups addObject:url.lastPathComponent]; 
    } 

    [_table reloadData]; 

    [self.loadingBackupIndicator stopAnimating]; 
    self.loadingIndicatorLabel.text = [NSString stringWithFormat: @"%d backups found", [self.backups count]]; 
} 

और ठोस फ़ाइल के "डाउनलोड" शुरू करने के लिए:

NSFileManager *fm = [NSFileManager defaultManager]; 

NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; 

if (ubiq == nil) { 
    return NO; 
} 

NSError *theError = nil; 

bool started = [fm startDownloadingUbiquitousItemAtURL:[[ubiq URLByAppendingPathComponent:@"Documents" isDirectory:true] URLByAppendingPathComponent:backupName] error:&theError]; 

NSLog(@"started download for %@ %d", backupName, started); 

if (theError != nil) { 
    NSLog(@"iCloud error: %@", [theError localizedDescription]); 
} 

आप NSMetaDataQuery इस तरह के माध्यम से उनके लिए क्वेरी कर सकता है "डाउनलोड होने के लिए" फ़ाइल के चेक के साथ:

- (BOOL)downloadFileIfNotAvailable { 
    NSNumber *isIniCloud = nil; 

    NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]; 

    NSURL *file = [[ubiq URLByAppendingPathComponent:@"Documents" isDirectory:true] URLByAppendingPathComponent:self.backupName]; 

    if ([file getResourceValue:&isIniCloud forKey:NSURLIsUbiquitousItemKey error:nil]) { 
     // If the item is in iCloud, see if it is downloaded. 
     if ([isIniCloud boolValue]) { 
      NSNumber* isDownloaded = nil; 
      if ([file getResourceValue:&isDownloaded forKey:NSURLUbiquitousItemIsDownloadedKey error:nil]) { 
       if ([isDownloaded boolValue]) { 
        [self.loadingBackupIndicator stopAnimating]; 
        self.loadingIndicatorLabel.text = @"Downloaded"; 

        .... 

        [[NSFileManager defaultManager] copyItemAtPath:[file path] toPath:restorePath error:&theError ]; 

        .... 

        return YES; 
       } 

       self.loadingCheckTimer = [NSTimer timerWithTimeInterval:3.0f target:self selector:@selector(downloadFileIfNotAvailable) userInfo:nil repeats:NO]; 
       [[NSRunLoop currentRunLoop] addTimer:self.loadingCheckTimer forMode:NSDefaultRunLoopMode]; 

       return NO; 
      } 
     } 
    } 

    return YES; 
} 

मुझे उम्मीद नहीं थी कि कोड बहुत लंबे कच्चे स्निपेट उपलब्ध कराने के लिए लंबे और खेद हो। उपरोक्त कहने का कोई इरादा कोड की उत्पादन गुणवत्ता नहीं हो सकता है, बस अवधारणा को साझा करना।

मैं अभी तक जमा नहीं की है कि एप्पल के लिए अपने ऐप्लिकेशन के अंदर है, इसलिए यह नहीं बता सकते कि app की दुकान करने के लिए "अनुमोदित" होगा (अगर वे या देखभाल ...)

+3

बस यह ध्यान देने के लिए कि ऊपर दिए गए कोड का "उत्पादन" संस्करण ऐप के अंदर ऐप स्टोर में पास कर चुका है। –

+1

क्या आप उपरोक्त कोड सहित नमूना प्रोजेक्ट प्रदान कर सकते हैं। यदि संभव हो तो कृपया मेरी सहायता करें। – Gypsa

+0

@StanislavDvoychenko हैलो सर मुझे आईसीएलएड कोडिंग भाग के बारे में कुछ विचार देते हैं। मीन कैसे करें और पीछे हटाना आदि। कृपया पहले से ही – Bajaj

14

आप अलग-अलग फ़ाइलें अपलोड कर सकते NSFileManager का उपयोग कर iCloud करने के लिए।मैं कैसे करना है कि अपने ब्लॉग पर पर एक complete walkthrough तैनात है, लेकिन यहां प्रासंगिक NSFileManager कोड है: इस कोड

NSURL *destinationURL = [self.ubiquitousURL URLByAppendingPathComponent:@"Documents/image.jpg"] 
[[NSFileManager defaultManager] setUbiquitous:YES 
            itemAtURL:sourceURL 
           destinationURL:destinationURL 
             error:&error] 
+0

के माध्यम से लिंक सेट और साझा किया जा सकता है क्या स्थानांतरित करने के बजाय कॉपी करने का कोई तरीका है? – jjxtra

+1

जब मैं ऐसा करता हूं तो मैंने residentData = [[NSMutableArray alloc] initWithContentsOfURL: icloudURL] का उपयोग करके iCloud में फ़ाइल लाने का प्रयास किया; लेकिन यह हर बार शून्य देता है .. – coolcool1994

-1

उपयोग:

+ (NSString *)Pathsave { 
    NSString *os5 = @"5.0"; 

    NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
    NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 

    if ([currSysVer compare:os5 options:NSNumericSearch] == NSOrderedAscending) { 
     // Lower than 4 
     return path; 
    } else if ([currSysVer compare:os5 options:NSNumericSearch] == NSOrderedDescending) { 
     // 5.0.1 and above   
     return path; 
    } else { 
     // iOS 5 
     path = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"]; 
     return path; 
    } 

    return nil; 
} 
6

वास्तव UIDocument का उपयोग कर के चारों ओर एक तरीका नहीं है। मैंने iCloud के अपने पहले उपयोगों में से एक में ऐसा करने की कोशिश की, लेकिन यह यूआईडी दस्तावेज के बिना आपदा हो गई। पहले UIDocument का उपयोग करना बहुत अधिक काम जैसा लगता है, लेकिन ऐसा नहीं है।

आप आसानी से एक घंटे के भीतर यूआईडी दस्तावेज को उपclass कर सकते हैं और इसे किसी भी प्रकार की फ़ाइल के साथ काम करने के लिए प्राप्त कर सकते हैं (बस content संपत्ति एनएसडीटा के रूप में सेट करें)। यह भी मानक फाइल सिस्टम भर में कई लाभ प्रदान करता है:

  • बदलें ट्रैकिंग
  • फ़ाइल संघर्ष समाधान
  • दस्तावेज़ राज्य समर्थन
  • बचाने/खोलने/बंद सुविधाओं

ईमानदारी से बढ़ी, खर्च ऐप्पल प्रलेखन पर केवल एक घंटे या दो पढ़ना और फिर इसका उपयोग करना समय और मस्तिष्क शक्ति के बराबर है। ICloud दस्तावेज़ संग्रहण पर एक अच्छा स्टार्टर आलेख Apple's Developer Documentation में पाया जा सकता है।


मैं एक UIDocument उपवर्ग कि फ़ाइल के किसी भी प्रकार के साथ (विशेष रूप से NSData) काम करेंगे लिखा है। आप GitHub पर UIDocument उपclass के लिए कोड को देख, डाउनलोड और संशोधित कर सकते हैं।

दस्तावेज़ बनाएँ:

// Initialize a document with a valid file path 
iCloudDocument *document = [[iCloudDocument alloc] initWithFileURL:fileURL]; 

// Set the content of the document 
document.contents = content; 

// Increment the change count 
[document updateChangeCount:UIDocumentChangeDone]; 

सहेजें किसी मौजूदा दस्तावेज़:

// Save and close the document 
[document closeWithCompletionHandler:nil]; 

सहेजें एक नया दस्तावेज़:

[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:nil]; 

तुम भी उपयोग करके iCloud में संग्रहीत सभी फ़ाइलों को सिंक कर सकते हैं NSMetadataQuery। ऐप्पल ऐप फ़ाइलों को सिंक करने के लिए एनएसएमडेटाडेटा क्वेरी का उपयोग करने का एक बहुत अच्छा उदाहरण प्रदान करता है। इन परिचालनों को करने से पहले iCloud की जांच करना भी सुनिश्चित करें (संकेत: NSFileManager पर ubiquityIdentityToken विधि का उपयोग करें)।


आप भी इस तरह के iCloud Document Sync के रूप में एक खुला स्रोत पुस्तकालय के उपयोग पर विचार कर सकते हैं। iCloud दस्तावेज़ सिंक परियोजना यह बहुत आसान की दुकान और सिंक ऐप फ़ाइलों के लिए बनाता है:

एक पंक्ति का कोड तरीकों के साथ आईओएस दस्तावेज़ परियोजनाओं में iCloud एकीकृत करें। ICloud से दस्तावेजों को सिंक, अपलोड, प्रबंधित और हटाएं जल्दी और आसानी से। डेवलपर्स के लिए iCloud "बस काम" करने में मदद करता है।

लगभग हर iCloud दस्तावेज़ सिंक विधि में, आपको केवल अपने फ़ाइल डेटा को पैरामीटर के रूप में पास करना है और फिर यह शेष (बचत, समन्वयन इत्यादि) को संभालता है।

अस्वीकरण: मैं ओपन-सोर्स प्रोजेक्ट, आईक्लाउड दस्तावेज़ सिंक में योगदानकर्ता हूं। हालांकि, मुझे विश्वास है कि यह परियोजना आपके लिए फायदेमंद होगी, और इस प्रश्न के लिए प्रासंगिक है। यह पदोन्नति या विज्ञापन नहीं है।

+0

यह वही है जो मैंने अंत में किया था। – edo42

+0

यदि आपका उपयोग केस iCloud में डेटा डंप करना है, तो आप फ़ाइल समन्वयक के साथ ऐसा कर सकते हैं और UIDocument की आवश्यकता नहीं है। – Andy

संबंधित मुद्दे