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

More than 5 years have passed since last update.


概要

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についてブログに書いていますのでこちらもあわせてどうぞ。

http://sakahara.hatenablog.jp/entry/2014/07/11/014033