From f5c06bc89cc090f934bf579d1115a19f1f3483bd Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sat, 21 Dec 2024 16:10:53 +0800 Subject: [PATCH] :bug: Bug fixes on iOS native image --- ios/Podfile | 5 ++ ios/Podfile.lock | 2 +- ios/Runner.xcodeproj/project.pbxproj | 38 +++++++++- .../NotificationService.swift | 74 ++++--------------- ios/SolarWidget/RandomPostWidget.swift | 7 +- macos/Podfile.lock | 4 +- pubspec.yaml | 2 +- 7 files changed, 67 insertions(+), 65 deletions(-) diff --git a/ios/Podfile b/ios/Podfile index 7af792c..2e353a9 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -36,6 +36,11 @@ target 'Runner' do inherit! :search_paths end + target 'SolarNotifyService' do + inherit! :search_paths + pod 'Kingfisher', '~> 8.0' + end + target 'SolarWidgetExtension' do inherit! :search_paths pod 'Kingfisher', '~> 8.0' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 918fec9..6cad00e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -394,6 +394,6 @@ SPEC CHECKSUMS: WebRTC-SDK: 79942c006ea64f6fb48d7da8a4786dfc820bc1db workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6 -PODFILE CHECKSUM: f36978bb00ec01cd27f69faaf9a821024de98fcc +PODFILE CHECKSUM: 91f63c7518ec23e05bec109c56194c4b282abbd1 COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 2ba3a46..8cf6749 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 77; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -22,6 +22,7 @@ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + A0DA907BED0C7BC1351253EC /* Pods_SolarNotifyService.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B83A5C5D84D0F730A80A03E3 /* Pods_SolarNotifyService.framework */; }; CED170BFB6A72CDDAC285637 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EDF483E994343CDFBF9BA347 /* Pods_Runner.framework */; }; F51C4E3C8FA95426C91FC0A4 /* Pods_SolarShare.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 16F41E029731EA30268EDE2A /* Pods_SolarShare.framework */; }; /* End PBXBuildFile section */ @@ -96,6 +97,7 @@ 40B53769EB464E54DACA7CE4 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 48AE73F9950AF4FB02B5E9F4 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 4A2F84B6033057E3BD2C7CB8 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 4CBF45ABD292EE527D0A4D1E /* Pods-SolarNotifyService.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarNotifyService.profile.xcconfig"; path = "Target Support Files/Pods-SolarNotifyService/Pods-SolarNotifyService.profile.xcconfig"; sourceTree = ""; }; 5922A50B1231B06B92E31F20 /* Pods-SolarShare.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarShare.debug.xcconfig"; path = "Target Support Files/Pods-SolarShare/Pods-SolarShare.debug.xcconfig"; sourceTree = ""; }; 64FBE78F9C282712818D6D95 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; 6618E2E3015264643175B43D /* Pods-SolarWidgetExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarWidgetExtension.release.xcconfig"; path = "Target Support Files/Pods-SolarWidgetExtension/Pods-SolarWidgetExtension.release.xcconfig"; sourceTree = ""; }; @@ -120,7 +122,10 @@ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; A2C24C5238FAC44EA2CCF738 /* GoogleService-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "Runner/GoogleService-Info.plist"; sourceTree = ""; }; B1763F1D7318A2745CA7EDFE /* Pods-SolarShare.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarShare.release.xcconfig"; path = "Target Support Files/Pods-SolarShare/Pods-SolarShare.release.xcconfig"; sourceTree = ""; }; + B83A5C5D84D0F730A80A03E3 /* Pods_SolarNotifyService.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SolarNotifyService.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BCE0C4086B776A27B202B373 /* Pods-SolarWidgetExtension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarWidgetExtension.profile.xcconfig"; path = "Target Support Files/Pods-SolarWidgetExtension/Pods-SolarWidgetExtension.profile.xcconfig"; sourceTree = ""; }; + D7E1FA77FDA53439DB2C0E75 /* Pods-SolarNotifyService.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarNotifyService.release.xcconfig"; path = "Target Support Files/Pods-SolarNotifyService/Pods-SolarNotifyService.release.xcconfig"; sourceTree = ""; }; + D96D1DB4ED46A2640C1B9D34 /* Pods-SolarNotifyService.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SolarNotifyService.debug.xcconfig"; path = "Target Support Files/Pods-SolarNotifyService/Pods-SolarNotifyService.debug.xcconfig"; sourceTree = ""; }; EDF483E994343CDFBF9BA347 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F357CFDA89A0D9E5692846D4 /* Pods_SolarWidgetExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_SolarWidgetExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -238,6 +243,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + A0DA907BED0C7BC1351253EC /* Pods_SolarNotifyService.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -269,6 +275,7 @@ 731B7B6D2D0D6CE000CEB9B7 /* SwiftUI.framework */, 16F41E029731EA30268EDE2A /* Pods_SolarShare.framework */, F357CFDA89A0D9E5692846D4 /* Pods_SolarWidgetExtension.framework */, + B83A5C5D84D0F730A80A03E3 /* Pods_SolarNotifyService.framework */, ); name = Frameworks; sourceTree = ""; @@ -354,6 +361,9 @@ 2134F3903A0E8EB8CC2670BE /* Pods-SolarWidgetExtension.debug.xcconfig */, 6618E2E3015264643175B43D /* Pods-SolarWidgetExtension.release.xcconfig */, BCE0C4086B776A27B202B373 /* Pods-SolarWidgetExtension.profile.xcconfig */, + D96D1DB4ED46A2640C1B9D34 /* Pods-SolarNotifyService.debug.xcconfig */, + D7E1FA77FDA53439DB2C0E75 /* Pods-SolarNotifyService.release.xcconfig */, + 4CBF45ABD292EE527D0A4D1E /* Pods-SolarNotifyService.profile.xcconfig */, ); path = Pods; sourceTree = ""; @@ -427,6 +437,7 @@ isa = PBXNativeTarget; buildConfigurationList = 73DA8A072D05C7620024A03E /* Build configuration list for PBXNativeTarget "SolarNotifyService" */; buildPhases = ( + 50F5704AB2E7309C916CA2E7 /* [CP] Check Pods Manifest.lock */, 73DA89F62D05C7620024A03E /* Sources */, 73DA89F72D05C7620024A03E /* Frameworks */, 73DA89F82D05C7620024A03E /* Resources */, @@ -622,6 +633,28 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; + 50F5704AB2E7309C916CA2E7 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-SolarNotifyService-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 738C1EBE2D0D76C500A215F3 /* Copy Bundle Version */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1229,6 +1262,7 @@ }; 73DA8A032D05C7620024A03E /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = D96D1DB4ED46A2640C1B9D34 /* Pods-SolarNotifyService.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1270,6 +1304,7 @@ }; 73DA8A042D05C7620024A03E /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = D7E1FA77FDA53439DB2C0E75 /* Pods-SolarNotifyService.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; @@ -1308,6 +1343,7 @@ }; 73DA8A052D05C7620024A03E /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 4CBF45ABD292EE527D0A4D1E /* Pods-SolarNotifyService.profile.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; diff --git a/ios/SolarNotifyService/NotificationService.swift b/ios/SolarNotifyService/NotificationService.swift index bb89595..72b31f2 100644 --- a/ios/SolarNotifyService/NotificationService.swift +++ b/ios/SolarNotifyService/NotificationService.swift @@ -7,6 +7,7 @@ import UserNotifications import Intents +import Kingfisher enum ParseNotificationPayloadError: Error { case missingMetadata(String) @@ -18,58 +19,6 @@ class NotificationService: UNNotificationServiceExtension { private var contentHandler: ((UNNotificationContent) -> Void)? private var bestAttemptContent: UNMutableNotificationContent? - private func fetchAvatarImage(from url: String, completion: @escaping (INImage?) -> Void) { - guard let imageURL = URL(string: url) else { - completion(nil) - return - } - - // Define a cache location based on the URL hash - let cacheFileName = imageURL.lastPathComponent - let tempDirectory = FileManager.default.temporaryDirectory - let cachedFileUrl = tempDirectory.appendingPathComponent(cacheFileName) - - // Check if the image is already cached - if FileManager.default.fileExists(atPath: cachedFileUrl.path) { - do { - let data = try Data(contentsOf: cachedFileUrl) - let cachedImage = INImage(imageData: data) // No optional binding here - completion(cachedImage) - return - } catch { - print("Failed to load cached avatar image: \(error.localizedDescription)") - try? FileManager.default.removeItem(at: cachedFileUrl) // Clear corrupted cache - } - } - - // Download the image if not cached - let session = URLSession(configuration: .default) - session.downloadTask(with: imageURL) { localUrl, response, error in - if let error = error { - print("Failed to fetch avatar image: \(error.localizedDescription)") - completion(nil) - return - } - - guard let localUrl = localUrl, let data = try? Data(contentsOf: localUrl) else { - print("Failed to fetch data for avatar image.") - completion(nil) - return - } - - do { - // Cache the downloaded file - try FileManager.default.moveItem(at: localUrl, to: cachedFileUrl) - } catch { - print("Failed to cache avatar image: \(error.localizedDescription)") - } - - // Create INImage from the downloaded data - let inImage = INImage(imageData: data) // Create directly - completion(inImage) - }.resume() - } - override func didReceive( _ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void @@ -112,16 +61,23 @@ class NotificationService: UNNotificationServiceExtension { throw ParseNotificationPayloadError.missingAvatarUrl("The notification has no avatar.") } + let metadataCopy = metadata as? [String: String] ?? [:] let avatarUrl = getAttachmentUrl(for: avatarIdentifier) - fetchAvatarImage(from: avatarUrl) { [weak self] inImage in - guard let self = self else { return } - - let handle = INPersonHandle(value: "\(metadata["user_id"] ?? "")", type: .unknown) + KingfisherManager.shared.retrieveImage(with: URL(string: avatarUrl)!, completionHandler: { result in + var image: Data? + switch result { + case .success(let value): + image = value.image.pngData() + case .failure(let error): + print("Unable to get avatar url: \(error)") + } + + let handle = INPersonHandle(value: "\(metadataCopy["user_id"] ?? "")", type: .unknown) let sender = INPerson( personHandle: handle, nameComponents: nil, displayName: content.title, - image: inImage, + image: image == nil ? nil : INImage(imageData: image!), contactIdentifier: nil, customIdentifier: nil ) @@ -132,12 +88,12 @@ class NotificationService: UNNotificationServiceExtension { let updatedContent = try? request.content.updating(from: intent) self.contentHandler?(updatedContent ?? content) } else { - let intent = self.createMessageIntent(with: sender, metadata: metadata, body: content.body) + let intent = self.createMessageIntent(with: sender, metadata: metadataCopy, body: content.body) self.donateInteraction(for: intent) let updatedContent = try? request.content.updating(from: intent) self.contentHandler?(updatedContent ?? content) } - } + }) } private func handleDefaultNotification(content: UNMutableNotificationContent) throws { diff --git a/ios/SolarWidget/RandomPostWidget.swift b/ios/SolarWidget/RandomPostWidget.swift index ce85cfa..d7d292f 100644 --- a/ios/SolarWidget/RandomPostWidget.swift +++ b/ios/SolarWidget/RandomPostWidget.swift @@ -76,13 +76,18 @@ struct RandomPostWidgetEntryView : View { KFImage.url(URL(string: avatarUrl)) .resizable() - .setProcessor(ResizingImageProcessor(referenceSize: CGSize(width: size, height: size), mode: .aspectFit)) + .setProcessor(DownsamplingImageProcessor(size: CGSize(width: size, height: size))) + .transition(.opacity) .aspectRatio(contentMode: .fit) .frame(width: size, height: size) .cornerRadius(size / 2) .frame(width: size, height: size, alignment: .center) } + Text(randomPost.publisher.nick) + .font(.system(size: 15)) + .opacity(0.9) + Text("@\(randomPost.publisher.name)") .font(.system(size: 13, design: .monospaced)) .opacity(0.9) diff --git a/macos/Podfile.lock b/macos/Podfile.lock index d378ea2..33f68e6 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -26,7 +26,7 @@ PODS: - Firebase/Analytics (= 11.4.0) - firebase_core - FlutterMacOS - - firebase_core (3.8.1): + - firebase_core (3.9.0): - Firebase/CoreOnly (~> 11.4.0) - FlutterMacOS - firebase_messaging (15.1.6): @@ -279,7 +279,7 @@ SPEC CHECKSUMS: file_selector_macos: cc3858c981fe6889f364731200d6232dac1d812d Firebase: cf1b19f21410b029b6786a54e9764a0cacad3c99 firebase_analytics: a80b3d6645f2f12d626fde928b61dae12e5ea2ef - firebase_core: e4a35c426636a2cce00a5163df7ba69bfd0cca57 + firebase_core: 1dfe1f4d02ad78be0277e320aa3d8384cf46231f firebase_messaging: 61f678060b69a7ae1013e3a939ec8e1c56ef6fcf FirebaseAnalytics: 3feef9ae8733c567866342a1000691baaa7cad49 FirebaseCore: e0510f1523bc0eb21653cac00792e1e2bd6f1771 diff --git a/pubspec.yaml b/pubspec.yaml index 3998aa5..3f07b1a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 2.1.1+34 +version: 2.1.1+35 environment: sdk: ^3.5.4