我有一个NSURLDownloadTask
可以在后台成功下载文件(大图像或视频文件)的文件。然后,我成功复制了网址,并调用此函数将我的网址保存到照片库。如您所见,我想发送一个UILocalNotification
通知用户他们的下载已完成。
我的问题是,当PHPhotoLibrary.sharedPhotoLibrary().performChanges
app在后台运行时将调用will,但完成块不会。(但是它使应用程序重新回到前台)我尝试注释掉主线程以查看是否有帮助,但没有帮助。而且我不想在完成块之前发送本地通知,因为我想告诉用户下载成功/失败的通知。
我想我可以通过一种NSURLDownloadDelegateTask
方法发送通知。这将使用户知道文件已成功下载,但不会成功将其保存到他们的照片中。而且我不想告诉我的用户他们的下载成功了,然后他们无法在他们的照片库中找到它。
这是我访问和修改照片库的代码。
func saveURLToPhotosLibrary(url: NSURL, fileName: String) {
if let fileExtension = url.pathExtension {
PHPhotoLibrary.sharedPhotoLibrary().performChanges({
let fileUnmanagedIDTag = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil)
let fileIDTag = fileUnmanagedIDTag?.takeRetainedValue()
if let fileUTType = fileIDTag {
if UTTypeConformsTo(fileUTType, kUTTypeImage) {
PHAssetChangeRequest.creationRequestForAssetFromImageAtFileURL(url)
} else if UTTypeConformsTo(fileUTType, kUTTypeMovie){
PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(url)
}
} else {
print("Error getting type of file from download")
}
}) { (success, error) in
//dispatch_async(dispatch_get_main_queue(), {
if success {
print("finished")
self.sendLocalNotification(downloadSuccessful: true, error : nil, fileName: fileName)
} else {
if let error = error {
self.sendLocalNotification(downloadSuccessful: false, error : error, fileName: fileName)
}
}
//})
}
}
}
好了,找到了我的工作解决方案。发现该应用程序在没有代码运行后立即被挂起,因此在我的完成处理程序准备好被调用之前,该应用程序已被挂起。我使用UIApplications
共享实例创建了一个新的后台任务。这给我的应用程序足够的时间来调用完成处理程序。然后,一旦收到通知,我便结束了后台任务。
func saveURLToPhotosLibrary(url: NSURL, fileName: String) {
//Returns id to later be passed into method that ends task.
let backgroundID : Int = UIApplication.sharedApplication().beginBackgroundTaskWithName("Save to Photo Library Task") {
print("Background task expired")
}
if let fileExtension = url.pathExtension {
PHPhotoLibrary.sharedPhotoLibrary().performChanges({
let fileUnmanagedIDTag = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil)
let fileIDTag = fileUnmanagedIDTag?.takeRetainedValue()
if let fileUTType = fileIDTag {
if UTTypeConformsTo(fileUTType, kUTTypeImage) {
PHAssetChangeRequest.creationRequestForAssetFromImageAtFileURL(url)
} else if UTTypeConformsTo(fileUTType, kUTTypeMovie){
PHAssetChangeRequest.creationRequestForAssetFromVideoAtFileURL(url)
}
} else {
print("Error getting type of file from download")
}
}) { (success, error) in
if success {
print("finished")
self.sendLocalNotification(downloadSuccessful: true, error : nil, fileName: fileName)
} else {
if let error = error {
self.sendLocalNotification(downloadSuccessful: false, error : error, fileName: fileName)
}
}
//End background task here passing in id of task from earlier.
UIApplication.sharedApplication().endBackgroundTask(backgroundID)
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句