このエントリーをはてなブックマークに追加
ラベル iOS の投稿を表示しています。 すべての投稿を表示
ラベル iOS の投稿を表示しています。 すべての投稿を表示

2017年1月28日土曜日

iOS SwiftでS3への画像アップロード

 こんにちは、Hiroです。今回はSwiftでAWSのS3へ画像をアップロードする方法について、ブログを書きたいと思います。
 AWS Cognitoでの認証が本来は望ましいのですが、今回は簡単にIAMユーザを作成し、ACCESS KEYとSECRET ACCESS KEYを利用した方法で紹介したいと思います。アプリをリリースする場合は、AWS Cognitoを利用するか、IAMユーザの場合は、アクセス権限を十分に絞ってください。


AWS上での事前準備


AWS上での準備については、省略しますが下記の2つを準備してください。IAMユーザについては、作成したS3のバケットへアップロード(PutObject)できる権限を付与しておく必要があります。
  • S3にバケットを作成
  • IAMユーザの作成(上記のバケットへの「s3:PutObject」権限あり)

CocoaPodsでAWS SDKをインストールをする


Podfileに下記を記載して、インストールします。
  use_frameworks!

  pod 'AWSS3'
$ pod install


認証の設定をする


冒頭で記載したとおり、今回はIAMユーザでの認証を行います。accessKeyとsecretKeyにはAWSで作成したIAMユーザのものを設定してください。
下記の処理は、S3で画像などをアップロードする前に1度だけ実行するようにします。
import AWSCore
...
...
    func configureService() {
        let credentialsProvider = AWSStaticCredentialsProvider(accessKey: "your access key", secretKey: "your secret key")
        let serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.apNortheast1, credentialsProvider: credentialsProvider)
        AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration
    }


UIImageを保存して、URLを取得する


S3へ投稿するファイルは、一時的に端末内に保存して、そのURLをS3のSDKに指定する必要があります。
下記のメソッドで、S3へのアップロードする画像が保存されているURLを取得できます。
    private func generateImageUrl(_ uploadImage: UIImage) -> URL {
        let imageURL = URL(fileURLWithPath: NSTemporaryDirectory().appendingFormat("upload.jpg"))
        if let jpegData = UIImageJPEGRepresentation(uploadImage, 80) {
            try! jpegData.write(to: imageURL, options: [.atomicWrite])
        }
        return imageURL
    }


S3へアップロードする


下記のメソッドでS3へアップロードができます。下記のメソッドを呼ぶ前には、上記で記載している認証の設定を事前に実行する必要があります。
また、「uploadRequest?.bucket」にはAWS上で作成したバケット名を指定し、「uploadRequest?.key」にはS3上に保存したいファイル名を指定します。 なお、ファイル名は「test/hello.jpg」とするとAWSコンソールなどから見た際にtestフォルダ内にhello.jpgファイルが保存されているように見えるので、ファイルをまとめて管理したい場合には、「test/」などのプレフィックスをつけるとよいでしょう。
import AWSS3
...
...
    public func uploadImage(_ uploadImage: UIImage) {
        let transferManager = AWSS3TransferManager.default()
        let uploadRequest = AWSS3TransferManagerUploadRequest()
        uploadRequest?.bucket = "your S3 bucket name"
        uploadRequest?.key = "your file name on S3"
        uploadRequest?.body = generateImageUrl(uploadImage)
        transferManager?.upload(uploadRequest).continue({ (task: AWSTask) -> Any? in
            if task.error != nil || task.exception != nil {
                // エラー
            }
            return nil
        })
    }


2017年1月6日金曜日

iOS10のWKWebViewとUIWebViewでhttpでの通信を許容する方法

こんにちは、onukiです。

対応が必須になったATS(NSAppTransportSecurity)ですが
こちらの対応を行うとhttpでの通信は行えなくなります。
ただし、iOS10のWKWebViewとUIWebViewに限りInfo.plistにキーを追加するだけで
httpでの通信を許容してくれるので今回はそちらの紹介をします。

ATS(NSAppTransportSecurity)とは


Cocoa keys
簡単に言ってしまうとiOS9以上で以下の通信にhttpの通信が使えなくなります
  • WKWebView
  • UIWebView
  • NSURLSession
  • NSURLConnection

httpでの通信を許容するには


iOS10よりATSに関して新たなキー「NSAllowsArbitraryLoadsInWebContent」が追加されました。
このキーはWebViewを利用してウェブコンテンツを表示している場合、
その内容に関してはhttpでの通信を許容するというものです。

設定方法


Info.plistの「App Transport Security Settings」に
「NSAllowsArbitraryLoadsInWebContent」を追加し値を「YES」にする


注意


タイトルからiOS10としてきましたが、
「NSAllowsArbitraryLoadsInWebContent」は現状、iOS10のみ有効になります。
このキーを設定していてもiOS9ではWebViewでのhttp通信は弾かれてしまいます。