diff --git a/Multiplatform/macOS/Info.plist b/Multiplatform/macOS/Info.plist
index 228514a07..0d9d0860c 100644
--- a/Multiplatform/macOS/Info.plist
+++ b/Multiplatform/macOS/Info.plist
@@ -35,5 +35,19 @@
$(ORGANIZATION_IDENTIFIER)
DeveloperEntitlements
$(DEVELOPER_ENTITLEMENTS)
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Viewer
+ CFBundleURLName
+ RSS Feed
+ CFBundleURLSchemes
+
+ feed
+ feeds
+
+
+
diff --git a/Multiplatform/macOS/Preferences/MacPreferencesModel.swift b/Multiplatform/macOS/Preferences/MacPreferencesModel.swift
index 12ac839f6..765ceffaf 100644
--- a/Multiplatform/macOS/Preferences/MacPreferencesModel.swift
+++ b/Multiplatform/macOS/Preferences/MacPreferencesModel.swift
@@ -28,8 +28,20 @@ enum PreferencePane: Int, CaseIterable {
class MacPreferencesModel: ObservableObject {
@Published var currentPreferencePane: PreferencePane = PreferencePane.general
- @Published var rssReaders = Array(RSSReaderInfo.fetchRSSReaders(nil))
- @Published var rssReaderSelection: Set = RSSReaderInfo.fetchRSSReaders(nil)
+ @Published var rssReaders = [RSSReader]()
+ @Published var readerSelection: Int = 0 {
+ willSet {
+ if newValue != readerSelection {
+ registerAppWithBundleID(rssReaders[newValue].bundleID)
+ }
+ }
+ }
+
+ private let readerInfo = RSSReaderInfo()
+
+ init() {
+ prepareRSSReaders()
+ }
}
@@ -38,20 +50,27 @@ class MacPreferencesModel: ObservableObject {
private extension MacPreferencesModel {
func prepareRSSReaders() {
- // Top item should always be: NetNewsWire (this app)
- // Additional items should be sorted alphabetically.
- // Any older versions of NetNewsWire should be listed as: NetNewsWire (old version)
-
-
+ // Populate rssReaders
+ var thisApp = RSSReader(bundleID: Bundle.main.bundleIdentifier!)
+ thisApp?.nameMinusAppSuffix.append(" (this app—multiplatform)")
+ let otherRSSReaders = readerInfo.rssReaders.filter { $0.bundleID != Bundle.main.bundleIdentifier! }.sorted(by: { $0.nameMinusAppSuffix < $1.nameMinusAppSuffix })
+ rssReaders.append(thisApp!)
+ rssReaders.append(contentsOf: otherRSSReaders)
+ if readerInfo.defaultRSSReaderBundleID != nil {
+ let defaultReader = rssReaders.filter({ $0.bundleID == readerInfo.defaultRSSReaderBundleID })
+ if defaultReader.count == 1 {
+ let reader = defaultReader[0]
+ readerSelection = rssReaders.firstIndex(of: reader)!
+ }
+ }
}
func registerAppWithBundleID(_ bundleID: String) {
NSWorkspace.shared.setDefaultAppBundleID(forURLScheme: "feed", to: bundleID)
NSWorkspace.shared.setDefaultAppBundleID(forURLScheme: "feeds", to: bundleID)
- objectWillChange.send()
}
}
@@ -61,23 +80,20 @@ private extension MacPreferencesModel {
struct RSSReaderInfo {
- let defaultRSSReaderBundleID: String?
+ var defaultRSSReaderBundleID: String? {
+ NSWorkspace.shared.defaultAppBundleID(forURLScheme: RSSReaderInfo.feedURLScheme)
+ }
let rssReaders: Set
static let feedURLScheme = "feed:"
init() {
- let defaultRSSReaderBundleID = NSWorkspace.shared.defaultAppBundleID(forURLScheme: RSSReaderInfo.feedURLScheme)
- self.defaultRSSReaderBundleID = defaultRSSReaderBundleID
- self.rssReaders = RSSReaderInfo.fetchRSSReaders(defaultRSSReaderBundleID)
+ self.rssReaders = RSSReaderInfo.fetchRSSReaders()
}
- static func fetchRSSReaders(_ defaultRSSReaderBundleID: String?) -> Set {
+ static func fetchRSSReaders() -> Set {
let rssReaderBundleIDs = NSWorkspace.shared.bundleIDsForApps(forURLScheme: feedURLScheme)
var rssReaders = Set()
- if let defaultRSSReaderBundleID = defaultRSSReaderBundleID, let defaultReader = RSSReader(bundleID: defaultRSSReaderBundleID) {
- rssReaders.insert(defaultReader)
- }
rssReaderBundleIDs.forEach { (bundleID) in
if let reader = RSSReader(bundleID: bundleID) {
rssReaders.insert(reader)
@@ -94,7 +110,7 @@ struct RSSReader: Hashable {
let bundleID: String
let name: String
- let nameMinusAppSuffix: String
+ var nameMinusAppSuffix: String
let path: String
init?(bundleID: String) {
diff --git a/Multiplatform/macOS/Preferences/Preference Panes/GeneralPreferencesView.swift b/Multiplatform/macOS/Preferences/Preference Panes/GeneralPreferencesView.swift
index e67c91f12..f20bc1095 100644
--- a/Multiplatform/macOS/Preferences/Preference Panes/GeneralPreferencesView.swift
+++ b/Multiplatform/macOS/Preferences/Preference Panes/GeneralPreferencesView.swift
@@ -18,14 +18,16 @@ struct GeneralPreferencesView: View {
selection: $defaults.interval,
content: {
ForEach(RefreshInterval.allCases, content: { interval in
- Text(interval.description()).tag(interval.rawValue)
+ Text(interval.description())
+ .tag(interval.rawValue)
})
})
.frame(width: 300, alignment: .center)
- Picker("Default RSS reader", selection: $preferences.rssReaderSelection, content: {
- ForEach(0..