Sure, Why not?

문의하기, 평가하기, 공유하기, 앱정보 표시 본문

💻

문의하기, 평가하기, 공유하기, 앱정보 표시

joho2022 2025. 2. 6. 13:52

문희아니고 문의입니다.

 

 

흔하게 경험할 수 있는

앱의 4가지 요소

 

이를 직접 구현하면서

재미있기도 하고,

신기하기도 하면서,

나중에도 또 들여다볼 일이 반드시 있을 것 같아 기록하고자 한다.

 

[ 2 / 22 ]

중간에 나오는 AppID는 App Store Connect -> 앱 정보에서 Apple ID를 확인하면 된다.


 

 

문의하기

메일 보내는 방법은

  1. 서버에 직접 문의 내용을 전달
  2. 이메일 앱을 직접 열기
  3. 앱에서 직접 이메일 작성할 수 있는 공식 API 사용하기

정도로 추려낼 수 있을 것이다.

 

그 중에 3번으로 MFMailComposeViewController 을 사용하여 문의하기를 구현하기로 결정하였다.

https://developer.apple.com/documentation/messageui/mfmailcomposeviewcontroller

 

MFMailComposeViewController | Apple Developer Documentation

A standard view controller, whose interface lets the user manage, edit, and send email messages.

developer.apple.com

앱 내에서 이메일을 작성하고 보낼 수 있는 표준 뷰컨트롤러이다.

 

제목, 받는 사람, 본문, 첨부 파일로 설정해서 이메일을 구성할 수 있음.

사용하기 전에 이메일 보낼 수 있는 상태인지 canSendMail()을 호출하면 됨.

메일을 보낼 수 없는 상태면, 비활성화하거나 대에 이메일 방식인 mailto 해야 한다. -> 나는 알림창으로 대응하기로 하였다.

 

private func handleContactUs() {
        if MFMailComposeViewController.canSendMail() {
            let mailComposeVC = MFMailComposeViewController()
            mailComposeVC.mailComposeDelegate = self
            
            mailComposeVC.setToRecipients(["josama2022.dev@gmail.com"])
            mailComposeVC.setSubject("[InvestMate] 문의하기")
            
            let deviceInfo = """
                
                이곳에 내용을 작성해주세요
                
                
                ================================
                App Version : \(appVersion)
                Device Model : \(UIDevice.current.model)
                Device OS : \(UIDevice.current.systemVersion)
                ================================
                """
            
            mailComposeVC.setMessageBody(deviceInfo, isHTML: false)
            present(mailComposeVC, animated: true)
        } else {
            self.showMailErrorAlert()
        }
    }

 

해당 코드로 다음과 같은 결과를 확인할 수 있다.

 

canSendMail false일때 / 문의하기 / 문의받은 내용확인

 


평가하기

1년 내에 최대 3회만 가능한 인앱리뷰와 다르게 앱스토어 리뷰 페이지 이동하는 방식으로 구현하였다.

(Deprecated이기도 하고 ㅎㅎ)

 

https://developer.apple.com/documentation/storekit/requesting-app-store-reviews

 

Requesting App Store reviews | Apple Developer Documentation

Implement best practices for prompting users to review your app in the App Store.

developer.apple.com

샘플코드를 인용하였다. 실제 앱 준비 단계에서 앱 ID로 교체해야 함

 

private func handleRateApp() {
        // TODO: 실제 앱 ID로 교체하기
        
        let appID = "idYOUR_APP_ID"
        guard let url = URL(string: "https://apps.apple.com/app/id\(appID)?action=write-review") else {
            return
        }
        
        UIApplication.shared.open(url)
    }

 

 

평가하기 (앱 ID없음 )

 

 


 

공유하기

UIActivityViewController 사용하여 일관된 공유하기 경험을 제공할 수 있음

 

init(activityItems:applicationActivities:)에서

activityItems는 공유할 데이터, Any 타입 파리미터

applicationActivities는 커스텀 공유 액션추가할 수 있는 파리미터

 

private func handleShare() {
        let appStoreURL = "https://apps.apple.com/app/id\(appID)?action=write-review"
        let message = """
                [InvestMate]
                주식 물타기 계산기 📈
                합리적인 매수 전략을 세워보세요!
                
                """
        
        let itemsToShare: [Any] = [
            message,
            appStoreURL
        ]
        
        let activityVC = UIActivityViewController(
            activityItems: itemsToShare,
            applicationActivities: nil
        )
        
        present(activityVC, animated: true)
    }

 

공유하기

 

 

앱 정보 표시

let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "Unknown"
let buildNumber = Bundle.main.infoDictionary?["CFBundleVersion"] as? String ?? "Unknown"

간단히 코드로 표현할 수 있다. 

 


 

그런데, 원래 프로젝트를 생성하는 방법과 달리

난 프로젝트 설정을 Tuist로 관리하고 있기 때문에

별도로 앱 버전과 빌드 번호 설정이 필요했다.

 

그리고 각 모듈을 나눠서, Presentation레이어로 분리하여 작업중이다. 

그래서

앱 버전과 빌드 번호 다르게 나올 때도 있었는데,

앱 모듈에 돌린다면, 정상적으로 나오니 놀라지 말자. (내가 놀랬었음)