import Flutter import UIKit public class CustomSocialSharePlugin: NSObject, FlutterPlugin { public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel(name: "custom_social_share", binaryMessenger: registrar.messenger()) let instance = CustomSocialSharePlugin() registrar.addMethodCallDelegate(instance, channel: channel) } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { let content: String if call.arguments == nil { content = "" } else { content = (call.arguments as! [String: Any])["content"] as? String ?? "" } switch call.method { case "sms": let urlSchema = "sms:?&body=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "email": let urlSchema = "mailto:?&body=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "toAll": let textShare = [ content ] let activityViewController = UIActivityViewController(activityItems: textShare , applicationActivities: nil) let controller = UIApplication.shared.keyWindow?.rootViewController activityViewController.popoverPresentationController?.sourceView = controller?.view controller?.present(activityViewController, animated: true) break case "getInstalledApps": var installedApps: [String: Bool] = [:] installedApps["sms"] = canOpenApp(appName: "sms") installedApps["email"] = canOpenApp(appName: "mailto") installedApps["facebook"] = canOpenApp(appName: "fb") installedApps["facebookMessenger"] = canOpenApp(appName: "fb-messenger") installedApps["instagram"] = canOpenApp(appName: "instagram") installedApps["line"] = canOpenApp(appName: "line") installedApps["linkedin"] = canOpenApp(appName: "linkedin") installedApps["reddit"] = canOpenApp(appName: "reddit") installedApps["skype"] = canOpenApp(appName: "skype") installedApps["slack"] = canOpenApp(appName: "slack") installedApps["snapchat"] = canOpenApp(appName: "snapchat") installedApps["telegram"] = canOpenApp(appName: "tg") installedApps["x"] = canOpenApp(appName: "twitter") installedApps["viber"] = canOpenApp(appName: "viber") installedApps["wechat"] = canOpenApp(appName: "weixin") installedApps["whatsapp"] = canOpenApp(appName: "whatsapp") installedApps["threads"] = canOpenApp(appName: "threads") result(installedApps) break case "facebook": let urlSchema = "fb://text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "facebookMessenger": let urlSchema = "fb-messenger://text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "instagram": let urlSchema = "instagram://text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "line": let urlSchema = "https://line.me/R/msg/text/?\(content)" launchURL(hookUrl: urlSchema, result: result) break case "linkedin": let urlSchema = "linkedin://text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "reddit": let urlSchema = "reddit://text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "skype": let urlSchema = "skype:?chat&topic=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "slack": let urlSchema = "slack://text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "snapchat": let urlSchema = "snapchat://text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "telegram": let urlSchema = "tg://msg?text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "x": let urlSchema = "https://twitter.com/intent/tweet?text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "viber": let urlSchema = "viber://forward?text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "wechat": let urlSchema = "weixin://dl/posts?text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "whatsapp": let urlSchema = "whatsapp://send?text=\(content)" launchURL(hookUrl: urlSchema, result: result) break case "threads": let urlSchema = "threads://text=\(content)" launchURL(hookUrl: urlSchema, result: result) break default: result(FlutterMethodNotImplemented) } } func launchURL(hookUrl: String, result: @escaping FlutterResult) { if let urlString = hookUrl.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) { if let url = NSURL(string: urlString) { if UIApplication.shared.canOpenURL(url as URL) { UIApplication.shared.open(url as URL, options: [:], completionHandler: nil) result(NSNumber(value: true)) } else { result(NSNumber(value: false)) } } } } func canOpenApp(appName: String) -> Bool { let appScheme = "\(appName)://app" let appUrl = URL(string: appScheme) return UIApplication.shared.canOpenURL(appUrl! as URL) } }