2016-06-27 35 views
2

Instagram、Facebook、Twitter、メール、メッセージなどのネイティブサービスでビデオとテキストを共有しようとしています。UIActivityViewControllerを使用してTwitter、Instagram、その他のサービスにビデオとテキストを共有する

コントローラにアクティビティアイテムとしてテキストの配列とURLを渡すと、Instagramだけが表示されますが、Twitterは表示されません。

let url: NSURL = NSURL() // a url that directs to a video 
let items: [AnyObject] = ["Check out this video", url]  
let shareable = UIActivityViewController(activityItems: items, applicationActivities: nil) 

controller.presentViewController(shareable, 
           animated: true, 
           completion: nil) 

私の代わりとactivityItemsとして、Twitterだけが表示されることを使用しますが、ないのInstagram UIActivityItemSourceプロトコルを実装するクラスを作成した場合:

class VideoActivityItemSource: NSObject, UIActivityItemSource { 

    private let videoUrl: NSURL 
    private let shareText = "View the full video here!" 

    init(url: NSURL) { 
     self.videoUrl = url 
    } 

    func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject { 
     return "" 
    } 

    func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? { 
     switch activityType { 

     case UIActivityTypePostToFacebook: 
      return self.videoUrl 
     case UIActivityTypeMail: 
      return self.videoUrl 
     default: 
      return ["text": self.shareText, "url": self.videoUrl] 
     } 
    } 

    func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String { 
     return "Hey check this new cool app!!!" 
    } 

    func activityViewController(activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: String?, suggestedSize size: CGSize) -> UIImage? { 
     return nil 
    } 
} 

をし、このことにより、アイテムを交換する:

items = [VideoActivityItemSource(url: url)] 

この場合、Twitterがアクションシートに表示されない理由はわかりません。誰かがこれを解決する方法を知っていますか?

答えて

2

回答が見つかりました。これを行う正しい方法は、UIActivityItemSourceプロトコルの実装を使用することです。私がVideoActivityItemSourceクラスを使用している2番目のソリューションでInstagramが表示されない理由は、activityViewControllerPlaceholderItem関数で空のStringを返すことです。 Appleのドキュメントによれば、この関数で返されるオブジェクトの型はitemForActivityType関数で使用される型と一致する必要はありませんが、実際には共有サービスによって処理可能である必要があります。 Instagramの場合、ビデオまたはイメージでなければなりません。そうでなければ、Instagramはアクションシートの共有オプションとして表示されません。

解決策は、空のStringではなくactivityViewControllerPlaceholderItem関数でUIImageを返すことです。TwitterとInstagramの両方が共有オプションとして表示されます。

func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject { 
    // this needs to return some random image to make sure Twitter and Instagram show up in the sharing actionsheet 
    return UIImage(named: "someImage")! 
} 
+0

Instagramで共有しましたか?私は共有できません。 Instagramアイコンが私のために表示されていません –

+0

Instagramが電話機にインストールされている場合は、テスト時にアイコン付きで表示されます。 – bughana

関連する問題