5

我一直在研究一個新的基於文檔的應用程序,並對新的UIDocumentBrowserController感到非常高興......試圖爲我自己的文檔瀏覽器解決方案UI很棘手!遇到問題讓UIDocumentBrowserController在基於文檔的應用程序中打開文檔

我在瀏覽器創建後打開文檔時遇到了一些麻煩。

現在發生的情況是,當我選擇在文檔瀏覽器中創建新文檔時,雖然會記錄錯誤消息,但是文檔已按預期創建並打開。但是,在文檔關閉後,即使顯示文檔,我也無法立即重新打開文件,也無法在後續啓動時重新打開文件。然而,這裏一個奇怪的線索是,如果我在創建文檔後停止運行應用程序,但不向其添加新信息(觸發保存週期),並再次運行項目,則可以正確打開該文件。這使得我認爲文件被保存的方式存在問題。 (注意:在這個階段,我正在努力使本地非icloud實現工作,然後再繼續進行icloud實現。)

以下是代碼中任何時候出現錯誤消息的文檔保存到磁盤(或者至少大部分時間!): 2017-06-20 13:21:58.254938-0500 Sermon Design 2 iOS [22454:5000138] [默認] [錯誤]無法獲取項目的屬性值文件:///用戶/ stevenhovater /庫/開發商/ CoreSimulator /設備/ 9A4364F2-B3A1-4AD9-B680-FB4BC876C707 /數據/集裝箱/數據/應用/ DD534ED8-C4A3-40FE-9777-AED961976878 /文檔/無題 - 9 。講道。錯誤:錯誤域= NSFileProviderInternalErrorDomain代碼= 1「讀者不被允許訪問該URL。」 UserInfo = {NSLocalizedDescription =讀者不允許訪問該URL}

我懷疑問題在於我的文檔類型plists中的某些問題,我試圖通過模擬wwdc視頻中的設置來設置問題2017會話229.

enter image description here 我的文檔由NSData對象封裝,使用我認爲是UIDocument的一個相當標準的子類實現。 (我省略了代碼來生成縮略圖)

override func contents(forType typeName: String) throws -> Any { 

    print("Saving Document Changes") 
    if sermon != nil { 
     let newData = NSKeyedArchiver.archivedData(withRootObject: sermon!) 

     return newData 
    } else { 
     let newData = NSKeyedArchiver.archivedData(withRootObject: Sermon()) 

     return newData  
    } 
} 

override func fileAttributesToWrite(to url: URL, for saveOperation: UIDocumentSaveOperation) throws -> [AnyHashable : Any] { 

    let thumbnail:UIImage = self.createThumbnail()  

    let thumbnaildict = [URLThumbnailDictionaryItem.NSThumbnail1024x1024SizeKey : thumbnail] 
    let dict = [URLResourceKey.thumbnailDictionaryKey:thumbnaildict] 
    return dict   
} 

override func load(fromContents contents: Any, ofType typeName: String?) throws { 

    guard let newSermon:Sermon = NSKeyedUnarchiver.unarchiveObject(with: contents as! Data) as? Sermon else{ 
     throw documentErrors.invalidFile 
    } 

    self.sermon = newSermon 

} 

在我UIDocumentBrowserViewController的子類,這裏是我得到一個本地文件名和創建新的文件代碼。

​​
+0

你有沒有設法解決它? :/ –

+0

這是否有錯誤報告? – olynoise

+0

我已經提交了一個錯誤報告。 #35033364 – olynoise

回答

3

經過四五個小時的工作,我的頭撞到這個問題,我發現了一個簡單的解決方案:不要在模擬器中測試。我切換到在我的設備上進行測試,並立即開始按照廣告進行工作。

[我不能在這裏講述經驗,但可能是「在模擬器中不起作用」問題僅限於塞拉利昂,但模擬器確實在高塞拉利昂工作。這可以解釋爲什麼有些用戶看到這個問題,而另一些用戶看不到這個問題,尤其是爲什麼蘋果在WWDC視頻中似乎沒有意識到這一點。]

+0

出於好奇,你運行的是什麼版本的OSX?當我在Mac上去高塞拉利昂時,這個問題一直沒有解決。 –

+0

@StevenHovater很高興收到您的消息 - 我正在使用Sierra,並且我也基於在開發人員論壇上所說的模擬器問題可能侷限於Sierra的結論得出結論。所以謝謝你的確認。我會在我的答案中加上這一點,但我不能從經驗中發言,我會這樣說。我想知道整個事情是否真的與APFS有關?顯然塞拉利昂將缺乏這一點。 – matt

+0

謝謝你在這個問題上讓我從頭撞到四五個小時! – XML

1

當我試圖保存到NSTemporaryDirectory()時,我遇到了完全相同的問題。

如果您改爲保存到文檔目錄([[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject]),它似乎工作正常!

更新:它看起來像是在iOS 11 beta 3中修復了這個問題,您現在可以正確保存新創建的文檔到NSTemporaryDirectory()

+1

它在iOS11 beta 3中仍然不適用於我。我還使用了一個文件包,因此可能與它有關。 – olynoise

0

這是我目前的理論。

此錯誤

Error Domain=NSFileProviderInternalErrorDomain Code=1 "The reader is not permitted to access the URL." 

顯示了先建立在使用-initWithFileURL新網址UIDocument時。它基本上是說「這個URL還沒有存在」,但它的方式聽起來更像是一個權限問題。

據我所知,它並不妨礙您保存,打開,編輯或關閉文件。所以我認爲這只是蘋果應該拿出來的一個多餘的錯誤。

0

我發現錯誤發生在模擬器上時LSSupportsOpeningDocumentsInPlace屬性設置爲YES info.plist。 將此屬性設置爲NO,然後開始工作,在我的情況下。 在真實的設備上,它無論如何都可以正常工作而不會出錯。

相關問題