iOS 系统分享菜单只保留一个选项

1,053 阅读2分钟

一般分两种情况,第一种只使用自己自定义的继承自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)
  • 最终效果截图 61641883990_.pic.jpg

二.只保留当前系统分享菜单的其中一个或几个

  • 自定义一个类继承自UIActivityViewController,这个时候得用Objective-CSwift行不通的样子
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自己打印下方法列表就能看到,不多赘述,
  • 要是大佬们不知道怎么获取各个appUIActivityType(例子:我上面的ph.telegra.Telegraph.Share),要是系统里有的你就直接用,没有的像我这次弄的电报就没有,咱可以自己一个一个打印看看。
//自己点一下选项就打印了
                activityViewController.completionWithItemsHandler = { (activityType, completed,returnedItems,activityError) in
                    print(activityType?.rawValue)
                }

  • 效果截图

71641884929_.pic.jpg