Tag Archives: Modal

[iOS] 앱스토어 링크 모달창으로 띄우기

내가 만든 어플리케이션에서 다른 어플리케이션의 다운로드를 유도할 때 다음과 같은 코드를 사용하여 앱스토어 다운로드뷰로 이동을 하는 경우가 있습니다.

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: 의 구현입니다. 델리게이트를 통해 사용자가 앱스토어창을 닫을려고 시도할 때에 이 메소드에 진입하게 됩니다. 창을 닫아주시면 됩니다. 구현 화면의 예시는 다음과 같습니다.