やりたいこと
- アプリ内で画像を生成または撮影
- URL SchemeでInstagarmのアプリに飛ばして
- Storiesに投稿させる
これをやりたいです。
どうやるのか
どうやってやるのかな。と思って、
Instagram developerのサイトなんかを見てみたのですが、いいかんじのものがみつからず...
https://www.instagram.com/developer/mobile-sharing/iphone-hooks/
ちょっと探していくうちにこんな記事を発見
http://www.anthrgrnwrld.net/entry/2016/10/07/230225
instagram://library?LocalIdentifier=
っていうSchemeでイケるのではないかということが判明😙
実装して見る
こういうシーンほとんどないと思うのですが、今回はさくっと実装したかったので、
- アプリ内で画像を選択
- その画像を持って
- Instagramの投稿画面に遷移
こんな感じで実装することに。
やること
画像を選択させちゃう
UINavigationControllerDelegate
と UIImagePickerControllerDelegate
が必要。
※RxSwiftつかってるよう
let album = UIImagePickerController()
centerButton.rx.tap
.asObservable()
.subscribe { _ in
self.album.delegate = self
self.album.sourceType = .photoLibrary
self.present(self.album, animated: true, completion: nil)
}
.disposed(by: disposeBag)
やっていることは鬼シンプル。これでまずカメラロールをさくっと開くよ。
選択が終わったらどうしようか
画像の選択が終わったらどうするかの処理をかくよ
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
guard let linkURL = info[UIImagePickerControllerReferenceURL] as? URL else { return }
guard let openURL = URL(string: "instagram://library?LocalIdentifier=\(linkURL.absoluteString)") else { return }
picker.dismiss(animated: true, completion: {
if UIApplication.shared.canOpenURL(openURL) {
UIApplication.shared.open(openURL, options: [:], completionHandler: nil)
} else {
print("instagramいれなきゃだめだよそりゃ")
}
})
}
これがなにをやってるかというと、
- 選択された画像に関するデータがはいっている
info
というDictionaryから、UIImagePickerControllerReferenceURL
のvalueを取り出す - URL Schemeを用意(パラメータに先程取得した
UIImagePickerControllerReferenceURL
をぶちこむ) -
openURL
していよいよクライマックス!
という感じでい。
ちなみに、CFBundleURLTypes
に instagram
を追加しないと遷移できないよ!
あと、いまはめんどくさかったから、UIImagePickerControllerReferenceURL
を取ってきちゃったけど、これがdeprecatedみたいだから、本当はPhotos.frameworkをごにょらないとだめ!