I'm lost with the extension of File in iOS. I can show the files, navigate and show the thumbnails! However, when I click a file it does`t load, only show the text. Here is an image when I click an image:
error click
Here is my code that load the file when has clicked:
override func startProvidingItem(at url: URL, completionHandler: #escaping ((_ error: Error?) -> Void)) {
///TODO CHECK IF EXISTS THE FILE (WITH DATE OR ID)
//guard !fileManager.fileExists(atPath: url.path) else {
// completionHandler(nil)
// return
//}
guard
let identifier = persistentIdentifierForItem(at: url),
let file = FileProviderEnumerator.dictionary[identifier.rawValue]
else {
completionHandler(nil)
return
}
FilesManager.sharedInstance().downloadFile(withIdentifier: file.identifier) { progress in
} withCompletionHandler: { (urlFile, apiError) in
guard let urlFile = urlFile else {
completionHandler(FileProviderError.noContentFromServer)
return
}
do {
let data = try Data(contentsOf: urlFile, options: .alwaysMapped)
let created = self.fileManager.createFile(atPath: urlFile.path, contents:data, attributes:nil)
if(created) {
completionHandler(nil)
} else {
completionHandler(FileProviderError.noContentFromServer)
}
} catch let error{
print(error)
completionHandler(error)
}
/*
do{
let url = urlFile
itemCompletion(data, nil)
} catch let error{
print(error)
itemCompletion(nil, error)
}*/
//
}
}
Is it necessary to do something else? For example the method providePlaceHolder or something like that?
Really thanks in advance an any help with it.
Related
I am trying to read Export chat Zip file but share extension loading a WhatsApp Zip attachment is not working.
I am using this code -:
override func viewDidLoad() {
super.viewDidLoad()
getURL()
}
private func getURL() {
let extensionItem = extensionContext?.inputItems.first as! NSExtensionItem
let itemProvider = extensionItem.attachments?.first
let zip_type = String(UTType.zip.identifier)
if itemProvider!.hasItemConformingToTypeIdentifier(zip_type) {
itemProvider!.loadItem(forTypeIdentifier: zip_type, options: nil, completionHandler: { (item, error) -> Void in
guard let url = item as? NSURL else { return }
OperationQueue.main.addOperation {
print("url\(url)")
self.path = url as URL
do {
let unzipDirectory = try Zip.quickUnzipFile(self.path)
print("unzipDirectory\(unzipDirectory)")
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let fileURL = dir.appendingPathComponent(unzipDirectory.lastPathComponent)
print("fileURL\(fileURL)")
do {
let text2 = try String(contentsOf: fileURL, encoding: .utf8)
print(text2)
}
catch {/* error handling here */}
}
}
catch {
print("Something went wrong")
}
}
})
} else {
print("error")
}
}
override func isContentValid() -> Bool {
print("Hiii")
// Do validation of contentText and/or NSExtensionContext attachments here
return true
}
override func didSelectPost() {
print("hello")
self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
}
override func configurationItems() -> [Any]! {
// To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
return []
}
in console error is:
[core] SLComposeServiceViewController got attachment coarseType 0
[core] SLComposeServiceViewController made no attachment for itemProvider conforming to public.file-url
Can anyone help please?
I want to pick video from Images Picker then I want to send video in firebase and retrieve it Please provide code in swift 5, i write code also for sending video on firebase
func downloadImages(folderPath:String,success:#escaping (_ image:UIImage)->(),failure:#escaping (_ error:Error)->()){
// Create a reference with an initial file path and name
let reference = Storage.storage().reference(withPath: "\(folderPath)")
reference.getData(maxSize: (1 * 1024 * 1024 * 1024 * 1024 * 1024)) { (data, error) in
if let _error = error{
print(_error)
failure(_error)
} else {
if let _data = data {
let myImage:UIImage! = UIImage(data: _data)
success(myImage)
}
}
}
}
Upload video On firebase Storage is
func upload(file: URL, completion: #escaping ((_ url : URL?) -> ())) {
let name = "\(Int(Date().timeIntervalSince1970)).mp4"
do {
let data = try Data(contentsOf: file)
let storageRef =
Storage.storage().reference().child("Videos").child(name)
if let uploadData = data as Data? {
let metaData = StorageMetadata()
metaData.contentType = "video/mp4"
storageRef.putData(uploadData, metadata: metaData
, completion: { (metadata, error) in
if let error = error {
completion(nil)
}
else{
storageRef.downloadURL { (url, error) in
guard let downloadURL = url else {
completion(nil)
return
}
completion(downloadURL)
}
print("success")
}
})
}
}catch let error {
print(error.localizedDescription)
}
}
and Get Video From firebase
let reference = Storage.storage().reference().child("Videos").child(folderPath)
reference.getData(maxSize: INT64_MAX) { (data, error) in
if let error = error {
print("Error downloading image data: \(error)")
return
}
reference.getMetadata(completion: { (metadata, metadataErr) in
if let error = metadataErr {
print("Error downloading metadata: \(error)")
return
}
else {
reference.downloadURL { URL, error in
completion(URL)
print(URL)
}
UIDocumentPickerViewController to pick some document and upload into AWS S3 with help of TransferUtility. Here, While uploading I need to show upload file name, status(progressive loader %),size into tableview cell. If i upload multiple files tableview cell need to show multiple cell with loading status.
Issues:
I have done UIDocumentPickerViewController to pick some documents and get those document URL,name,size,etc. but I don't know how to use (or) pass those values into upload part.
// MARK - File Storage Access
public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {
let fileurl: URL = url as URL
let filename = url.lastPathComponent
let fileextension = url.pathExtension
let filedata = url.dataRepresentation
print("DATA: \(filedata)","URL: \(fileurl)", "NAME: \(filename)", "EXTENSION: \(fileextension)")}
//Need to store above values and use it to below functions
Below upload part how to interact with tableview cell.
transferUtility.uploadData(data,bucket: S3BucketName,key: name,contentType: "text/plain",expression: expression,completionHandler: completionHandler).continueWith { (task) -> AnyObject? in
if let error = task.error {
print("Error: \(error.localizedDescription)")
DispatchQueue.main.async {
cells.statusLabel_util.text = "Failed"
print("Failed")
}
}
if let _ = task.result {
DispatchQueue.main.async {
print("Upload Starting!")
}
// Do something with uploadTask.
}
return nil;
}
You can upload file and track progress with this code
if let uploadRequest = AWSS3TransferManagerUploadRequest(){
uploadRequest.bucket = "your bucket"
uploadRequest.key = fileName
//uploadRequest.acl = AWSS3ObjectCannedACL.publicRead
uploadRequest.body = fileUrl
uploadRequest.uploadProgress = {(bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64) -> Void in
DispatchQueue.main.async(execute: {() -> Void in
//Update progress
})
}
if let transferManager = AWSS3TransferManager.default(){
transferManager.upload(uploadRequest).continue(with: AWSExecutor.mainThread(), with: { (task) -> Any? in
if let error = task.error as NSError? {
if error.domain == AWSS3TransferManagerErrorDomain, let code = AWSS3TransferManagerErrorType(rawValue: error.code) {
switch code {
case .cancelled, .paused:
break
default:
break
//print("Error uploading: \(uploadRequest?.key) Error: \(error)")
}
} else {
//print("Error uploading: \(uploadRequest?.key) Error: \(error)")
}
return nil
}
return nil
})
}
}
I want to download multiple audio files from url and play offline in App . This is what i do in my coding but some time array loop stop downloading . And Also I have one more array to download. and this code is only for download. playing audio is working proper.
override func viewDidLoad() {
super.viewDidLoad()
print("Begin of code")
self.linksToUrls()
self.startDownloadingUrls()
print("End of code")
}
// create a function to start the audio data download
func getAudioDataFromUrl(audioUrl:NSURL, completion: #escaping ((_ data: NSData?) -> Void)) {
URLSession.shared.dataTask(with: audioUrl as URL) { (data, response, error) in
completion(data as NSData?)
print("dfdgfdg",data!)
}.resume()
}
// create another function to save the audio data
func saveAudioData(audio:NSData, destination:NSURL) -> Bool {
if audio.write(to: destination as URL, atomically: true) {
print("The file \"\(destination.lastPathComponent!)\" was successfully saved.")
return true
}
return false
}
// just convert your links to Urls
func linksToUrls(){
print("IntroductoryMusicFile1 = count = ",IntroductoryMusicFile1.count)
audioUrls = NewsAudio1
.map() { NSURL(string: $0) }
.filter() { $0 != nil }
print("introcount",IntroductoryMusicFile1.count)
musicUrls = IntroductoryMusicFile1
.map() { NSURL(string: $0) }
.filter() { $0 != nil }
}
// create a loop to start downloading your urls
func startDownloadingUrls(){
arrayplay.removeAll()
//if (musicUrls = "The URL?"){ }
// let syn = SyncBlock()
for url in 0 ... musicUrls.count-1 {
let aaa = musicUrls[url]
let audioType = audioUrls[url]
print(aaa!)
print("audioType",audioType!)
if aaa == NSURL(string: ""){
arrayplay.append("")
}else{
print("Started downloading \"\(String(describing: aaa?.lastPathComponent!))\".")
let url1 = aaa
let request = URLRequest(url: url1! as URL)
let task = URLSession.shared.dataTask(with: request) {data, response, error in
if let httpResponse = response as? HTTPURLResponse {
print("statusCode: \(httpResponse.statusCode)")
if httpResponse.statusCode == 404{
print("Refresh token...")
// self.audioPlay()
self.arrayplay.append("")
}else{
self.getAudioDataFromUrl(audioUrl: aaa!) { data in
DispatchQueue.main.async() {
print("Finished downloading \"\(String(describing: aaa?.lastPathComponent!))\".")
print("Started saving \"\(String(describing: aaa?.lastPathComponent!))\".")
if self.saveAudioData(audio: data!, destination: self.documentsUrl.appendingPathComponent(aaa!.lastPathComponent!)! as NSURL ) {
// do what ever if writeToURL was successful
// print("",data)
self.arrayplay.append(aaa!.lastPathComponent!)
self.data1 = self.arrayplay as! [String]
print("data1",self.data1)
print("",self.data1.count)
if self.data1.count == self.musicUrls.count {
print("complete")
self.downloadDataAnnotation()
}
//self.synk.complete()
// print("abc")
} else {
// print("The File \"\(url.lastPathComponent!.stringByDeletingPathExtension)\" was not saved.")
}
}
}
}
}
}
task.resume()
}
}
}
Can any one suggest me the better code or any other way to download multiple audio file ...
I am attempting to transfer an image downloaded from facebook but for some reason my transferFile method has stopped working. The same code seemed to be working an hour ago and I cannot find what I have changed in order to cause it to stop working.
I am not getting an error from the delegate method nor is my log being called on the watch's side.
Here is how I am downloading my image and transfering.
func downloadImageToFile(urlString : String, completion: (NSURL?, NSError?) -> Void) {
let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession.init(configuration: config)
let imageURL = NSURL(string: urlString)
session.downloadTaskWithURL(imageURL!, completionHandler:{(locationURL : NSURL?, response: NSURLResponse?, error: NSError?) in
if (error != nil) {
print("Error: " + (error?.description)!)
completion(nil, error)
}
else {
if let data = NSData(contentsOfURL: locationURL!) {
let documentsDirect = self.documentDirectory()
let saveLocation = documentsDirect.URLByAppendingPathComponent("GCD.png")
let saveWasSuccessfull : Bool = data.writeToURL(saveLocation, atomically: true)
dispatch_async(dispatch_get_main_queue(),{
if (saveWasSuccessfull) {
print("Save Was Successful")
completion(saveLocation, nil)
}
else {
completion(nil, error)
}
})
}
else {
print("Data Download Error")
}
}
}).resume()
}
func documentDirectory() -> NSURL {
let fileManager = NSFileManager.defaultManager()
let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
if let documentDirectory: NSURL = urls.first! as NSURL {
return documentDirectory
}
}
ViewController.swift
let downloader = WebImageDownloader()
downloader.downloadImageToFile(string, completion: { (transferLocation, error) in
if (error != nil) {
}
else {
self.session.transferFile(transferLocation!, metadata: nil)
}
})
func session(session: WCSession, didFinishFileTransfer fileTransfer: WCSessionFileTransfer, error: NSError?) {
if error != nil {
print(error?.description)
}
else{
print("Finished File Transfer Successfully")
}
}
Watch
func session(session: WCSession, didReceiveFile file: WCSessionFile) {
print("File Recieved on Watch")
dispatch_async(dispatch_get_main_queue()) { [weak self] in
if let data = NSData(contentsOfURL: file.fileURL) {
self?.photos.append(data)
self?.updateTable()
}
else {
print(file.fileURL)
}
}
}
Any ideas what is going on here? I have no errors logging to work with anything.