Alamofire를 이용한 이미지 파일 업로드 구현

2018. 1. 1. 00:27아이폰 개발

Swift에서 쉽게 multipart/formdata 형식으로 이미지 파일을 업로드(POST 방식)할 수 있는 라이브러리가 있어서 적용해보니 생산성이 무척 좋다.


import Alamofire


Alamofire.upload(multipartFormData: { (multipartFormData) in

            multipartFormData.append(UIImageJPEGRepresentation(UIImage(named: "1.png")!, 1)!, withName: "image", fileName: "swift_file.jpeg", mimeType: "image/jpeg")

            for (key, value) in parameters {

                multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)

            }

        }, to:"http://127.0.0.1:3000/picture")

        { (result) in

            switch result {

            case .success(let upload, _, _):

                

                upload.uploadProgress(closure: { (Progress) in

                    print("Upload Progress: \(Progress.fractionCompleted)")

                })

                

                upload.responseJSON { response in

                    //self.delegate?.showSuccessAlert()

                    print(response.request)  // original URL request

                    print(response.response) // URL response

                    print(response.data)     // server data

                    print(response.result)   // result of response serialization

                    //                        self.showSuccesAlert()

                    //self.removeImage("frame", fileExtension: "txt")

                    if let JSON = response.result.value {

                        print("JSON: \(JSON)")

                    }

                }

                

            case .failure(let encodingError):

                print(encodingError)

            }

            

        }


* 아카이브 빌드를 하고 앱스토어에 등록하려고 하니 "이 빌드가 유효하지 않습니다."라면서 등록이 안되는 문제가 발생했다. 그리고 다음과 같은 메일이 날라왔다.

Dear developer,

We have discovered one or more issues with your recent delivery for "AppName". To process your delivery, the following issues must be corrected: 

Invalid Bundle - One or more dynamic libraries that are referenced by your app are not present in the dylib search path. 

Once these issues have been corrected, you can then redeliver the corrected binary. 

Regards,

The App Store team

 

이에 대한 해결 방법은 다음과 같다. 예전에도 이와 비슷하게 외부 라이브러리 관련된 에러가 있었는데 비슷한 유형인 듯하다.

https://stackoverflow.com/questions/38667492/how-to-debug-invalid-bundle-error-which-happens-only-after-submitting-to-app-s

After adding the custom Swift framework to my project I got this email after uploading the app to iTunes connect.

I got this email from iTunes store,

Invalid Bundle - One or more dynamic libraries that are referenced by your app are not present in the dylib search path.

The fix is simple for this issue,

Step 1: Make sure your Custom framework is added to Embedded Binaries in General tab of your target. enter image description here

Step 2: Under build settings,

Set Always Embed Swift Standard Libraries = Yes for your main project target.

And Set Always Embed Swift Standard Libraries = No for your custom framework target.

This solved my problem and I was able to upload binary to iTunes connect.


--------------------


Alamofire is an HTTP networking library written in Swift.

https://github.com/Alamofire/Alamofire


세련된 HTTP 프레임워크 Alamofire

https://outofbedlam.github.io/swift/2016/02/04/Alamofire/


[Raywenderlich - iOS/Swift] Alamofire 사용하기

http://rhammer.tistory.com/115


* git의 서브 모듈은 처음 써보는데, 다음과 같이 처리하면 된다.

--------------------------

http://ohgyun.com/711


다른 이름으로 부모 리파지터리를 클론해보자.

~/mywork
$ git clone git@github.com:ohgyun/submodule_test_parent.git submodule_test_parent_2

~/mywork
$ cd submodule_test_parent_2

이렇게 서브모듈이 포함된 리파지터리를 클론하면,
submodule_test_child 디렉토리는 존재하지만 내용은 비어있다.

~/mywork/submodule_test_parent_2
$ ls submodule_test_child


먼저, 서브모듈을 가져오려면 먼저 초기화 해야한다.

~/mywork/submodule_test_parent_2
git submodule init
Submodule 'submodule_test_child' (git@github.com:ohgyun/submodule_test_child.git) registered for path 'submodule_test_child'


다음으로 서브모듈을 업데이트한다.

~/mywork/submodule_test_parent_2
$ git submodule update
Cloning into 'submodule_test_child'...
...
Submodule path 'submodule_test_child': checked out '45069090990ad8c291f5f67b23c0aca83d6a4d6f'


서브모듈을 업데이트한다는 건,
현재 부모 리파지터리의 커밋에서 참조하고 있는 서브모듈의 커밋을,
자식 리파지터리의 리모트에서 체크아웃해온다는 뜻이다.

자식 프로젝트의 디렉토리로 이동해 로그를 확인해보면 대상 커밋으로 채워진 걸 확인할 수 있다.