내가 만든 어플리케이션에서 다른 어플리케이션의 다운로드를 유도할 때 다음과 같은 코드를 사용하여 앱스토어 다운로드뷰로 이동을 하는 경우가 있습니다.
NSString *appUrl = @"https://itunes.apple.com/kr/app/kukileon-for-kakao/id608808713";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:appUrl]];
하지만 이경우 앱간 전환하는 모션을 보여주게 되며 유저에게 부담스러운 행위로 인식될 수 있습니다. iOS 6.0 이상부터 제공 되는 SKStoreProductViewController를 이용하여 앱스토어 링크로의 이동을 모달뷰로 띄울 수 있게 되었습니다. SKStoreProductViewController를 사용하기 위해서는 StoreKit.framework의 추가가 필요합니다.
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
@interface ViewController : UIViewController <SKStoreProductViewControllerDelegate>
@end
헤더파일에는 StoreKit.h 파일을 임포트하고 SKStoreProductViewControllerDelegate 프로토콜을 추가해줍니다. 이 부분은 선택사항이 아니라 반드시 구현해야 하는 부분입니다.
- (IBAction)linkToAppstoreWithUrl:(id)sender {
// 기존의 방식으로 앱스토어 이동을 위한 링크
NSString *appUrl = @"https://itunes.apple.com/kr/app/kukileon-for-kakao/id608808713?mt=8";
// iOS 6.0이상에서 SKStoreProductViewController를 이용하기 위한 어플리케이션 아이디
NSString *appId = @"608808713";
// SKStoreProductViewController를 사용할 수 있는지 여부 확인
if(NSClassFromString(@"SKStoreProductViewController")) {
SKStoreProductViewController *storeController = [[SKStoreProductViewController alloc] init];
storeController.delegate = self;
NSDictionary *productParameters = @{ SKStoreProductParameterITunesItemIdentifier : appId };
[storeController loadProductWithParameters:productParameters completionBlock:^(BOOL result, NSError *error) {
if (result) {
[self presentViewController:storeController animated:YES completion:nil];
} else {
[[[UIAlertView alloc] initWithTitle:@"오류발생"
message:@"앱스토어 링크를 여는데 오류가 발생하였습니다."
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles: nil] show];
}
}];
} else {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:appUrl]];
}
}
#pragma mark SKStoreProductViewControllerDelegate
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController
{
// 앱스토어 모달창에서 사용자가 취소버튼을 눌렀을 때 취할 행동 구현, 창을 닫습니다.
[viewController dismissViewControllerAnimated:YES completion:nil];
}
iOS 6.0 미만 버전에서도 정상적으로 동작하도록 하기 위해 기존의 방식 또한 함께 구현하였습니다. loadProductWithParameters:completionBlock: 이 호출되면 해당 앱스토어의 정보를 원격지에서 읽어옵니다. 이 과정이 끝나면 completionBlock으로 진입하게 되는데 result값에 정상적으로 로드가 되었는지 여부가 담겨오게 됩니다.
정상적으로 로드가 되었다면 위의 예시처럼 storeController를 띄워줍니다. 여기서 추가로 중요한 부분은 productViewControllerDidFinish: 의 구현입니다. 델리게이트를 통해 사용자가 앱스토어창을 닫을려고 시도할 때에 이 메소드에 진입하게 됩니다. 창을 닫아주시면 됩니다. 구현 화면의 예시는 다음과 같습니다.