ios - ऐप बल-छोड़ने के बाद डाउनलोड कैसे शुरू करें?



download resume (1)

ठीक है, समस्या पुस्तकालय से आती है, मैं समझता हूं:

TCBlobDownloadSwift के पास एक कस्टम प्रतिनिधि है, जिसे urlSessionDelegate विधि के अंत में कहा जाता है (उदाहरण के लिए कस्टम प्रतिनिधि कुलबीटाइट और कुल बाइट्सएक्शंसूटोराइट के बजाय प्रगति मूल्य देते हैं)। :

func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
    guard let download = self.downloads[downloadTask.taskIdentifier] else{
        return
    }
    let progress = totalBytesExpectedToWrite == NSURLSessionTransferSizeUnknown ? -1 : Float(totalBytesWritten) / Float(totalBytesExpectedToWrite)
    print("progress : \(progress)")
    // the delegate is in fact called download and has more parameter .
    customDelegate(download , progress : progress)
}

और यह ठीक काम करता है लेकिन जब यह डाउनलोड पुनः आरंभ करने के लिए आता है, तो ऐप को पुनः आरंभ करने के लिए डाउनलोड पंजीकृत नहीं है और downloadTask.taskIdentifier को वापस नहीं आता है, इसलिए कस्टम प्रतिनिधि नहीं कहा जाता है !!

बल के बाद एक डाउनलोड शुरू करने के लिए आपको इस कोड का उपयोग करना होगा (विधि कहा जाता है जब NSURLSessionDelegate प्रोटोकॉल का पालन करने वाला ऑब्जेक्ट बनाया गया है):

public func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError sessionError: NSError?) {
    if let error = sessionError {
    print("error : \(error)")
    let directory = NSURL(fileURLWithPath: fileManage.Path)
    if let resumedData = error.userInfo[NSURLSessionDownloadTaskResumeData] as? NSData {
        let url = error.userInfo[NSURLErrorFailingURLStringErrorKey] as? String
        // get name from url just read a dictionnary of name and url
        let name = getNameFromURL(url!) 
        // start the download
        self.manager.downloadFileWithResumeData(resumedData, toDirectory: directory , withName: name, andDelegate: self)
        }
    }
}

मुझे लाइब्रेरी को नष्ट करना पड़ा (यह संरचना डाउनलोड को फिर से शुरू करने की अनुमति नहीं देता है यदि ऐप बल-छोड़ें)

TLDR

यदि आप एक कस्टम प्रतिनिधि (एक NSURLSessionDelegate से अलग) के साथ एक पुस्तकालय का उपयोग करते हैं तो समस्या कस्टम प्रतिनिधि से हो सकती है जो URL सत्र (सत्र: NSURL सत्र, कार्य: NSURLSessionTask, didTompleteWithError sessionError: NSError?) पद्धति

पुनश्च: उत्तर के लिए धन्यवाद मैं समझता हूं कि मेरा पोस्ट कितना भ्रामक है

मैं एक फ्रेमवर्क पर काम करने की कोशिश करूँगा (यदि मेरे पास समय है) जो ऐप फोर्स के बाद डाउनलोड को फिर से शुरू करने की अनुमति दे सकता है (यह वास्तव में आसान है, आपको उस विशेष मामले के लिए सिर्फ एक प्रतिनिधि विधि जोड़ना होगा, लेकिन अगर यह अधिक है जटिल मैं अभी तक बाद में शायद नहीं है)

मेरे ऐप को एक बहुत बड़ी फाइल डाउनलोड करना है (390 एमबी), मैं डाउनलोड के लिए टीसीब्लॉप्ल डाऊनलोडस्विफ्ट का उपयोग कर रहा हूं (मैं इसे स्विफ्ट 2 के लिए बदल दिया है और यह ठीक काम करता है) और मैंने पृष्ठभूमि डाउनलोड के लिए कॉन्फ़िग बनाया है। मैं चाहता हूं, जब ऐप बल ने डाउनलोड को फिर से शुरू करने में सक्षम होने के लिए छोड़ दिया। मुझे पता चला कि ऐप से बाहर निकलने पर मुझे अभी भी कैश में डाउनलोड किए गए डेटा ("com.apple.nsurlsessiond / Downloads /" + bundleIdentifier) ​​में एक tmp फ़ाइल के रूप में पाया जा सकता है। लेकिन जब मैं डाउनलोड का डेटा प्राप्त करने का प्रयास करता हूं:

func dataInCacheForName (name : String) -> NSData? {
    let PathToCache = (NSSearchPathForDirectoriesInDomains( NSSearchPathDirectory.CachesDirectory , .UserDomainMask, true)[0] as NSString).stringByAppendingPathComponent("com.apple.nsurlsessiond/Downloads/" + bundleIdentifier)
    let path = (PathToCache as NSString).stringByAppendingPathComponent(name)
    let data = NSData(contentsOfFile: path)
    print("data : \(data?.length)")
    return data
}

यह शून्य लौटता है, लेकिन फ़ाइल शून्य नहीं है मैं फाइल को स्थानांतरित कर सकता हूं, इसलिए मैंने फाइल में दस्तावेजों को स्थानांतरित करने की कोशिश की। लेकिन तब अगर मैं डेटा के साथ डाउनलोड को फिर से शुरू करने की कोशिश करता हूं, तो मुझे त्रुटियां मिलती हैं:

-[NSKeyedUnarchiver initForReadingWithData:]: data is NULL 

-[NSKeyedUnarchiver initForReadingWithData:]: data is NULL 

-[NSKeyedUnarchiver initForReadingWithData:]: data is NULL 

पृष्ठभूमि डाउनलोड के लिए अमान्य फिर से शुरू डेटा पृष्ठभूमि डाउनलोडों को http या https का उपयोग करना होगा और उन्हें एक सुलभ फाइल में डाउनलोड करना होगा।

और URL सत्र में

(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError sessionError: NSError?)

error userInfo : Optional([:])

: Optional(Error Domain=NSURLErrorDomain Code=-3003 "(null)")

त्रुटि कोड -3003 फाइल करने के लिए लिखना असंभव है

मैंने कई पोस्ट पढ़ा है और फिर भी कोई जवाब नहीं मिल सकता है

सबसे आशाजनक था https://forums.developer.apple.com/thread/24770





application-restart