From 78bb1c6a6c1b71d5085be485c9c931d2db9cab89 Mon Sep 17 00:00:00 2001 From: Jojo Feng Date: Wed, 14 Aug 2024 21:12:24 -0700 Subject: [PATCH] fix: empty data from share extension. (#453) --- .../ActionViewController.swift | 6 +-- ios/Runner.xcodeproj/project.pbxproj | 46 ++++++++++-------- ios/Runner/AppDelegate.swift | 2 +- ios/Runner/Info.plist | 4 +- ios/Share Extension/ShareViewController.swift | 47 ++++++++++--------- 5 files changed, 57 insertions(+), 48 deletions(-) diff --git a/ios/Action Extension/ActionViewController.swift b/ios/Action Extension/ActionViewController.swift index 6683bcdc..492a4cdc 100644 --- a/ios/Action Extension/ActionViewController.swift +++ b/ios/Action Extension/ActionViewController.swift @@ -13,7 +13,7 @@ class ActionViewController: UIViewController { let hostAppBundleIdentifier = "com.jiaqi.hacki" let sharedKey = "ShareKey" var sharedText: [String] = [] - let urlContentType = kUTTypeURL as String + let urlContentType = UTType.url @IBOutlet weak var imageView: UIImageView! override func viewDidLoad() { @@ -32,7 +32,7 @@ class ActionViewController: UIViewController { } private func handleUrl (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: urlContentType, options: nil) { [weak self] data, error in + attachment.loadItem(forTypeIdentifier: urlContentType.identifier, options: nil) { [weak self] data, error in if error == nil, let item = data as? URL, let this = self { this.sharedText.append(item.absoluteString) @@ -66,7 +66,7 @@ class ActionViewController: UIViewController { } private func redirectToHostApp() { - let url = URL(string: "ShareMedia://dataUrl=\(sharedKey)#text") + let url = URL(string: "ShareMedia-\(hostAppBundleIdentifier)://dataUrl=\(sharedKey)#text") var responder = self as UIResponder? let selectorOpenURL = sel_registerName("openURL:") diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 1c124b82..1c3b0bbe 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -231,11 +231,11 @@ buildPhases = ( E2E6E097A94005D9196D0A71 /* [CP] Check Pods Manifest.lock */, 9705A1C41CF9048500538489 /* Embed Frameworks */, - E51D52B8283B464E00FC8DD8 /* Embed App Extensions */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, + E51D52B8283B464E00FC8DD8 /* Embed App Extensions */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, F1959755D5521D58CA193498 /* [CP] Embed Pods Frameworks */, ); @@ -387,7 +387,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; E2E6E097A94005D9196D0A71 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -537,6 +537,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -549,6 +550,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -567,7 +569,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = ""; DEVELOPMENT_TEAM = QMWX3X2NF7; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -578,7 +580,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.3.0; + MARKETING_VERSION = ""; PRODUCT_BUNDLE_IDENTIFIER = com.jiaqi.hacki; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -619,6 +621,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -637,6 +640,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -674,6 +678,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -686,6 +691,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.0; + MARKETING_VERSION = "$(FLUTTER_BUILD_NAME)"; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -706,7 +712,7 @@ CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = ""; DEVELOPMENT_TEAM = QMWX3X2NF7; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; @@ -717,7 +723,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.3.0; + MARKETING_VERSION = ""; PRODUCT_BUNDLE_IDENTIFIER = com.jiaqi.hacki; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -740,7 +746,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = ""; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = QMWX3X2NF7; ENABLE_BITCODE = NO; @@ -752,7 +758,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.3.0; + MARKETING_VERSION = ""; PRODUCT_BUNDLE_IDENTIFIER = com.jiaqi.hacki; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -776,7 +782,7 @@ CODE_SIGN_ENTITLEMENTS = "Share Extension/Share Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = ""; DEVELOPMENT_TEAM = QMWX3X2NF7; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -789,7 +795,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = ""; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.jiaqi.hacki.Share-Extension"; @@ -817,7 +823,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = ""; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = QMWX3X2NF7; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -831,7 +837,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = ""; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.jiaqi.hacki.Share-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -856,7 +862,7 @@ CODE_SIGN_ENTITLEMENTS = "Share Extension/Share Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = ""; DEVELOPMENT_TEAM = QMWX3X2NF7; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -869,7 +875,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = ""; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.jiaqi.hacki.Share-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -895,7 +901,7 @@ CODE_SIGN_ENTITLEMENTS = "Action Extension/Action Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = ""; DEVELOPMENT_TEAM = QMWX3X2NF7; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -908,7 +914,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = ""; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.jiaqi.hacki.Action-Extension"; @@ -938,7 +944,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = ""; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = QMWX3X2NF7; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -952,7 +958,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = ""; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.jiaqi.hacki.Action-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -979,7 +985,7 @@ CODE_SIGN_ENTITLEMENTS = "Action Extension/Action Extension.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + CURRENT_PROJECT_VERSION = ""; DEVELOPMENT_TEAM = QMWX3X2NF7; GCC_C_LANGUAGE_STANDARD = gnu11; GENERATE_INFOPLIST_FILE = YES; @@ -992,7 +998,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = ""; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.jiaqi.hacki.Action-Extension"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index d980181b..108bda2f 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -22,7 +22,7 @@ import flutter_local_notifications WorkmanagerPlugin.registerTask(withIdentifier: "workmanager.background.task") if #available(iOS 10.0, *) { - UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate + UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate } UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(60*15)) diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 83aa14cd..151ab0f9 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -33,7 +33,7 @@ Editor CFBundleURLSchemes - ShareMedia + ShareMedia-$(PRODUCT_BUNDLE_IDENTIFIER) @@ -82,5 +82,7 @@ UIStatusBarHidden + AppGroupId + group.com.jiaqi.hacki diff --git a/ios/Share Extension/ShareViewController.swift b/ios/Share Extension/ShareViewController.swift index e6291e65..48c3608a 100644 --- a/ios/Share Extension/ShareViewController.swift +++ b/ios/Share Extension/ShareViewController.swift @@ -8,11 +8,11 @@ class ShareViewController: SLComposeServiceViewController { let sharedKey = "ShareKey" var sharedMedia: [SharedMediaFile] = [] var sharedText: [String] = [] - let imageContentType = kUTTypeImage as String - let videoContentType = kUTTypeMovie as String - let textContentType = kUTTypeText as String - let urlContentType = kUTTypeURL as String - let fileURLType = kUTTypeFileURL as String; + let imageContentType = UTType.image + let videoContentType = UTType.movie + let textContentType = UTType.text + let urlContentType = UTType.url + let fileURLType = UTType.fileURL override func isContentValid() -> Bool { return true @@ -29,15 +29,15 @@ class ShareViewController: SLComposeServiceViewController { if let content = extensionContext!.inputItems[0] as? NSExtensionItem { if let contents = content.attachments { for (index, attachment) in (contents).enumerated() { - if attachment.hasItemConformingToTypeIdentifier(imageContentType) { + if attachment.hasItemConformingToTypeIdentifier(imageContentType.identifier) { handleImages(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(textContentType) { + } else if attachment.hasItemConformingToTypeIdentifier(textContentType.identifier) { handleText(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(fileURLType) { + } else if attachment.hasItemConformingToTypeIdentifier(fileURLType.identifier) { handleFiles(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(urlContentType) { + } else if attachment.hasItemConformingToTypeIdentifier(urlContentType.identifier) { handleUrl(content: content, attachment: attachment, index: index) - } else if attachment.hasItemConformingToTypeIdentifier(videoContentType) { + } else if attachment.hasItemConformingToTypeIdentifier(videoContentType.identifier) { handleVideos(content: content, attachment: attachment, index: index) } } @@ -55,8 +55,8 @@ class ShareViewController: SLComposeServiceViewController { } private func handleText (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: textContentType, options: nil) { [weak self] data, error in - + attachment.loadItem(forTypeIdentifier: textContentType.identifier, options: nil) { [weak self] data, error in + if error == nil, let item = data as? String, let this = self { this.sharedText.append(item) @@ -76,8 +76,8 @@ class ShareViewController: SLComposeServiceViewController { } private func handleUrl (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: urlContentType, options: nil) { [weak self] data, error in - + attachment.loadItem(forTypeIdentifier: urlContentType.identifier, options: nil) { [weak self] data, error in + if error == nil, let item = data as? URL, let this = self { this.sharedText.append(item.absoluteString) @@ -87,6 +87,7 @@ class ShareViewController: SLComposeServiceViewController { let userDefaults = UserDefaults(suiteName: "group.\(this.hostAppBundleIdentifier)") userDefaults?.set(this.sharedText, forKey: this.sharedKey) userDefaults?.synchronize() + this.redirectToHostApp(type: .text) } @@ -97,8 +98,8 @@ class ShareViewController: SLComposeServiceViewController { } private func handleImages (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: imageContentType, options: nil) { [weak self] data, error in - + attachment.loadItem(forTypeIdentifier: imageContentType.identifier, options: nil) { [weak self] data, error in + if error == nil, let url = data as? URL, let this = self { // Always copy @@ -126,8 +127,8 @@ class ShareViewController: SLComposeServiceViewController { } private func handleVideos (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: videoContentType, options: nil) { [weak self] data, error in - + attachment.loadItem(forTypeIdentifier: videoContentType.identifier, options: nil) { [weak self] data, error in + if error == nil, let url = data as? URL, let this = self { // Always copy @@ -158,8 +159,8 @@ class ShareViewController: SLComposeServiceViewController { } private func handleFiles (content: NSExtensionItem, attachment: NSItemProvider, index: Int) { - attachment.loadItem(forTypeIdentifier: fileURLType, options: nil) { [weak self] data, error in - + attachment.loadItem(forTypeIdentifier: fileURLType.identifier, options: nil) { [weak self] data, error in + if error == nil, let url = data as? URL, let this = self { // Always copy @@ -199,10 +200,10 @@ class ShareViewController: SLComposeServiceViewController { } private func redirectToHostApp(type: RedirectType) { - let url = URL(string: "ShareMedia://dataUrl=\(sharedKey)#\(type)") + let url = URL(string: "ShareMedia-\(hostAppBundleIdentifier)://dataUrl=\(sharedKey)#\(type)") var responder = self as UIResponder? let selectorOpenURL = sel_registerName("openURL:") - + while (responder != nil) { if (responder?.responds(to: selectorOpenURL))! { let _ = responder?.perform(selectorOpenURL, with: url) @@ -311,7 +312,7 @@ class ShareViewController: SLComposeServiceViewController { // Debug method to print out SharedMediaFile details in the console func toString() { - print("[SharedMediaFile] \n\tpath: \(self.path)\n\tthumbnail: \(self.thumbnail)\n\tduration: \(self.duration)\n\ttype: \(self.type)") + print("[SharedMediaFile] \n\tpath: \(self.path)\n\tthumbnail: \(String(describing: self.thumbnail))\n\tduration: \(String(describing: self.duration))\n\ttype: \(self.type)") } }