У меня есть приложение и расширение для общего доступа.Расширение запускается на странице arXiv, например this .Затем он извлекает некоторую информацию, включая URL-адрес PDF, и должен сообщить основному приложению о необходимости сохранения данных.
Вот что происходит сейчас:
- Данные извлекаются и помещаются в разныепеременные.
- Создается объект Realm, в котором я сохраняю метаданные для бумаги.
- Диск используется для сохранения файла PDF.
Из того, что я прочитал , я не могу совместно использовать базу данных областей и должен синхронизировать две области.Кроме того, запись файла в общий контейнер кажется ненужной.Поэтому вместо этого я хочу, чтобы приложение share сообщало основному приложению о выполнении команды, которая завершит шаги 2 и 3. В основном приложении.
Вот код, который я написал для 3 шагов:
override func didSelectPost() {
var parameters: [String: String] = [:]
let extensionItem = extensionContext?.inputItems.first as! NSExtensionItem
let itemProvider = extensionItem.attachments?.first as! NSItemProvider
let propertyList = String(kUTTypePropertyList)
if itemProvider.hasItemConformingToTypeIdentifier(propertyList) {
itemProvider.loadItem(forTypeIdentifier: propertyList, options: nil, completionHandler: { (item, error) -> Void in
guard let dictionary = item as? NSDictionary else { return }
OperationQueue.main.addOperation {
if let results = dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as? NSDictionary,
let urlString = results["URL"] as? String,
let pdfString = results["PDF"] as? String,
let title = results["title"] as? String,
let authors = results["authors"] as? String,
let abstract = results["abstract"] as? String,
let year = results["year"] as? String,
let subjects = results["subjects"] as? String,
let url = URL(string: urlString) {
print("URL retrieved: \(urlString)")
print("PDF retrieved: \(pdfString)")
print("Title retrieved: \(title)")
print("Authors retrieved: \(authors)")
print("Abstract retrieved: \(abstract)")
print("Year retrieved: \(year)")
print("Subjects retrieved: \(subjects)")
// TODO: Save the file to a folder, and save the meta-data to the model
let realm = try! Realm()
let article = Article()
article.title = title
article.url = urlString
let ppath = String(urlString.suffix(from: String.Index.init(encodedOffset: 22)))
article.pdfPath = ppath
article.authors = authors
article.subjects = subjects
article.year = year
article.abstract = abstract
try! realm.write {
realm.add(article, update: true)
}
do {
let pdfURL = URL(string: pdfString)
let pdfData = try Data(contentsOf: pdfURL!)
let fileName = String(urlString.suffix(from: String.Index.init(encodedOffset: 22)))
try Disk.save(pdfData, to: .documents, as: "\(fileName).pdf")
} catch {
print("Error")
}
print("Everything went fine.")
}
}
})
} else {
print("error")
}
}
Как заменить часть сохранения звонком в основное приложение?Кроме того, несмотря на то, что приведенный выше код работает нормально, расширение общего ресурса вылетает после его завершения.
Я довольно долго искал расширение Share, но документация Apple находится в Objective C, а остальные учебные пособия не охватываютмой случай.