Files
custom_social_share/ios/Classes/CustomSocialSharePlugin.swift
2024-11-07 08:32:35 +07:00

167 lines
5.9 KiB
Swift

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)
}
}