iOS로 인스타그램에 어플 사진을 공유하다가 반했어요.

8609 단어 iOSInstagram
인스타그램 공식 홈페이지에도 뒤집으면 나온다고 쓰여 있는데 반한 부분이 많아서 정리해봤습니다.
동작 환경, Xcode9.3+Swift4.1+iOS 11

URL 스키마를 사용하여 공유하는 방법


공식 페이지에 쓰여 있지 않습니다.그러나 레이아웃이라는 앱에서는 앱 내에서 가공한 사진을 선택해 인스타그램 투고 화면을 열 수 있어 숨겨진 것일 수 있다.

API를 사용하여 직접 투고하는 방법


기고문 API 없음

UIACtivity ViewController를 사용하여 공유하는 방법


간단해도 되지만 인스타그램 앱은 시작하지 않고 직접 자신의 앱에서 투고하는 형식이다.이용자들이 보기에 인스타그램 애플리케이션의 사진 가공은 사용할 수 없어 불편할 수 있다는 것이다.
@IBAction private func didTapShare() {
    do {
        // UIImageをactivityItemsにわたす
        let activityViewController = UIActivityViewController(activityItems: [self.image], applicationActivities: nil)
        present(activityViewController, animated: true)
    } catch let error {
        print(error)
    }
}
표시된 공유 테이블

인스타그램을 선택하면 자신의 앱에 투고 화면이 나온다.

U I D oc u ment Interaction Controller를 사용하여 공유하는 방법


이 방법은 정식 문서에도 기재되어 있다.설명에는 인스타그램 애플리케이션이 선택 대상이라고만 적혀 있었지만 실제로는 그렇지 않았다...과거에는 그랬을 수 있지만 iOS 11은 그렇지 않았다.또 몇 가지 반한 점이 있다.
@IBAction private func didTapShare() {
    do {
        // UIImageをDataに変換
        guard let imageData = UIImageJPEGRepresentation(image, 1.0) else {
          return
        }

        // テンポラリファイルとして保存。拡張子はigoにする
        let imageURL = URL(fileURLWithPath: (NSTemporaryDirectory() as NSString).appendingPathComponent("image.igo"))
        try imageData.write(to: imageURL, options: .atomicWrite)

        // 必ずメンバ変数として保持すること。ローカル変数だと意図しないタイミングで破棄される
        // 保存した画像ファイルのURLを渡す
        self.documentInteractionController = UIDocumentInteractionController(url: imageURL)
        self.documentInteractionController!.uti = "com.instagram.exclusivegram"
        // shareButtonは押したボタン(UIBarButtonItem)
        self.documentInteractionController!.presentOpenInMenu(from: shareButton, animated: true)
        // よくこの方法が見られるけど、たいていはBarButtonItemから起動するのでは?iPadでは、ここきちんとやらないと変なとこからポップアップするので注意
        // self.documentInteractionController!.presentOpenInMenu(from: self.view.bounds, in: self.view, animated: true)
    } catch let error {
        print(error)
    }
}
객체를 구성원 변수로 저장하지 않으면 무의식중에 버려집니다.순식간에 시장 점유율이 나와 곧 닫혔다.오류 로그에 Invalid Operation 등이 표시됩니다.
그리고 실제로 열린 공유표.

차트에 인스타그램만 있는 게 아니죠... 다른 앱도 igo 확장자에 맞나요?
다만 아까 UIACtivity Controller와 달리'인스타그램'이 아닌'인스타그램으로 복사'로, 선택하면 인스타그램이 시작되고 사진이 선택된 상태에서 투고 화면이 열린다.이렇게 하면 매우 편리하지만 공유표에서 선택할 수 있는 응용 소프트웨어가 제한되어 사용자가 보기에 매우 불편할 수 있다.트위터가 없네요. 역시... 슬랙과 클라스가 다 나왔네요.
따라서 다음과 같이 파일 확장자 및 UTI 지정을 변경합니다.
// 拡張子をjpg
let imageURL = URL(fileURLWithPath: (NSTemporaryDirectory() as NSString).appendingPathComponent("image.jpg"))
// utiをpublic.jpeg
documentInteractionController!.uti = "public.jpeg"
이 경우 표시된 공유 테이블은 다음과 같습니다.

트위터도 있어요.그리고 인스타그램과 인스타그램에 복제된 콘텐츠를 표시한다.사용자 입장에서는 혼란이 생길 수 있지만 개인적으로는 이것이 가장 좋다고 생각한다.
인스타그램 공식 문서에는 이렇게 적혀 있지만 위와 같은 상황은 공유표에 표시된 애플리케이션, 인스타그램으로 복사를 선택했을 때의 행동과 다를 바 없다.서류 준비할 때랑 다르죠?
// 拡張子をig
let imageURL = URL(fileURLWithPath: (NSTemporaryDirectory() as NSString).appendingPathComponent("image.ig"))
// utiをcom.instagram.photo
documentInteractionController!.uti = "com.instagram.photo"

좋은 웹페이지 즐겨찾기