티스토리 뷰

iOS

iOS ) StoreKit

Zedd0202 2018. 6. 25. 01:45
반응형

안녕하세요 :) Zedd입니다.

너무 오랜만이져ㅛ../..

오늘은..StoreKit을 공부해보려고 합니다.

인앱구매는 아니고...

현재 제 앱에는...



이렇게 앱스토어 리뷰를 남길 수 있는 탭이 있고,

이걸 클릭하게 되면


이렇게 열리게 됩니다.

하지만 왼쪽 상단을 보시면 제 앱안에서 앱스토어가 열리는게 아니라, 진짜 앱스토어 앱이 열리게 되어서, 제 앱으로 다시 돌아가려면 저 왼쪽 상단을 누르거나 뭐 그래야겠죠?


하지만 얼마전에 StoreKit이라는 것을 알았씁니다 XD...모달로 앱스토어를 열 수 있다고 해요!

저는 처음..들어봤ㅁ는데요 ㅎㅎ...

그래서 공부할 겸!! 제 앱도 업데이트 할 겸.... StoreKit을 공부해보려고합니다. 

고고




StoreKit



StoreKit 문서를 먼저 읽어볼게요!

정의가 짧아서 넘나좋은...

"인앱 구매 및 App Store와의 상호 작용을 지원합니다."



OverView

앱에서 StoreKit을 사용하면, 다음과 같은 기능과 서비스를 제공 할 수 있습니다.


● In-App Purchase : 콘텐츠 및 서비스에 대한 인앱구매를 제공하고 홍보하세요.

● Apple Music : 사용자의 Apple Music기능을 확인하고, 구독하세요. 

● Recommendations and reviews : 권장사항 및 리뷰, 제 3자 콘텐츠에 대한 권장사항을 제공하고, 사용자가 앱을 평가하고 리뷰 할 수 있게 합니다. 


인앱구매와 추천 및 리뷰는 수긍?..이 가지만 애플뮤직은 넘나 신선하네요. 

완전 앱스토어랑 관련된 프레임워크 같은데...뮤직이라니.


아무튼 제가 해볼건 마지막! Recommendations and reviews를 StoreKit을 사용하여 해볼려고 합니다 :)



Recommendations and reviews가 아니더라도, 

이렇게 토픽과 관련된 문서가 또 따로 있으니 참고하세요! 저는 Recommendations and reviews를 읽어봐야겠죠?



사용자에게 다른 앱, 음악 및 비디오 미디어를 구입, 앱 평가, 리뷰 할 수 있는 옵션을 제공하세요.



Affiliate Recommendations (제휴사 권장사항..?)

- SKStoreProductViewController : 사용자가 앱스토어에서 미디어를 구입할 수 있는 페에지를 제공하는 ViewController입니다.
== 즉 앱스토어를 띄우고 싶으면 이 SKStoreProductViewController를 사용하면 되겠네요!

OverView를 보겠습니다.
사용자가 앱스토어에서 미디어를 구입 할 수 있는 스토어를 표시하려면, SKStoreProductViewController 객체를 만들고, 해당 delegate를 설정합니다. 그런 다음, ViewController를 다른 VIewController에서 modal로 표시합니다. delegate는, 사용자가 구매를 완료하면, ViewController를 닫습니다.(dismiss)
판매 할 특정 제품을 나타내려면,  iTunes  item identifier를  loadProduct(withParameters:completionBlock:)애 전달하세요. 



SKStoreReviewController : 사용자로부터 앱스토어 등급 및 리뷰를 요청하는 프로세스를 제어하는 객체. 

requestReview()메소드를 사용하여, 앱 로직 내에서 사용자가 앱의 평점과 리뷰를 물어볼 수 있는 시점을 나타냅니다. 



여기에 Requesting App Store Reviews에 대한 샘플코드와 설명이 있는데, 좀 길어서 중요한것만 요약할게요.


SKStoreReviewController를 사용하여 앱스토어 리뷰를 요청하면, 사용자에게 앱에 대한 피드백을 얻을 수 있습니다. 
그러나 프롬프트는 365일 내에 최대 3회까지 사용자에게만 표시된다는 사실을 알고있어야 합니다. 이 API를 사용하여 프롬프트를 표시할 시기와 위치를 선택하는 것은 중요합니다. 
리뷰요청을 표시하기 위해 자신의 앱 내에서 가장 좋은 위치에 대해 생각해보고, 시간을 지연시키는데 적합한 조건을 생각해보세요. 다음은 모범사례입니다. 

- 사용자가 앱에서 달성하고자하는 것을 방해하지 않는 시간에 요청을 시도하세요. 예를들어, 사용자가 성공적으로 완료한 일련의 이벤트가 끝날 때입니다.
- 사용자가 처음 앱을 실행한 것이 아니더라도, 사용자가 앱을 시작할 때 즉시 리뷰 요청을 표시하지 않도록 합니다.

"Also remember that the user can disable requests for reviews from ever appearing on their device, so you should avoid referring to your app showing this prompt and never request a review using requestReview() as the result of a user action."
이게 잘 깔끔하게 해석이 안돼서...원문을 올려놓을게요.
또한 사용자는 기기에 표시되는 리뷰 요청을 사용중지 할 수 있으므로, 이 메세지가 표시된 앱을 참조하지 말고, 유저 액션의 결과로 requestReview()를 사용하여 리뷰를 요청하지 마세요. (......내가 지금 하려는 건데..)

샘플코드는 UserDefaults를 이용하여 count를 저장한다음, 4번을 넘게되면 리뷰 요청 프롬프트를 띄우는 예제입니다. 

