【问题标题】:UIActivityViewController share only textUIActivityViewController 仅共享文本
【发布时间】:2015-05-01 10:10:31
【问题描述】:

我想使用 UIActivityViewController 分享简单的文本 我正在使用 swift,使用 xcode 6.3 代码非常简单,非常适合照片,而不仅仅是文字, 我不想在 objectsToShare 中包含任何 Web URL,只需干净的文本 这是代码:

var objectsToShare: ["some text to share"]! 
let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)

//handler for completed task
activityVC.completionHandler = {(activityType, completed:Bool) in
            if !completed {
                println("cancelled")
                return
            }
reportCompleted() //report to server it's done.
 }

//Excluded Activities Code
activityVC.excludedActivityTypes = [UIActivityTypeAirDrop, UIActivityTypeAddToReadingList, UIActivityTypeCopyToPasteboard ]

//activate the share view
self.presentViewController(activityVC, animated: true,  completion: {
            (complete)  in
            println(complete)

        })

现在我知道这完全取决于用户是否拥有 Facebook - 不仅在他的手机上,还取决于他的设置。 (我直接从我的手机 6 上尝试过,它有 Facebook 设置,而不是从模拟器) 这段代码曾经运行良好,仍然适用于图像,而不是文本,但由于某种原因,它不再适用于文本共享,也许文本本身与此有关,也许我的代码不好,或者可能是 Facebook,改变一些东西。

感谢您对这个主题的任何想法。

为了让事情更奇怪,我又发现了 2 个奇怪的东西。

  1. 发布文本的代码在模拟器上工作(只要你在设置facebook中添加)
  2. 如果我添加到 web url 它也可以(在设备中)如果我删除 web url 它不起作用。

//有效的代码:

var myWebsite = NSURL(string: "http://www.someurl.com/")

    let textToShare = "Swift is awesome!  Check out this website about it!"

     objectsToShare = [textToShare , myWebsite!]
//continue regular.

//不起作用的代码:

    let textToShare = "Swift is awesome!  Check out this website about it!"

     objectsToShare = [textToShare ]

【问题讨论】:

    标签: facebook swift sharing uiactivityviewcontroller ios8.4


    【解决方案1】:

    看来不是bug而是facebook政策更新:

    “在与我们的团队讨论剥离文本的预填充消息区域后,这实际上是 BY DESIGN 与新的共享扩展。 预填充文本违反了平台策略 2.3 .....所以在所有强制执行策略 2.3 中是一个特性而不是一个错误。 " https://developers.facebook.com/bugs/949486035103197/

    【讨论】:

      【解决方案2】:

      我读过,问题不是 iOS 8.3,是 FacebookApp v29,他们没有在今天的更新中修复它。如果你卸载你的 FacebookApp,它就可以工作。

      我无法发布图片,但如果您在安装了 Facebook 应用程序的情况下尝试使用此代码,而没有它,您会发现差异

      func didPressShare(sender: AnyObject) {
          if SLComposeViewController.isAvailableForServiceType(SLServiceTypeFacebook){
              var facebookSheet:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
              facebookSheet.setInitialText("This is without facebook on device")
              self.presentViewController(facebookSheet, animated: true, completion: nil)
          } else {
              var alert = UIAlertController(title: "Accounts", message: "Please login to a Facebook account to share.", preferredStyle: UIAlertControllerStyle.Alert)
              alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
              self.presentViewController(alert, animated: true, completion: nil)
          }
      

      }

      正如他们所说:“对于大家的延误,我们深表歉意,但我们已安排在 v31 中进行此修复。延误的原因是 App Store 批准更新的周期需要时间。感谢您的耐心等待。”

      https://developers.facebook.com/bugs/949486035103197/

      他们说它将在下次更新时修复。

      【讨论】:

        【解决方案3】:

        我刚刚测试了我的示例,使用以下代码:

        @IBAction func shareMoment_Action(sender: AnyObject) {
        let firstActivityItem = "This is a simple text"
        var activityVC = UIActivityViewController(activityItems: [firstActivityItem], applicationActivities: nil)
        
            activityVC.excludedActivityTypes = [
                UIActivityTypePostToWeibo,
                UIActivityTypePrint,
                UIActivityTypeCopyToPasteboard,
                UIActivityTypeAssignToContact,
                UIActivityTypeSaveToCameraRoll,
                UIActivityTypeAddToReadingList,
                UIActivityTypePostToFlickr,
                UIActivityTypePostToVimeo,
                UIActivityTypePostToTencentWeibo,
                UIActivityTypeAirDrop
            ]
        
            activityVC.completionWithItemsHandler = {(activityType: String!, completed: Bool, arrayOptions: [AnyObject]!, error: NSError!) in
                println(activityType)
            }
        
            self.presentViewController(activityVC, animated: true, completion: nil)
        }
        

        对于每个选定的选项,共享都可以正常工作!

        它在我这边运行良好。请再次检查您的代码!

        【讨论】:

        • 另外 completionHandler 已被弃用!您必须改用 completionWithItemsHandler
        • 你使用 iOS 8.3 吗?因为它在这个版本中不起作用。
        • @user3728728 是的,它是 Xcode 6.3.1 和 iOS 8.3。但请注意,我是在设备上测试,而不是模拟器!
        • 所以,我重新检查了对completionWithItemsHandler的代码更改,甚至从我拥有的6.3下载了6.3.1,但仍然无法正常工作。如果您确实使用 8.3 版本,那么这是一个奇怪的谜。
        • @user3728728 那时不知道......但可以肯定的是,它对我有用。如果有人可以帮助我,我真的很感激:stackoverflow.com/questions/30063708/…
        【解决方案4】:

        我也遇到过同样的问题,但无法解决。这是我目前发现的:

        • 从设备中删除 Facebook.app 时可以修复错误(但这不是解决方案)
        • Bug 似乎在装有 Facebook.app >v28.0 和 iOS8.3 的设备上持续存在
        • Facebook.app v28.0 和 iOS8.3 仍然有效
        • Facebook.app v29.0 和 iOS8.2 仍然有效
        • 共享 URL 似乎也受到此错误的影响

        很难判断 Facebook 是否真的与此错误有关,因为他们有输入虚假发行说明进行更新的政策。

        由于分享功能不是我应用的主要功能,我会等到 iOS8.4 和/或 Facebook.app v30.0 发布

        【讨论】:

          【解决方案5】:

          经过一番研究,我找到了以下问题的解决方案:

          func shareTapped() {
              let vc = UIActivityViewController(activityItems: [detailImageView.image!, "Check out these photos! http://www.photolib.noaa.gov/nssl"], applicationActivities: [])
              presentViewController(vc, animated: true, completion: nil)
          

          因此,在ActivityItems 中,您可以先传递图像,然后传递逗号,然后传递字符串变量,或者在上面的启用中打开“并直接输入您的文本”,这与UIActivityViewController 中的 Facebook 和 Twitter 一起使用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多