6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swift その2Advent Calendar 2017

Day 18

iOS11のスクリーンショットをApp Extensionで使う方法

Posted at

この記事はSwift その2 Advent Calendar 2017 18日目のコンテンツです。

App Extensionとは

iOS8からある機能
四角から上に矢印伸びたボタンを出てくるアレ

image.png

App Extensionの基本的な使い方

if let extensionContext = self.extensionContext,
   let item = extensionContext.inputItems.first as? NSExtensionItem,
   let attachments = item.attachments as? [NSItemProvider],
   let attachment  = attachments.first {
   let contentType = kUTTypeImage as String
            
   attachment.loadFileRepresentation(forTypeIdentifier: contentType) { (url, error) in
   // Do Something with url
   // url -> Image,  url -> Data
  })            
}

loadFileRepresentation()というメソッドを使って画像URLを取得
していました。URLあれば、なんでもできそうだったからです。URLからUIImageに変換したり、URLからDataに変換したり。

iOS10以前と11でのURLの違い。

if let extensionContext = self.extensionContext,
   let item = extensionContext.inputItems.first as? NSExtensionItem,
   let attachments = item.attachments as? [NSItemProvider],
   let attachment  = attachments.first {
   let contentType = kUTTypeImage as String
            
   attachment.loadFileRepresentation(forTypeIdentifier: contentType) { (url, error) in
   // Do Something with url
   // iOS10
   // “file:///private/var/mobile/Containers/**/P105.PNG”
   // 
   // iOS11
   // “file:///private/var/mobile/Containers/**/image”
  })            
}

しかし、Screenshotを取った時にApp Extensionで取得できるURLが上記のように末尾が /image なってしまいました。このURLをもとにUIImageやDataに変換しようとしてもエラーが出てしまいます。

そこで以下のように対処しました。

if let extensionContext = self.extensionContext,
   let item = extensionContext.inputItems.first as? NSExtensionItem,
   let attachments = item.attachments as? [NSItemProvider],
   let attachment  = attachments.first {
   let contentType = kUTTypeImage as String
            
   attachment.loadItem(forTypeIdentifier: contentType, options: nil) { (data, error) in
       if type(of: data!) == UIImage.self {
          // iOS 11 screenshot
       } else if type(of: data!) == NSURL.self {
                    
       }
   }            
}

この方法にはいくつか欠点があります。

  • 想定していないタイプが来たらどうする?
  • ドキュメントは?
-> 観測範囲ではない

最後に紹介した方法で動くは動くのですが、他になにかいい方法あったら教えてください。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?