일단..!! 제가 지금 리뷰 요청을 하는 코드입니다.

if let url = URL(string: "itms-apps://itunes.apple.com/app/id앱아이디?action=write-review"),

                    UIApplication.shared.canOpenURL(url) {

                    if #available(iOS 10.0, *) {

                        UIApplication.shared.open(url, options: [:], completionHandler: nil)

                    } else {

                        UIApplication.shared.openURL(url)

                    }

                }



이렇게 하면 따로 앱스토어 앱이 뜨게 되는데, 이걸 앱내에서 뜨도록 바꿔보도록 합시다. 

먼저 오늘의 프레임워크인 StoreKit을 import해야합니다. 


import StoreKit



그리고, 

위에서 말했다시피, SKStoreProductViewController를 사용하면 


이러한 리뷰창이 뜨는게 아니라, 그 해당 앱의 홈으로 가게 됩니다. 한번 해봅시당. 


let viewController = SKStoreProductViewController()

viewController.delegate = self


let parameters = [

                    SKStoreProductParameterITunesItemIdentifier: 앱 identifier

                ]

viewController.loadProduct(withParameters: parameters, completionBlock: nil)

self.present(viewController, animated: true, completion: nil)


위에가 메인 코드인데요, 


class SettingViewController: UIViewController, SKStoreProductViewControllerDelegate


현재 ViewController가 SKStoreProductViewControllerDelegate를 준수하도록 해줘야 합니다. 

그리고 파라미터로 내 앱 identifier를 넘기고, (여기서 parameter엔 여러가지가 들어갈 수 있습니다. 현재 필요한건 앱 identifier밖에 없어서..


....ㅜㅜ

그리고 위에 overview에서 

"판매 할 특정 제품을 나타내려면,  iTunes  item identifier를  loadProduct(withParameters:completionBlock:) 전달하세요."라고 하니, loadProduct메소드를 호출해줍니다. 그리고 viewController를 present해주면...!!




이렇게 왼쪽에 완료버튼이 뜨면서 제 앱 안에서 이렇게 제 앱 홈화면?을 보여주게 됩니다. 

지금은 완료버튼을 눌러도;;아무 반응을 안할텐데요, delegate메소드를 작성해주어야 합니다. 


func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {

        viewController.dismiss(animated: true, completion: nil)

    }


이렇게!! SKStoreProductViewControllerDelegate의 delegate메소드를 구현해주게 되면, 완료버튼을 눌러도 잘 사라지는 것을 볼 수 있습니다. 


하지만 제 목적은..리뷰.......

위에서 언급한 

SKStoreReviewController를 사용하면 되겠죠? SKStoreReviewController는 상당히 간단한데요, 

if #available(iOS 10.3, *) {

                    SKStoreReviewController.requestReview()

} else {

                    // Fallback on earlier versions

 }



코드 끝?;;;;

ㅇㅇ끝

class메소드라 바로 호출이 가능;

위에 주석을 꼭 읽어야 할 것 같네요. 읽어봅시다.


StoreKit에게 앱리뷰를 요청합니다. UI가 표시될 수도 있고, 표시되지 않을 수도 있습니다.

이것은 사용자에게 알림을 표시하지 않을 수도 있기 때문에, 버튼이나 다른 사용자의 action에서 사용하기에는 적합하지 않습니다. 쓰기 리뷰양식을 제시하기 위해, 쿼리 "action=write-review"를 product url에 추가하여 앱스토어에서 딥링크를 사용할 수 있습니다. 


네 위에서도 아주 잠깐 언급했는데. 저는 


이런 "버튼"을 누르면 리뷰를 쓸 수 있게 해놓아서..!! UI가 뜰 수도 있고, 안 뜰 수도 있기 때문에...이런상황에서는 적합하지 않다고 하네요. 

위에서 "never request a review using requestReview() as the result of a user action."라고 한번 했었죠? 


뭐 어쩔 수 없죠...! 

위 코드를 실행하게 되면, 

이런 alert창 한번쯤은..보셨겠죠? 아무튼 이 프롬프트를 띄워주는게 SKStoreReviewController였네요!

여기서 별점을 클릭하면,


이렇게 취소와 보내기버튼이 있는데, 지금은 보내기버튼이 비활성화되어있죠? 

네..개발버전이라 그렇고ㅎㅎ실제 배포하고 다운받으면 보내기버튼이 활성화되어있다고 합니다..!!

보내기를 누르면

이런 창이 "모달로" 뜬다고 합니다 :)



StoreKitㅎㅎㅎ..이렇게 아주 간단하게 봤는데요.

제가 모르던 내용이 너무나 많았고 알게되어서 다행이네요 :)

아직 인앱구매는...해본적이 없지만 나중에 하게 된다면 글을 꼭 써보겠씁니당


그리고 결과적으로 기존 코드를 유지해야겠네요.

아무튼!!! 도움이 되었길 바랍니다. 





참고 :

https://medium.com/@satheesh4590/get-customers-ratings-reviews-within-your-app-for-ios-c9662a4c3a2e


https://developer.apple.com/documentation/storekit/skstorereviewcontroller/requesting_app_store_reviews?changes=_2

반응형

'iOS' 카테고리의 다른 글

iOS ) UIStatusBar  (5) 2018.07.28
iOS ) windowLevel  (0) 2018.07.28
iOS ) hitTest  (16) 2018.06.13
iOS ) UIApplication  (3) 2018.05.27
iOS ) UIResponder  (5) 2018.05.26