增加 Markdown 文件分享支持

This commit is contained in:
2026-07-14 22:29:58 +08:00
parent e19dba594c
commit 3dccd16757
9 changed files with 657 additions and 5 deletions
+100 -3
View File
@@ -8,6 +8,18 @@
<array>
<string>mobilenotes</string>
<string>shareddocuments</string>
<string>noteapp</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.fishestlife.note</string>
<key>CFBundleURLSchemes</key>
<array>
<string>noteapp</string>
</array>
</dict>
</array>
<key>CFBundleDocumentTypes</key>
<array>
@@ -17,26 +29,73 @@
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>net.daringfireball.markdown</string>
<string>public.markdown</string>
<string>public.text</string>
<string>public.plain-text</string>
<string>public.utf8-plain-text</string>
</array>
<key>CFBundleTypeExtensions</key>
<array>
<string>md</string>
<string>markdown</string>
<string>mdown</string>
<string>mkd</string>
<string>mkdn</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>text/markdown</string>
<string>text/x-markdown</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Plain Text File</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.plain-text</string>
<string>public.utf8-plain-text</string>
<string>public.text</string>
</array>
<key>CFBundleTypeExtensions</key>
<array>
<string>txt</string>
<string>text</string>
</array>
</dict>
<dict>
<key>CFBundleTypeName</key>
<string>Any Text or Data File</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSItemContentTypes</key>
<array>
<string>public.data</string>
<string>public.content</string>
<string>public.item</string>
</array>
<key>CFBundleTypeExtensions</key>
<array>
<string>md</string>
<string>markdown</string>
<string>txt</string>
<string>*</string>
</array>
</dict>
</array>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>UTImportedTypeDeclarations</key>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
@@ -54,6 +113,45 @@
<array>
<string>md</string>
<string>markdown</string>
<string>mdown</string>
<string>mkd</string>
<string>mkdn</string>
</array>
<key>public.mime-type</key>
<array>
<string>text/markdown</string>
<string>text/x-markdown</string>
</array>
</dict>
</dict>
</array>
<key>UTImportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.text</string>
<string>public.plain-text</string>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Markdown File</string>
<key>UTTypeIdentifier</key>
<string>net.daringfireball.markdown</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>md</string>
<string>markdown</string>
<string>mdown</string>
<string>mkd</string>
<string>mkdn</string>
</array>
<key>public.mime-type</key>
<array>
<string>text/markdown</string>
<string>text/x-markdown</string>
</array>
</dict>
</dict>
@@ -71,7 +169,6 @@
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
</dict>
</array>
</dict>
+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.fishestlife.note</string>
</array>
</dict>
</plist>
+42 -2
View File
@@ -60,11 +60,17 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
}
private func handleSharedFile(_ url: URL) {
guard url.isFileURL,
let navigationController = window?.rootViewController as? UINavigationController else {
guard let navigationController = window?.rootViewController as? UINavigationController else {
return
}
if url.scheme == "noteapp", url.host == "share" {
handleShareURL(url, navigationController: navigationController)
return
}
guard url.isFileURL else { return }
let shouldStopAccessing = url.startAccessingSecurityScopedResource()
defer {
if shouldStopAccessing {
@@ -86,6 +92,40 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate {
}
}
private func handleShareURL(_ url: URL, navigationController: UINavigationController) {
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let queryItems = components.queryItems else { return }
let fileManager = FileManager.default
let containerURL = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "group.com.fishestlife.note")
let sharedDir = containerURL?.appendingPathComponent("SharedFiles", isDirectory: true)
var contents: [(text: String, fileName: String)] = []
for item in queryItems {
if item.name.hasPrefix("text"), let text = item.value, !text.isEmpty {
contents.append((text: text, fileName: "shared.md"))
} else if item.name.hasPrefix("file"), let fileName = item.value, !fileName.isEmpty {
if let sharedDir = sharedDir {
let fileURL = sharedDir.appendingPathComponent(fileName)
if let text = try? String(contentsOf: fileURL, encoding: .utf8) {
contents.append((text: text, fileName: fileName))
}
}
}
}
guard let first = contents.first else { return }
DispatchQueue.main.async {
let viewController = PreviewViewController()
viewController.initialText = first.text
viewController.fileName = first.fileName
viewController.title = first.fileName
navigationController.pushViewController(viewController, animated: true)
}
}
}