LoginSignup
35
36

More than 5 years have passed since last update.

SwiftでShare Extensionを使う際のポイント

Last updated at Posted at 2014-07-12

概要

Share Extensionはまず通常通りにプロジェクトを作成したあと、新規ターゲットの追加でShare Extensionを選択することで作成できます。
ターゲットを作成するとSLComposeServiceViewControllerを継承したShareViewControllerが自動生成されます。
このControllerにユーザーがコンテンツをポストした際の処理を実装することになります。

UIはデフォルトで用意されているものがあるのでそちらを使うか、自分で作ることもできます。

使い方

ユーザーがポストしたタイミングでShareViewControllerdidSelectPost()が呼ばれるのでここにデータの保存やサーバーへの送信処理などを実装します。
このコードではNSExtensionItemにユーザーが入力したテキストを設定しています。

override func didSelectPost() {

    var inputItem : NSExtensionItem = self.extensionContext.inputItems[0] as NSExtensionItem
    var outputItem : NSExtensionItem = inputItem.copy() as NSExtensionItem;

    // 入力されたテキストを設定する
    outputItem.attributedContentText = NSAttributedString(string:self.contentText, attributes:nil);

    // ここに処理を書く

    self.extensionContext.completeRequestReturningItems([outputItem], completionHandler: nil)
}

SLComposeServiceViewControllerには入力チェクをする仕組みが用意されているので、isContentValid()をオーバーライドして入力チェックを実装できます。

override func isContentValid() -> Bool {
    // ここに入力チェックを書く

    return true
}

Share Extensionの呼び出しはこれまで通りUIActivityViewControllerを行います。

@IBAction func shareAction(sender: AnyObject) {
    let firstActivityItem = "test message"
    let secondActivityItem : NSURL = NSURL.URLWithString("http://www.mocology.com/");
    let activityViewController : UIActivityViewController = UIActivityViewController(
        activityItems: [firstActivityItem, secondActivityItem], applicationActivities: nil)
    activityViewController.completionWithItemsHandler = {(activityType, completed:Bool, returnedItems:Array!, error:NSError!) in
        if (completed) {
            // ここに完了後の処理を書く
        }
    }

    self.presentViewController(activityViewController, animated: true, completion: nil)
}

補足

Share Extensionでサポートするデータを指定することができます。
例えばターゲット作成時に自動生成されるinfo.plist内のNSExtensionActivationRuleに定義します。

<key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsImageWithMaxCount</key>
            <integer>10</integer>
            <key>NSExtensionActivationSupportsMovieWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
            <integer>1</integer>
        </dict>
    </dict>

現状では下記の6つの項目をサポートしています。

  • NSExtensionActivationSupportsTextWithMaxCount
  • NSExtensionActivationSupportsImageWithMaxCount
  • NSExtensionActivationSupportsMovieWithMaxCount
  • NSExtensionActivationSupportsFileWithMaxCount
  • NSExtensionActivationSupportsWebURLWithMaxCount
  • NSExtensionActivationSupportsWebPageWithMaxCount

まとめ

Share Extensionについては情報が多くないので、簡単にまとめた部分だけを書いてみました。
今後も情報を追加していきたいと思います。

Today Extensionについてブログに書いていますのでこちらもあわせてどうぞ。

35
36
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
36