アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

Swiftでファイルをs3にuploadしてみる。


目次
1. cocoapodsをinstallして、Podfileからライブラリをinstall
2. AWSのUpload用のバケットをs3で作成
3. AppDelegate.swiftにS3のupload用のコードに貼り付け
4. SwiftからS3に画像をアップロード
5. s3で画像の確認


1. cocoapodsをinstallして、Podfileからライブラリをinstall

brewじゃなく、gemでcocoapodsをinstall。

1. install CocoaPods and setup

$ gem install cocoapods
$ pod setup

2. プロジェクト floder へ移動

3. podfile 作成
$ pod init

4. podfile 書き直す ('AWSCognito' 'AWSS3'を付け足す)
$ open Podfile

# pod 'AWSCognito' 'AWSS3' をPodfileに追記
```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'ResNet50prj' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for ResNet50prj
  pod 'AWSCognito' # ここ
  pod 'AWSS3' # ここ
  target 'ResNet50prjTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'ResNet50prjUITests' do
    # Pods for testing
  end

end
```

5. ライブラリをinstall
$ pod install
```


2. AWSのUpload用のバケットをs3で作成

AWS > Cognito > IDプールの管理 > 新しい ID プールの作成

・IDプール名 :に任意の名前を入力
・認証されていないIDのアクセスを有効にする

でプールの作成

次に詳細で「ポリシードドキュメント」を編集

S3のPutObject(必要であればGetObjectも)の許可を追加。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",   ←ここを追加
        "s3:GetObject",   ←もしS3に保存した画像をアプリで取得したければ追加
        "mobileanalytics:PutEvents",
        "cognito-sync:*",
        "cognito-identity:*"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

「許可」をクリック

Amazon Cognitoで作業開始」で赤枠のコードをコピー

3. AppDelegate.swiftにS3のupload用のコードに貼り付け

XocdeのAppDelegate.swiftを開き、下の作業。
・AWSCognitoをインポート
・コピーしたコードをのdidFinishLaunchingWithOptionsの中に貼り付け

import AWSCognito
...
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
  let credentialsProvider = ****
  let configuration = ****
  AWSServiceManager.default().defaultServiceConfiguration = configuration
  return true
}


4. SwiftからS3に画像をアップロード

s3で「"pacifista-px3"」名前のバケットを作成。


AWSS3.swift

import SwiftUI
import AWSS3

func uploadData(data: Data)-> String{
    var results_ = ""
    
    let transferUtility = AWSS3TransferUtility.default()
    // アップロードするバケット名/アップしたいディレクトリ
    let bucket = "pacifista-px3"
    // ファイル名
    let key = "users.png"
    let contentType = "application/png"
    // アップロード中の処理
    let expression = AWSS3TransferUtilityUploadExpression()
    expression.progressBlock = {(task, progress) in
       DispatchQueue.main.async {
         // アップロード中の処理をここに書く
       }
    }
        
    // アップロード後の処理
    let completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
    completionHandler = { (task, error) -> Void in
       DispatchQueue.main.async {
         if let error = error {
             fatalError(error.localizedDescription) // 失敗
             results_ = "upload falid"
         } else {
            // アップロード後の処理をここに書く
             results_ = "upload succeed"
         }
       }
     }
        
     // アップロード
     transferUtility.uploadData(
       data,
       bucket: bucket,
       key: key,
       contentType: contentType,
       expression: expression,
       completionHandler: completionHandler
     ).continueWith { (task) -> Any? in
       if let error = task.error as NSError? {
           fatalError(error.localizedDescription)
           results_ = "upload falid"
       } else {
           // アップロードが始まった時の処理をここに書く
           results_ = "upload succeed"
       }
       
       return nil
     }
    return results_
   }


ContentView.swift

struct ContentView: View {
    // config
    @State var S3result = ""

    〜〜〜〜〜〜〜
    func S3Upload(uiimage:UIImage){
        if let pngImage = uiimage.pngData() {
            S3result = uploadData(data: pngImage)
        }
    }
    // main
    var body: some View {
        VStack {
            〜〜〜〜
            Text(S3result)
                .padding()
                .font(.title)
            Button("Upload to S3"){
                S3Upload(uiimage:captureImage!)
            }
            .frame(height: 50)
            .multilineTextAlignment(.center)
   〜〜〜〜〜〜
         } 
    }
}

uploadしてみる。




成功した。

5. s3で画像の確認

バケットにちゃんとあるのがわかる


Swiftでs3に画像をuploadできた。

参考

【Xcode/Swift】CocoaPodsの使い方を徹底解説
SwiftからS3に画像をアップロードする方法