web-dev-qa-db-ja.com

SwiftドキュメントファイルをiCloudドライブに書き込み/保存/移動

私は2日間以上iCloudドライブにファイルを書き込もうとしてきました。シンプルなテキストファイルをローカルに直接書き込んでから、UIDocumentMenuViewControllerなどを使用して移動しようとしました。コードでエラーが発生せず、デバッガーをステップスルーしませんが、成功したように見えますが、ファイルが存在するかどうかを確認すると、少なくともiCloudディレクトリには何もありません。私はシミュレーターとiPhoneの両方を試して、iCloud同期をトリガーしました。

私の主な目標は、iCloudドライブにテキストファイルを書き込むことです。これは、後で「数字」ファイルになります

Plistファイルと資格を設定しました。

<key>NSUbiquitousContainers</key>
<dict>
    <key>iCloud.com.paul.c.$(PRODUCT_NAME:rfc1034identifier)</key>
    <dict>
        <key>NSUbiquitousContainerIsDocumentScopePublic</key>
        <true/>
        <key>NSUbiquitousContainerName</key>
        <string>myCloudTest</string>
        <key>NSUbiquitousContainerSupportedFolderLevels</key>
        <string>Any</string>
    </dict>
</dict>

私はまた、次のようにバンドルバージョンでバンプしました: iOS 8ドキュメントをiCloudドライブに保存

私は運が悪いのに何十ものチュートリアルを試しました。私の最新のコードはこのサンプルに基づいています: https://medium.com/ios-os-x-development/icloud-drive-documents-1a46b5706fe1

これが私のコードです:

@IBAction func ExportFile(sender: AnyObject) {

    var error:NSError?

    let iCloudDocumentsURL = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier(nil)?.URLByAppendingPathComponent("myCloudTest")

    //is iCloud working?
    if  iCloudDocumentsURL != nil {

        //Create the Directory if it doesn't exist
        if (!NSFileManager.defaultManager().fileExistsAtPath(iCloudDocumentsURL!.path!, isDirectory: nil)) {
                //This gets skipped after initial run saying directory exists, but still don't see it on iCloud
                NSFileManager.defaultManager().createDirectoryAtURL(iCloudDocumentsURL!, withIntermediateDirectories: true, attributes: nil, error: nil)
        }
    } else {
        println("iCloud is NOT working!")
        //  return
    }

    if ((error) != nil) {
        println("Error creating iCloud DIR")
    }


    //Set up directorys
    let localDocumentsURL = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: .UserDomainMask).last as! NSURL

    //Add txt file to my local folder
    let myTextString = NSString(string: "HELLO WORLD")
    let myLocalFile = localDocumentsURL.URLByAppendingPathComponent("myTextFile.txt")
    let written = myTextString.writeToURL(myLocalFile, atomically: true, encoding: NSUTF8StringEncoding, error: &error)

    if ((error) != nil){
        println("Error saving to local DIR")
    }


   //If file exists on iCloud remove it
    var isDir:ObjCBool = false
    if (NSFileManager.defaultManager().fileExistsAtPath(iCloudDocumentsURL!.path!, isDirectory: &isDir)) {
        NSFileManager.defaultManager().removeItemAtURL(iCloudDocumentsURL!, error: &error)
    }

    //copy from my local to iCloud
    if (error == nil && !NSFileManager.defaultManager().copyItemAtURL(localDocumentsURL, toURL: iCloudDocumentsURL!, error: &error)) {
        println(error?.localizedDescription);
    }

お時間をいただきありがとうございます。

乾杯、ポール

上記のコードの後に​​iphoneでいくつかのコードを実行しました。

var error:NSError?
    let iCloudDocumentsURL = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier(nil) //?.URLByAppendingPathComponent("myCloudTest")

    var fileManager: NSFileManager = NSFileManager()


    var fileList: NSArray = fileManager.contentsOfDirectoryAtURL(iCloudDocumentsURL!, includingPropertiesForKeys: nil, options: nil, error: &error)!
    var filesStr: NSMutableString = NSMutableString(string: "Files in iCloud folder \n")
    for s in fileList {

        println(s)
    }

そして、それは私のテキストファイルへのパスを出力します:file:///private/var/mobile/Library/Mobile%20Documents/iCloud~com~paul~c~myApp/MyTextFile.txt

私のファイルはそこにありますが、iCloudドライブに表示されません。

12
Paul C

私はこの問題を抱えていました。私 ここのアドバイスに従いました と私はInfo.plistキーが正しくないことを発見しました。 iCloud.MY_BUNDLE_IDENTIFIERに変更すると(つまり、Info.plistの上位のCFBundleIdentifierキーから文字列をコピーします)、すべてが機能し始めました。

キーから.comを削除すると、問題が解決する場合があります。

3
Rick Andrews

FWIW:

また、バンドルID内のプロジェクトの名前が重要であることもわかりました。

プロジェクトバンドルIDは次のようなものでした:aaa-bbb-ccc-ddd

ICloudを動作させることができませんでした。

次に、名前をaaa-bbb.ccc-dddに変更しました

それは働き始めました。

3
Mehmet

バンドル番号を常に「バンプ」する必要なく、すべてを同期させる方法を見つけたと思います。 Key-Valueストレージ/ iCloudドキュメント/ CloudKitの「機能」領域内で変更を加えながら何度か試してみましたが、毎回動作するようです。

  1. MacでiCloudからサインアウトする
  2. シミュレータでiCloudからサインアウトする
  3. MacでiCloudに再度サインインします
  4. シミュレータでiCloudに再度サインインします
  5. XCodeからクリーンビルドを実行(Shift-Cmd-K)

これは、アプリがiCloudドキュメントディレクトリに書き込んでいるときに、バンドル番号を変更することなく、フォルダー構造の同期をリセットするように見えます。それを行うには少し時間がかかりますが、私は少しOCDなので、最初のアプリの起動は1から始める方がいいです。

0
pscarnegie