SwiftでInstagramアプリに画像を渡す


はじめまして、[Martha（マーサ）](https://twitter.com/JPMartha_jp)です。
Qiitaへの初投稿です。

## 概要

Instagramのドキュメントに記載されている[Document Interaction](https://www.instagram.com/developer/mobile-sharing/iphone-hooks/#document-interaction)の手順に従い、SwiftでInstagramアプリに画像を渡す方法を紹介します。[^1]

![EggsBenedict.gif](https://qiita-image-store.s3.amazonaws.com/0/105213/23086104-8ac9-4f3b-c598-10a089f2b17c.gif "EggsBenedict.gif")

[^1]: [Instagram API](https://www.instagram.com/developer/)を利用して直接投稿する方法もありますがこの記事では触れません。

## 経緯・目的
- プライベートでInstagramを利用するので試しました。
- この手順に関する日本語のブログ記事は少ないようです。（内容がショボいからでしょうか）
- この機能だけを提供しているライブラリは少ないようです。（同上）
- ついでに __ライブラリを作った__ のでそれを宣伝します。

## 手順

1. 対象画像をPNGまたはJPEG形式で保存します。公式ではJPEG形式を推奨しているのでそのようにします。
ファイル名は任意で、拡張子とUTIは次の2つの組合せがあります。2つ目のほうが余計なメニューが少ないので個人的にオススメします。

    |拡張子|UTI                       |
    |:---|:--------------------------|
    |.ig |com.instagram.photo        |
    |.igo|com.instagram.exclusivegram|

2. `UIDocumentInteractionController`を使って画像を渡します。

## 実装例

まず Xcode プロジェクトの Info.plist に `LSApplicationQueriesSchemes` キーを追加します。

|Key                        |Type |Value    |
|:--------------------------|:----|:--------|
|LSApplicationQueriesSchemes|Array|instagram|

一時的に保存するためtmpフォルダに書き込みます。Pathについてはほかにスマートな方法がないかなと[このあたりのドキュメント](https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/Introduction/Introduction.html)をながめているところです。

```swift
let imageData = UIImageJPEGRepresentation(YourImage, 1.0)
let temporaryDirectory = NSTemporaryDirectory() as NSString
let temporaryImagePath = temporaryDirectory.stringByAppendingPathComponent("YourImageFileName.igo")
let boolValue = imageData.writeToFile(temporaryImagePath, atomically: true)
```

`UIDocumentInteractionController`を宣言しておきます。[^2]

```swift
lazy private var documentInteractionController = UIDocumentInteractionController()
```
 
`URL`プロパティと`UTI`プロパティを設定し、`presentOpenInMenuFromRect`メソッドでメニューを表示します。
 
```swift
documentInteractionController.URL = temporaryImagePath
documentInteractionController.UTI = "com.instagram.exclusivegram"
documentInteractionController.presentOpenInMenuFromRect(
    YourView.bounds,
    inView: YourView,
    animated: true
)
 ```
 
あとはデバイス上での操作です。
「Instagramにコピー」アイコンをタップすると、Instagramアプリが起動してフィルタ画面へ遷移します。

[^2]: これを保持しないと例外が発生します。`*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UIDocumentInteractionController has gone away prematurely!'`

## そして勢いで作ったライブラリ
#### EggsBenedict（エッグベネディクト）
https://github.com/JPMartha/EggsBenedict

- Swift 2.1
- Xcode 7.2
- iOS 8.0 以上
- [Carthage](https://github.com/Carthage/Carthage) 対応
- [CocoaPods](https://cocoapods.org) 対応[^3]

[^3]: 1月9日に追記しました。

最低限の機能しか実装していませんが、ほぼ独学[^4]なのでこの段階で道を踏み外さないようどこかで発表しようと考えていました。ただ1月23日の[第65回 Cocoa勉強会関西](http://cocoa-kansai.connpass.com/event/24558/)や1月27日の[関西モバイルアプリ研究会（関モバ）](http://kanmoba.connpass.com/event/25185/)はまだ先なのでQiitaに投稿しました。

~~ツッコミを受けて強くなりたいです。~~

[^4]: 勉強会によく参加しているので独学とは言えないかもしれません。

## 参考記事

次の記事を参考にさせていただきました。ありがとうございます。

#### Instagram関連

- [Instagramへの画像投稿](http://qiita.com/blurrednote/items/1ef256e87d4bb9960b37) （blurrednoteさん）
- [SwiftでInstagramやLINEに画像を投稿する](http://maplesystems.co.jp/blog/all/programming/20099.html) （Maple Blog）


#### Carthage関連

- [Carthageについて知りたいn個のこと](http://www.slideshare.net/syoikeda/carthagen) （ikesyoさん）
- [iOSでのFramework導入のおさらい](http://www.slideshare.net/syoikeda/iosframework) （ikesyoさん）
- [Swiftでライブラリを公開する](http://qiita.com/morizotter/items/2e45f8f94c1010ebd69f) （morizotterさん）
- [Swiftを使ってモダンなWeb APIクライアントを爆速で開発する](http://qiita.com/giginet/items/1e64f584f948661cffd1) （giginetさん）
- [シンプルな依存関係管理システム Carthage](https://realm.io/jp/news/swift-dependency-management-with-carthage/) （Realmニュース）

#### CocoaPods関連

- [Swiftでライブラリを公開する](http://qiita.com/morizotter/items/2e45f8f94c1010ebd69f) （morizotterさん）

## その他

アニメーションGIF作成のためこちらを利用させていただきました。ありがとうございます。

- [動画をアニメーションGIFに変換するウェブアプリケーション作った - hitode909の日記](http://hitode909.hatenablog.com/entry/2013/01/28/225721) （hitode909さん）

## 最後に

#### ちょっと自己紹介

- [関モバ](http://kanmoba.connpass.com)ではパンケーキをネタにしていてTwitterアカウントよりそれを書くほうが誰だかわかりやすい気がします。事前に京都限定パンケーキを食べるので用意してくださった軽食を食べられないことが多いです。

- [Llumino](http://cocopon.me/work/llumino/)パーカーを着用して発表することがありますが開発者ではありません。たまにボタンをタップされてリアクションを要求されます。

- [try! Swift](http://www.tryswiftconf.com) にスーパーSwift早割で申し込みました。4:47の電車に乗れば渋谷駅に8:59に着きますが初日をどうするか悩んでいます。