테스트환경

 

VM virtual Box

 

Os: centos

Apache 2.4

Php 7.3.33

 

sudo su

curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo

sudo yum update

sudo ACCEPT_EULA=Y yum install -y msodbcsql mssql-tools unixODBC-devel

sudo yum groupinstall "Development Tools"

sudo pecl install sqlsrv

sudo pecl install pdo_sqlsrv

 

이후 php.ini찾아서

 

extension = sqlsrv.so

extension=pdo_sqlsrv.so

 

추가후 

 

service httpd restart로 apache 재시작

 

반응형

'코딩쟁이 > mssql' 카테고리의 다른 글

[MS SQL]CONCAT함수..  (0) 2018.12.10
phpexcel 로 업로드시 alt+enter찾기  (0) 2018.12.10

2020년 9월 17일 IOS 14가 정식 오픈 되었습니다.

 

베타 버전을 깔지 않았던 저는 아침에 일어나자마자 IOS업데이트를 했죠.

 

그런데 업데이트를 하고 회사 업무 어플에 접속을하니 자꾸 튕기네요....

 

Google Analytics를 확인해 보았더니 AppDelegate.swift에서 didFailToRegisterForRemoteNotificationsWithError의 구문에러...

 

확인해보니..

 

Xcode업데이트 후 build Settings -> product Name 이 한글이었습니다...(ios13까지는 문제없었던곳)

 

이부분을 영문으로 바꾼후 빌드하니.

 

fcm토큰 제대로 나오고 푸시기능 다시 살아났습니다.

 

휴..

 

다시 빌드해서 심사 올려보내야겠습니다...(gps때문에 리젝났는데 언제 다시 승인 날지..)

 

아래는 해당 오류 관련 github의 글이고 해당글도 한국분들께서 오류가 나서 찾으신것 같습니다.

 

github.com/invertase/react-native-firebase/issues/4093

 

iOS 14 Beta4 push notification permission failed · Issue #4093 · invertase/react-native-firebase

Issue First. I have no error in iOS 12/13 now. but iOS 14 Beta4 push notification permission failed. Exception thrown when 'await messaging().requestPermission();' is called. when requestPe...

github.com

 

 

반응형

Apache : 2.4.41

OpenSSL : 1.1.1c

 

conf/httpd.conf 에서

 

LoadModule http2_module module/mod_http2.so  //주석해제

 

 

httpd.conf 제일하단 http2 활성화

 

#http2적용
ProtocolsHonorOrder On
Protocols h2 h2c http/1.1

 

 

 

 

 

 

 

 

 

반응형

git init

 

git clone <repository 주소>

 

git config user.name <username>

 

git config user.email <useremail>

 

git remote add origin <git repo Url>

 

git checkout -t origin/브랜치명

 

 

 

반응형

ios 에서 백그라운드로 전송할수있는 오픈소스 라이브러리중 강력한 Alamofire가 있다.

 

https://github.com/Alamofire/Alamofire

 

Alamofire/Alamofire

Elegant HTTP Networking in Swift. Contribute to Alamofire/Alamofire development by creating an account on GitHub.

github.com

기본적인 HTTP 통신으로 GET POST 등의 기능을 간단하게 수행할수 있도록 도와준다.

 

먼저 내가 사용한 기능은 사진업로드와 다운로드 기능이다.

 

Swift에서 사진 업로드와 다운로드를 구현을 위해 Android에서 활용했던 HttpRequestor 의 기능을 검색 도중 알게 되었다.

 

사용법은 간단하다.

 

cocoaPods 으로 pod를 추가한다.

 

pod 'Alamofire', '~> 5.0'

 

 이후 

 

import Alamofire

Alamofire 를 사용할수있게 import 해준다.

 

AF.upload(multipartFormData: { multipartFormData in
       // multipartFormData.append(데이터, withName: "Name")

}, to: URL)
.responseJSON { response in
//응답받아 처리하는곳
}
 

Upload 는 간단하게 FormData를 보낼수있다.

