Posted at

[Swift] macOS Mojaveでシェアボタンからツイートする


これはなに?

自作のmacOSアプリケーションのシェアボタンからツイートできるようにするframeworkです。

複数枚の画像の投稿もできます。


なんで作ったの?

Mojaveからなくなったからに決まってるでしょ!!

ついでに複数枚画像の投稿機能も追加したからHigh Sierraとかでも有効よ!


使い方


GitHubにあるよー

GitHub TweetService


Carthageが使えるよー


Cartfile


github "masakih/TweetService"



組み込み方


Step 0

Twitter Appを登録。

callback URLはカスタムスキームを設定。


Step 1

Twitter Appの登録情報からTweetServiceを生成。

class ViewController: NSViewController {

private var tweetService: TweetService?

override func viewDidLoad() {

self?.tweetService = TweetService(callbackScheme: "customscheme", // カスタムスキームは何でもOK
consumerKey: "########",
consumerSecretKey: "###############")
self?.tweetService.delegate = self
}
}


Step 2

TweetServiceDelegate Protocolに準拠。

ツイートパネルのparentViewControllerとなれるNSViewControllerを返す。

extension ViewController: TweetServiceDelegate {

func tweetSetviceAuthorizeSheetPearent(_ service: TweetService) -> NSViewController? {

return self
}
}


Step 3

NSSharingServicePickerDelegate Protocolに準拠。

sharingServicePicker(_:sharingServicesForItems:proposedSharingServices:)TweetService#sharingServicePicker(_:proposedSharingServices:)の戻り値を返す。

extension ViewController: NSSharingServicePickerDelegate {

func sharingServicePicker(_ sharingServicePicker: NSSharingServicePicker, sharingServicesForItems items: [Any], proposedSharingServices proposedServices: [NSSharingService]) -> [NSSharingService] {

return tweetService?.sharingServicePicker(items, proposedSharingServices: proposedServices) ?? proposedServices
}
}


Step 4

アクションを作ってシェアボタンに接続。

extension ViewController {

@IBAction private func tweet(_ button: NSButton) {

let items: [Any?] = [
textField?.stringValue,
imageView?.image,
imageView2?.image,
imageView3?.image,
imageView4?.image,
]

let picker = NSSharingServicePicker(items: items.compactMap( { $0 } ))
picker.delegate = self
picker.show(relativeTo: .zero, of: button, preferredEdge: .minX)
}
}

以上、たったこれだけであなたのアプリケーションからツイートが出来るようになります。


おわりに

うちの環境では動かすことができてるけど、ほかの環境で動くかどうかはわからない。

一応、バグ報告とか要望とかには対応すると思う。

PRとかよくわからないからfork or 丸パクリ、アイデアを参考にするとかしたほうが早いかも。