一般分两种情况,第一种只使用自己自定义的继承自UIActivity
,第二种是使用存在于当前分享列表的UIActivityType
。
一. 使用自己自定义UIActivity
- 自定义一个
Activity
继承自UIActivity
import UIKit
@objc(TelegramActivity)
class TelegramActivity: UIActivity {
//给他个类型 share是和图标放一起 action就是放一行
override class var activityCategory: UIActivity.Category {
return .share
}
//给他个id
override var activityType: UIActivity.ActivityType?{
return ActivityType.init(rawValue: "ph.telegra.Telegraph.Share")
}
//给他一个图片
override var activityImage: UIImage?{
return UIImage.init(named: "Telegram")
}
//给他一个名字
override var activityTitle: String?{
return "Telegram"
}
//如果是我们这类型的就展示,不是就不展示
override func canPerform(withActivityItems activityItems: [Any]) -> Bool {
if activityItems.count == 1 && activityItems[0] is TelegramItem {
return true
}
return false
}
//定义个东东
var textToShare: String?
override func prepare(withActivityItems activityItems: [Any]) {
//处理自定义数据类型
if let activityItem = activityItems.first as? TelegramItem {
self.textToShare = activityItem.getValue()
}
}
override func perform(){
//得到textToShare 然后处理点击分享按钮的逻辑
self.activityDidFinish(true)
}
}
- 要想过滤掉其他的选项,就得自定义一个数据类型用于分享,其他的软件接收不了,自然只有您自定义的展示出来
class TelegramItem: UIActivity {
let value: String
required init(value: String) {
self.value = value
}
func getValue() -> String {
return self.value
}
}
- 最后调用大功告成,毫无卵用,讲道理要是自定义分享逻辑,我还费劲吧啦调系统菜单干嘛
let items = [TelegramItem(value: "hello")]
let activity = UIActivityViewController(activityItems: items, applicationActivities: [TelegramActivity()])
self.present(activity, animated: true, completion: nil)
- 最终效果截图
二.只保留当前系统分享菜单的其中一个或几个
- 自定义一个类继承自
UIActivityViewController
,这个时候得用Objective-C
,Swift
行不通的样子
NSString *const UIActivityTypeZSCustomMine = @"ph.telegra.Telegraph.Share";
- (void)modfile{
NSArray* array = @[UIActivityTypeZSCustomMine];
[self setValue:array forKey:@"includedActivityTypes"];
}
//- (NSArray<UIActivityType> *)includedActivityTypes{
// return @[UIActivityTypeZSCustomMine];
//}
- 用
KVC
或者修改下面的getter
方法就能实现只展示指定选项的功能,includedActivityTypes
是系统的一个非暴露属性,大家用Runtime
自己打印下方法列表就能看到,不多赘述, - 要是大佬们不知道怎么获取各个
app
的UIActivityType
(例子:我上面的ph.telegra.Telegraph.Share
),要是系统里有的你就直接用,没有的像我这次弄的电报就没有,咱可以自己一个一个打印看看。
//自己点一下选项就打印了
activityViewController.completionWithItemsHandler = { (activityType, completed,returnedItems,activityError) in
print(activityType?.rawValue)
}
- 效果截图