Server에서 받을 Name을 지정하고 데이터를 같이 보내면 서버에서 $_POST['Name'] 으로 받을수있다.

 

  let destination: DownloadRequest.Destination = { _, _ in
         let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,
         .userDomainMask, true)[0]
         let documentsURL = URL(fileURLWithPath: documentsPath, isDirectory: true)
         let fileURL = documentsURL.appendingPathComponent("image.jpg")

         return (fileURL, [.removePreviousFile, .createIntermediateDirectories]) }
 
 
 
 AF.download(file_url, to: destination)
        .downloadProgress { progress in
               print("Download Progress: \(progress.fractionCompleted)")
            }
        .response { response in
                    debugPrint(response)
            if response.error == nil, let imagePath = response.fileURL?.path {
                        let image = UIImage(contentsOfFile: imagePath)
                                               
                        UIImageWriteToSavedPhotosAlbum(image!, nil, nil, nil)

                    }
                }

다운로드는 먼저 fileUrl로 받아온 데이터를 다운로드 후 메모리에 적치한다.(이때 tmp파일로 임시 저장되며 UIImage를 활용할수 있게 된다.

 

그후 UIImageWriteToSavePhotosAlbum 메소드를 사용하여 Image를 저장할수 있는데 이때 포토라이브러리의 권한이 필수이다.

 

이렇게 하면 웹에서 사진의 URL정보만 넘겨받으면 사진을 바로 저장이 가능하다.

반응형

웹에서 ios 를 활용하여 파일 업로드 하는 방법중 

 

<input type='file' />

이 있다. 

 

하지만 이 방법은 내가 원하는 기능의 쉬운 접근법은 될지 몰라도 완벽한 기능을 구현하지는 못하였다.

 

내가 원하는 기능은

 

1. 사진을 여러장 촬영 첨부할수 있을것.

2. 사진촬영, 사진첩 선택촬영 두가지 기능 모두 가능할것.

 

위 두가지가 모두 만족해야 했다. 하지만 1번에서 촬영한 사진을 첨부할경우 <input type='file' /> 을 여러개 사용하면 가능하지만.

 

안드로이드와 같은 페이지를 바라보게 설계된 나의 앱에서는 페이지의 뷰가 변경되어서 사용자에게 혼란을 줄수 있다고 판단하였다.

 

그래서 위의 기능을 모두 충족할 방법을 찾다가 ImagePickerController 를 swift에서 사용할수 있다는 정보를 얻어 구글링과 책을 찾아보았다.

 

먼저 나는 모든 기능을 ViewController에서 해결한다.(아직 기능도 많지않고.. swift초보라 어려움)

 

import MobileCoreServices

를 추가하여 헤더 파일을 import 한후

 

extension ViewController:UIImagePickerControllerDelegate,UINavigationControllerDelegate{
}

 필자는 해당 기능을 extension으로 빼서 활용했으므로 extension 에 UIImagePickerControllerDelegate, UINavigationControllerDelegate 를 추가하였다.

 

func btnCaptureImageFromCamera(_ sender: Any) {
        if (UIImagePickerController.isSourceTypeAvailable(.camera)) {
            flagImageSave = true
            
            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            imagePicker.mediaTypes = [kUTTypeImage as String]
            imagePicker.allowsEditing = false
            
            present(imagePicker, animated: true, completion: nil)
        }
        else {
            myAlert("Camera inaccessable", message: "Application cannot access the camera.")
        }
    }
    
    func btnLoadImageFromLibrary(_ sender: Any) {
        if (UIImagePickerController.isSourceTypeAvailable(.photoLibrary)) {
            flagImageSave = false
            
            imagePicker.delegate = self
            imagePicker.sourceType = .photoLibrary
            imagePicker.mediaTypes = [kUTTypeImage as String]
            imagePicker.allowsEditing = false
            
            present(imagePicker, animated: true, completion: nil)
        }
        else {
            myAlert("Photo album inaccessable", message: "Application cannot access the photo album.")
        }
    }

그리고 카메라 촬영과, 사진첩 불러오는 기능을 구현해주었다. 

 

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        let mediaType = info[UIImagePickerController.InfoKey.mediaType] as! NSString

        if mediaType.isEqual(to: kUTTypeImage as NSString as String) {
            captureImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage
            
            if flagImageSave {
                print("사진저장들어왔지요")
            }
            
            if (UIImagePickerController.isSourceTypeAvailable(.camera)) {

                
                let imgName = UUID().uuidString+".jpeg"
                let documentDirectory = NSTemporaryDirectory()
                let localPath = documentDirectory.appending(imgName)                
                let data = captureImage.jpegData(compressionQuality: 0.3)! as NSData
                data.write(toFile: localPath, atomically: true)
                let photoURL = URL.init(fileURLWithPath: localPath)
                
                //카메라로 촬영했을때 로직구현
                


            }else if(UIImagePickerController.isSourceTypeAvailable(.photoLibrary)){
                
                let imageUrl=info[UIImagePickerController.InfoKey.imageURL] as? NSURL
                 let imageName=imageUrl?.lastPathComponent//파일이름
                let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
             
                 let photoURL          = NSURL(fileURLWithPath: documentDirectory)
                let localPath         = photoURL.appendingPathComponent(imageName!)//파일경로
                let data=NSData(contentsOf: imageUrl as! URL)!
                
                //사진첩(라이브러리)로 사진을 가져왔을때 로직구현
                
            }

        }
        else if mediaType.isEqual(to: kUTTypeMovie as NSString as String) {
            if flagImageSave {

            }
        }

        self.dismiss(animated: true, completion: nil)
    }

