gpt4 book ai didi

swift - 在应用程序处于后台时访问 PHPhotoLibrary

转载 作者:搜寻专家 更新时间:2023-10-31 19:29:31 27 4
gpt4 key购买 nike

我有一个 NSURLDownloadTask 可以在后台成功下载文件(大图像或视频文件)。我成功地复制了 url 并调用此函数将我的 url 保存到照片库。如您所见,我想发送一个 UILocalNotification 来通知用户他们的下载已完成。

我的问题是,虽然 PHPhotoLibrary.sharedPhotoLibrary().performChanges 会在应用程序处于后台时被调用,但它的完成 block 不会。 (但是它要求应用程序返回前台)我尝试注释掉捕获主线程以查看是否有帮助,但没有。而且我不想在完成 block 之前发送本地通知,因为我想在下载成功/不成功的通知中告诉用户。

我想我可以在 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)
}
}
}

关于swift - 在应用程序处于后台时访问 PHPhotoLibrary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38675816/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com