2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Share Extensionからjavascriptを使いSafari内の情報を取得

Posted at

課題

BookmarksでSafariからリンクをShare Extensionで追加するとき、選択している文字をメモに追加できるようにしてほしいとフィードバックがあった。

他のアプリの実装例

実装

スクリプトの作成

var ProcessingClass = function() {};

ProcessingClass.prototype = {
    run: function(arguments) {
      arguments.completionFunction({
          "title": document.title,
          "url": document.URL,
          "selected": document.getSelection().toString()
      });
    },
    finalize: function(arguments) {}
};

var ExtensionPreprocessingJS = new ProcessingClass

plistの設定

javascriptを実行するにはplistに以下を設定する必要です。

  • NSExtensionAttributes/NSExtensionActivationRuleの1つとしてNSExtensionActivationSupportsWebPageWithMaxCountを1以上に設定
  • NSExtensionAttributesの1つとしてNSExtensionJavaScriptPreprocessingFileに前の項のスクリプトファイル名(.js は書かない)を設定

plistの例:

<key>NSExtension</key>
<dict>
	<dict>
		<key>NSExtensionAttributes</key>
		<dict>
			<key>NSExtensionActivationRule</key>
			<dict>
				<key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
				<integer>1</integer>
				<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
				<integer>1</integer>
			</dict>
			<key>NSExtensionJavaScriptPreprocessingFile</key>
			<string>ShareScript</string>
		</dict>
		<key>NSExtensionMainStoryboard</key>
		<string>MainInterface</string>
		<key>NSExtensionPointIdentifier</key>
		<string>com.apple.share-services</string>
	</dict>
 </dict>

Swiftでjsの取得

正しく実装できていると、共有シートからShare Extensionを実行したときに例1ではcom.apple.property-list、例2ではtrueが表示されるはずです。

// 例1
guard let item = context?.inputItems.first as? NSExtensionItem else { return }
guard let itemProvider = item.attachments?.first else { return }
print("Share extension", context?.inputItems)
// 例2
itemProvider.hasItemConformingToTypeIdentifier(UTType.propertyList.identifier)

Swiftでの実装は以下のようになります。ExtensionPreprocessingJSに渡したkeyを配列に渡すとjsで取得した情報を受け取れます。

itemProvider.loadItem(forTypeIdentifier: UTType.propertyList.identifier, options: nil) { data, error in
    let dictionary = data as! NSDictionary
    OperationQueue.main.addOperation {
        let results = dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as! NSDictionary
        
        let title = results["title"] as! String
        let url = results["url"] as! String
        let note = results["selected"] as! String
    }
}

最後に

参考にした資料

アプリへの実装

3月にこの機能を追加予定です。

2
1
0

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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?