가장 중요한 부분인 

 

사진을 선택했을때 앱에서 처리해주어야 할부분을 위와 같이 구현하였다.

 

사진첩으로 사진을 선택했을때와, 카메라로 사진을 촬영했을때 2가지로 나누어서 로직을 구현하였는데 

 

이유는 카메라로 촬영하였을때 info[UIImagePickerController.InfoKey.imageUrl] 의 값이 nil로 반환되어 파일에 접근을 하지 못하였다.

 

(카메라로 촬영하였을때는 기기에 사진파일이 저장되지 않은 상태라 imageUrl의 추출이 안되는것으로 생각된다.)

 

그래서 카메라로 촬영하였을때는 임의 파일을 생성하여 내가 촬영한 이미지를 해당 파일에 임시로 할당하여 사진파일에 접근 가능하도록 구현하였다.

 

 

 

 

반응형
<iframe src="PDF 주소" /></iframe>

 

위 방법을 사용중 문제가 발생하였다.

 

PC웹브라우져(익스,크롬) , IOS사파리(IOS wkwebview) 에서는 제대로 작동하는데

 

안드로이드(webview)에서는 해당 기능이 무슨이유에서인지 작동을 하지않는다.

 

이와 같이 PDF 뷰어가 작동하지않아 구글링 결과 구글 DOCS에서 뷰어를 iframe 으로 사용할수 있게 도와주는 기능이 있다..

 

사용방법은

 

<iframe src="https://docs.google.com/gview?url=PDF파일URL&embedded=true" /><iframe>

위와 같이 PDF파일URL 부분에 본인이 넣고싶은 PDF파일의 주소를 넣고 iframe을 사용하면된다.

 

 

문제점:

 

1. 간혹 PDF파일이 로드되어 지지 않는 문제발생(미리보기없음이란 문구가 나옴)

- PDF 파일의 크기과 문제 없고 구글 DOCS상의 버그? 같아보임. 

- 다시 새로고침하여 로드하면 제대로 로드됨

 

 

 

반응형

사진은 <img>태그로 바로 섬네일을 만들거나 이미지를 바로 보여줄수 있다.

 

크롬에서 PDF파일을 다운로드 받아 실행하면 PDF뷰어 처럼 사용할수있다.

 

웹에서 PDF뷰어 플러그인을 따로 설치하지 않고 뷰어처럼 사용할수 있다.

 

<iframe src="PDF주소URL" />

위와 같이 사용하면 바로 PDF를 볼수있다.

 

 

반응형

+ Recent posts