167 lines
5.9 KiB
Swift
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)
|
|
}
|
|
} |