Ios UIS在Swift 3中的活动

Ios UIS在Swift 3中的活动,ios,swift,swift3,Ios,Swift,Swift3,正在尝试在我的应用程序中重新集成共享按钮。苹果再次在iOS 10的swift3中做出了改变。我刚刚更新到Xcode 8发布版本,它给了我一些UIActivities方面的问题 发现它们中的许多现在以UIActivityType.开头,以便编译器不会失败。然而,他们中的许多人仍然在使用com.apple,出于某种原因,这也让我将activityType数组转换为type[Any] 所以说。。。有人知道他们为什么那样做吗?在activitypestoexclude.contains(其中:(Any)

正在尝试在我的应用程序中重新集成共享按钮。苹果再次在iOS 10的
swift3
中做出了改变。我刚刚更新到
Xcode 8
发布版本,它给了我一些
UIActivities
方面的问题

发现它们中的许多现在以
UIActivityType.
开头,以便编译器不会失败。然而,他们中的许多人仍然在使用
com.apple
,出于某种原因,这也让我将
activityType
数组转换为type
[Any]

所以说。。。有人知道他们为什么那样做吗?在
activitypestoexclude.contains(其中:(Any)throws->Bool)
方法中,您在for参数中放了什么

 internal func _shouldExcludeActivityType(_ activity: UIActivity) -> Bool {

            let activityTypesToExclude = [

                "com.apple.reminders.RemindersEditorExtension",
                UIActivityType.openInIBooks,
                UIActivityType.print,
                UIActivityType.assignToContact,
                UIActivityType.postToWeibo,
                "com.google.Drive.ShareExtension",
                "com.apple.mobileslideshow.StreamShareService"

            ] as [Any]

            if let actType = activity.activityType {
                if activityTypesToExclude.contains(where: (Any) throws -> Bool) {
                    return true
                }
                else if super.excludedActivityTypes != nil {
                    return super.excludedActivityTypes!.contains(actType)
                }
            }
            return false
}

UIActivityType
是一种类型安全的精简包装器,用于活动类型的字符串表示。如果发现某些活动类型没有预定义的常量,可以使用扩展名定义自己的活动类型

extension UIActivityType {
    static let remindersEditorExtension = UIActivityType(rawValue: "com.apple.reminders.RemindersEditorExtension")
    static let googleDriveShareExtension = UIActivityType(rawValue: "com.google.Drive.ShareExtension")
    static let streamShareService = UIActivityType(rawValue: "com.apple.mobileslideshow.StreamShareService")
}
通过上面的扩展,您可以编写如下内容:

internal func _shouldExcludeActivityType(_ activity: UIActivity) -> Bool {

    let activityTypesToExclude: [UIActivityType] = [
        .remindersEditorExtension,
        .openInIBooks,
        .print,
        .assignToContact,
        .postToWeibo,
        .googleDriveShareExtension,
        .streamShareService
    ]

    if let actType = activity.activityType {
        if activityTypesToExclude.contains(actType) {
            return true
        } else if let superExcludes = super.excludedActivityTypes {
            return superExcludes.contains(actType)
        }
    }
    return false
}
您不应该在Swift 3代码中直接使用原始字符串表示

那么,关于他们为什么这样做呢?:有了这一变化,程序员意外地在需要activityType标识符的地方包含非activityType字符串的机会要小得多


一些字符串常量也做了类似的更改,例如
Notification.Name

我对如何使用这个函数有些困惑。我尝试了
activityViewController.excludedActivityTypes=[UIActivityType.streamShareService]
但它不起作用。请您解释一下如何使用函数
\u应该排除活动类型
,这样我就可以排除
com.apple.mobileslideshow.StreamShareService
首先,检查一下。(也许你已经检查过了,但还是要仔细检查。)如公认答案中所述,
\u应该排除活动类型是一个私有API,使用此API的应用程序有被苹果拒绝的风险。苹果公司随时都会在没有通知的情况下更改一些详细的实现。你可以自己冒险尝试,但我无法解释“如何使用它”,因为我不知道什么会真正起作用。上面的答案只是解释如何创建
UIActivityType
的实例。