diff --git a/Common/RealmConfiguration.swift b/Common/RealmConfiguration.swift index ebabd66..9ee5b6d 100644 --- a/Common/RealmConfiguration.swift +++ b/Common/RealmConfiguration.swift @@ -14,7 +14,7 @@ let kRealmDefaultConfiguration = { let fileUrl = groupUrl?.appendingPathComponent("bark.realm") let config = Realm.Configuration( fileURL: fileUrl, - schemaVersion: 15, + schemaVersion: 16, migrationBlock: { migration, oldSchemaVersion in switch oldSchemaVersion { case 0...13: diff --git a/Model/Message.swift b/Model/Message.swift index 8aa9eaa..93adbc8 100644 --- a/Model/Message.swift +++ b/Model/Message.swift @@ -15,6 +15,7 @@ class Message: Object { @objc dynamic var subtitle: String? @objc dynamic var body: String? @objc dynamic var url: String? + @objc dynamic var image: String? @objc dynamic var group: String? @objc dynamic var createDate: Date? diff --git a/Model/MessageItemModel.swift b/Model/MessageItemModel.swift index 50c8c07..8cd83e1 100644 --- a/Model/MessageItemModel.swift +++ b/Model/MessageItemModel.swift @@ -6,6 +6,7 @@ // Copyright © 2024 Fin. All rights reserved. // +import Kingfisher import UIKit enum MessageListCellDateStyle { @@ -22,6 +23,8 @@ class MessageItemModel { var attributedText: NSAttributedString? var dateText: String? + var image: String? + var createDate: Date? var dateStyle: MessageListCellDateStyle = .relative { didSet { @@ -90,6 +93,7 @@ class MessageItemModel { self.attributedText = text self.createDate = message.createDate + self.image = message.image defer { self.dateStyle = .relative } diff --git a/NotificationServiceExtension/Processor/ArchiveProcessor.swift b/NotificationServiceExtension/Processor/ArchiveProcessor.swift index 74515b9..b8f2aae 100644 --- a/NotificationServiceExtension/Processor/ArchiveProcessor.swift +++ b/NotificationServiceExtension/Processor/ArchiveProcessor.swift @@ -30,6 +30,7 @@ class ArchiveProcessor: NotificationContentProcessor { let body = alert?["body"] as? String let url = userInfo["url"] as? String let group = userInfo["group"] as? String + let image = userInfo["image"] as? String try? realm?.write { let message = Message() @@ -37,6 +38,7 @@ class ArchiveProcessor: NotificationContentProcessor { message.subtitle = subtitle message.body = body message.url = url + message.image = image message.group = group message.createDate = Date() realm?.add(message) diff --git a/Podfile b/Podfile index 780570c..0c66707 100644 --- a/Podfile +++ b/Podfile @@ -28,6 +28,7 @@ def pods pod 'Kingfisher' pod 'MercariQRScanner', :git => 'https://github.com/Finb/QRScanner' pod 'DropDown' + pod 'ImageViewer.swift' pod 'SwiftyStoreKit' end diff --git a/Podfile.lock b/Podfile.lock index 37f8a70..bffcec0 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -5,6 +5,7 @@ PODS: - Differentiator (5.0.0) - DropDown (2.3.13) - FDFullscreenPopGesture (1.1) + - ImageViewer.swift (3.3.8) - IQKeyboardCore (1.0.7) - IQKeyboardManagerSwift/Core (8.0.0): - IQKeyboardNotification @@ -74,6 +75,7 @@ DEPENDENCIES: - DefaultsKit - DropDown - FDFullscreenPopGesture + - ImageViewer.swift - IQKeyboardManagerSwift/IQKeyboardToolbarManager - Kingfisher - Material @@ -100,6 +102,7 @@ SPEC REPOS: - Differentiator - DropDown - FDFullscreenPopGesture + - ImageViewer.swift - IQKeyboardCore - IQKeyboardManagerSwift - IQKeyboardNotification @@ -141,6 +144,7 @@ SPEC CHECKSUMS: Differentiator: e8497ceab83c1b10ca233716d547b9af21b9344d DropDown: 8a2116376c1981888557f72ec2ffc9a5e0e456ec FDFullscreenPopGesture: a8a620179e3d9c40e8e00256dcee1c1a27c6d0f0 + ImageViewer.swift: 284cd8127d31af8e5938674fb9f8e695a4cdf6c6 IQKeyboardCore: cb7f0a9a17dd32599569f2f478c1418dc28bcebb IQKeyboardManagerSwift: 0c6fbbaa2e60739e48d7cf59f25661471a7a3a65 IQKeyboardNotification: d7382c4466c5a5adef92c7452ebf861b36050088 @@ -167,6 +171,6 @@ SPEC CHECKSUMS: SwiftyJSON: f5b1bf1cd8dd53cd25887ac0eabcfd92301c6a5a SwiftyStoreKit: 6b9c08810269f030586dac1fae8e75871a82e84a -PODFILE CHECKSUM: a7da3cf53c17d876cd2e822046dc7499c69fe470 +PODFILE CHECKSUM: 3d8263a3dcdc33edad82e369b6e182961d45cc98 COCOAPODS: 1.16.2 diff --git a/View/MessageList/MessageItemView.swift b/View/MessageList/MessageItemView.swift index a4c9db9..59a9981 100644 --- a/View/MessageList/MessageItemView.swift +++ b/View/MessageList/MessageItemView.swift @@ -6,6 +6,8 @@ // Copyright © 2024 Fin. All rights reserved. // +import ImageViewer_swift +import Kingfisher import UIKit class MessageItemView: UIView { @@ -13,6 +15,7 @@ class MessageItemView: UIView { let view = UIView() view.layer.cornerRadius = 10 view.backgroundColor = BKColor.background.secondary + view.clipsToBounds = true return view }() @@ -33,6 +36,22 @@ class MessageItemView: UIView { return label }() + let imageView: UIImageView = { + let imageView = UIImageView() + imageView.contentMode = .scaleAspectFill + imageView.layer.cornerRadius = 4 + imageView.clipsToBounds = true + return imageView + }() + + let contentStackView: UIStackView = { + let stackView = UIStackView() + stackView.axis = .vertical + stackView.spacing = 8 + stackView.alignment = .fill + return stackView + }() + let dateLabel: UILabel = { let label = BKLabel() label.hitTestSlop = UIEdgeInsets(top: -5, left: -5, bottom: -5, right: -5) @@ -69,13 +88,23 @@ class MessageItemView: UIView { var tapAction: ((_ message: MessageItemModel, _ sourceView: UIView) -> Void)? + /// 用于查找通知扩展缓存的图片 + lazy var imageCache: ImageCache = { + let groupUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.bark") + let cache = try? ImageCache(name: "shared", cacheDirectoryURL: groupUrl) + + return cache ?? KingfisherManager.shared.cache + }() + init() { super.init(frame: .zero) self.backgroundColor = BKColor.background.primary self.addSubview(panel) - panel.addSubview(bodyLabel) + panel.addSubview(contentStackView) panel.addSubview(dateLabel) panel.addSubview(blackMaskView) + contentStackView.addArrangedSubview(bodyLabel) + contentStackView.addArrangedSubview(imageView) layoutView() @@ -104,17 +133,20 @@ class MessageItemView: UIView { } func layoutView() { - bodyLabel.snp.makeConstraints { make in + contentStackView.snp.makeConstraints { make in make.top.equalTo(16) make.left.equalTo(12) make.right.equalTo(-12) } + imageView.snp.makeConstraints { make in + make.width.equalTo(UIScreen.main.bounds.width - 24) + make.height.equalTo((UIScreen.main.bounds.width - 24) / 2) + } dateLabel.snp.makeConstraints { make in - make.left.equalTo(bodyLabel) - make.top.equalTo(bodyLabel.snp.bottom).offset(12) + make.left.equalTo(contentStackView) + make.top.equalTo(contentStackView.snp.bottom).offset(12) make.bottom.equalTo(panel).offset(-12).priority(.medium) } - panel.snp.makeConstraints { make in make.left.equalToSuperview().offset(16) make.right.equalToSuperview().offset(-16) @@ -136,5 +168,15 @@ extension MessageItemView { func setMessage(message: MessageItemModel) { self.bodyLabel.attributedText = message.attributedText self.dateLabel.text = message.dateText + if let image = message.image { + imageView.isHidden = false + imageView.kf.setImage(with: URL(string: image), options: [.targetCache(imageCache)]) { [weak self] _ in + // 获取系统是否是夜间模式 + let isDarkMode = UIScreen.main.traitCollection.userInterfaceStyle == .dark + self?.imageView.setupImageViewer(options: [.closeIcon(UIImage(named: "back")!), .theme(isDarkMode ? .dark : .light)]) + } + } else { + imageView.isHidden = true + } } }