如何在Xamarin iOS中将文件上传和下载到iCloud

时间:2018-11-16 05:54:29

标签: ios visual-studio xamarin icloud

我想将文档上传到 iCloud 。并且还需要从 iCloud 下载并进行编辑。我是Xamarin ios应用程序的新手。找不到详细的示例。请帮忙。

1 个答案:

答案 0 :(得分:0)

使用iCloud文档存储的第一步是确定是否启用了iCloud,以及是否启用了“普遍存在的容器”(在设备上存储了启用iCloud的文件的目录)的位置。

此代码在示例的AppDelegate.FinishedLaunching方法中。

ThreadPool.QueueUserWorkItem (_ => {
CheckingForiCloud = true;
Console.WriteLine ("Checking for iCloud");
var uburl = NSFileManager.DefaultManager.GetUrlForUbiquityContainer (null);
// OR instead of null you can specify "TEAMID.com.your-company.ApplicationName"

if (uburl == null) {
    HasiCloud = false;
    Console.WriteLine ("Can't find iCloud container, check your provisioning profile and entitlements");

    InvokeOnMainThread (() => {
        var alertController = UIAlertController.Create ("No \uE049 available",
        "Check your Entitlements.plist, BundleId, TeamId and Provisioning Profile!", UIAlertControllerStyle.Alert);
        alertController.AddAction (UIAlertAction.Create ("OK", UIAlertActionStyle.Destructive, null));
        viewController.PresentViewController (alertController, false, null);
    });
 } else { // iCloud enabled, store the NSURL for later use
    HasiCloud = true;
    iCloudUrl = uburl;
    Console.WriteLine ("yyy Yes iCloud! {0}", uburl.AbsoluteUrl);
 }
 CheckingForiCloud = false;
});
  

创建UIDocument子类

public class MonkeyDocument : UIDocument
{
  // the 'model', just a chunk of text in this case; must easily convert to NSData
     NSString dataModel;
  // model is wrapped in a nice .NET-friendly property
   public string DocumentString 
   {
    get {
        return dataModel.ToString ();
        }

    set {
        dataModel = new NSString (value);
        }
    }

    public MonkeyDocument (NSUrl url) : base (url)
    {
      DocumentString = "(default text)";
    }
    // contents supplied by iCloud to display, update local model and display (via notification)
    public override bool LoadFromContents (NSObject contents, string typeName, out NSError outError)
    {
      outError = null;

      Console.WriteLine ("LoadFromContents({0})", typeName);

      if (contents != null)
        dataModel = NSString.FromData ((NSData)contents, NSStringEncoding.UTF8);

     // LoadFromContents called when an update occurs
      NSNotificationCenter.DefaultCenter.PostNotificationName.("monkeyDocumentModified", this);
     return true;
    }
   // return contents for iCloud to save (from the local model)
    public override NSObject ContentsForType (string typeName, out NSError outError)
    {
     outError = null;

     Console.WriteLine ("ContentsForType({0})", typeName);
     Console.WriteLine ("DocumentText:{0}",dataModel);

     NSData docData = dataModel.Encode (NSStringEncoding.UTF8);
     return docData;
    }
}
  

保存iCloud文档

var docsFolder = Path.Combine (iCloudUrl.Path, "Documents"); // NOTE: Documents 
folder is user-accessible in Settings
var docPath = Path.Combine (docsFolder, MonkeyDocFilename);
var ubiq = new NSUrl (docPath, false);
var monkeyDoc = new MonkeyDocument (ubiq);
monkeyDoc.Save (monkeyDoc.FileUrl, UIDocumentSaveOperation.ForCreating, saveSuccess => {
 Console.WriteLine ("Save completion:" + saveSuccess);
 if (saveSuccess) {
 monkeyDoc.Open (openSuccess => {
    Console.WriteLine ("Open completion:" + openSuccess);
    if (openSuccess) {
        Console.WriteLine ("new document for iCloud");
        Console.WriteLine (" == " + monkeyDoc.DocumentString);
        viewController.DisplayDocument (monkeyDoc);
    } else {
        Console.WriteLine ("couldn't open");
    }
});
} else {
  Console.WriteLine ("couldn't save");
}

有关iCloud的更多详细信息,您可以参考here