課題
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月にこの機能を追加予定です。