[ios] 앱 스토어의 앱에 연결하는 방법


10 Answers

App Store에 직접 앱을 열려면 다음을 사용해야합니다.

itms-apps : // ...

이 방법을 사용하면 먼저 iTunes로 이동하지 않고 App Store 앱을 열 수 있습니다 (단지 itms : //를 사용할 때만).

희망이 도움이됩니다.

EDIT : APR, 2017. itms-apps : // 실제로 iOS10에서 다시 작동합니다. 나는 그것을 시험했다.

EDIT : APR, 2013. iOS5 이상에서는 더 이상 작동하지 않습니다. 그냥 사용하십시오.

https://itunes.apple.com/app/id378458261

리디렉션이 더 이상 없습니다.

Question

나는 내 iPhone 게임의 무료 버전을 만들고있다. 나는 사람들을 앱 스토어에서 유료 버전으로 데려가주는 무료 버전 안에 버튼을 갖고 싶다. 표준 링크를 사용하는 경우

http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=300136119&mt=8

iPhone은 Safari를 먼저 열고 앱 스토어를 엽니 다. 앱 스토어를 직접 여는 다른 앱을 사용 했으므로 가능하다는 것을 알고 있습니다.

어떤 아이디어? 앱 스토어의 URL 스키마는 무엇입니까?




iTunes에 앱을 만들면 앱을 제출하기 전에 앱 ID를 얻을 수 있다는 것을 확인할 수 있습니다.

따라서..

itms-apps://itunes.apple.com/app/id123456789

NSURL *appStoreURL = [NSURL URLWithString:@"itms-apps://itunes.apple.com/app/id123456789"];
    if ([[UIApplication sharedApplication]canOpenURL:appStoreURL])
        [[UIApplication sharedApplication]openURL:appStoreURL];

치료를해라.




iOS 6부터 SKStoreProductViewController 클래스를 사용하여 올바른 방법으로 시작합니다.

스위프트 3.x :

func openStoreProductWithiTunesItemIdentifier(identifier: String) {
    let storeViewController = SKStoreProductViewController()
    storeViewController.delegate = self

    let parameters = [ SKStoreProductParameterITunesItemIdentifier : identifier]
    storeViewController.loadProduct(withParameters: parameters) { [weak self] (loaded, error) -> Void in
        if loaded {
            // Parent class of self is UIViewContorller
            self?.present(storeViewController, animated: true, completion: nil)
        }
    }
}

func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {
    viewController.dismiss(animated: true, completion: nil)
}
// Usage:
openStoreProductWithiTunesItemIdentifier(identifier: "13432")

다음과 같이 앱의 iTunes 항목 식별자를 가져올 수 있습니다 (정적 항목 대신).

스위프트 3.2

var appID: String = infoDictionary["CFBundleIdentifier"]
var url = URL(string: "http://itunes.apple.com/lookup?bundleId=\(appID)")
var data = Data(contentsOf: url!)
var lookup = try? JSONSerialization.jsonObject(with: data!, options: []) as? [AnyHashable: Any]
var appITunesItemIdentifier = lookup["results"][0]["trackId"] as? String
openStoreProductViewController(withITunesItemIdentifier: Int(appITunesItemIdentifier!) ?? 0)

스위프트 2.x :

func openStoreProductWithiTunesItemIdentifier(identifier: String) {
    let storeViewController = SKStoreProductViewController()
    storeViewController.delegate = self

    let parameters = [ SKStoreProductParameterITunesItemIdentifier : identifier]
    storeViewController.loadProductWithParameters(parameters) { [weak self] (loaded, error) -> Void in
        if loaded {
            // Parent class of self is UIViewContorller
            self?.presentViewController(storeViewController, animated: true, completion: nil)
        }
    }
}

func productViewControllerDidFinish(viewController: SKStoreProductViewController) {
    viewController.dismissViewControllerAnimated(true, completion: nil)
}
// Usage
openStoreProductWithiTunesItemIdentifier("2321354")

목표 -C :

static NSInteger const kAppITunesItemIdentifier = 324684580;
[self openStoreProductViewControllerWithITunesItemIdentifier:kAppITunesItemIdentifier];

- (void)openStoreProductViewControllerWithITunesItemIdentifier:(NSInteger)iTunesItemIdentifier {
    SKStoreProductViewController *storeViewController = [[SKStoreProductViewController alloc] init];

    storeViewController.delegate = self;

    NSNumber *identifier = [NSNumber numberWithInteger:iTunesItemIdentifier];

    NSDictionary *parameters = @{ SKStoreProductParameterITunesItemIdentifier:identifier };
    UIViewController *viewController = self.window.rootViewController;
    [storeViewController loadProductWithParameters:parameters
                                   completionBlock:^(BOOL result, NSError *error) {
                                       if (result)
                                           [viewController presentViewController:storeViewController
                                                              animated:YES
                                                            completion:nil];
                                       else NSLog(@"SKStoreProductViewController: %@", error);
                                   }];

    [storeViewController release];
}

#pragma mark - SKStoreProductViewControllerDelegate

- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {
    [viewController dismissViewControllerAnimated:YES completion:nil];
}

다음과 같이 kAppITunesItemIdentifier (app의 itunes 항목 식별자)를 얻을 수 있습니다 : (정적 항목 대신)

NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString* appID = infoDictionary[@"CFBundleIdentifier"];
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSString * appITunesItemIdentifier =  lookup[@"results"][0][@"trackId"]; 
    [self openStoreProductViewControllerWithITunesItemIdentifier:[appITunesItemIdentifier intValue]];



Xcode 9.1 및 Swift 4 :

  1. StoreKit 가져 오기 :
import StoreKit

2. 프로토콜 변환

SKStoreProductViewControllerDelegate

3. 프로토콜 구현

    func openStoreProductWithiTunesItemIdentifier(identifier: String) {
    let storeViewController = SKStoreProductViewController()
    storeViewController.delegate = self

    let parameters = [ SKStoreProductParameterITunesItemIdentifier : identifier]
    storeViewController.loadProduct(withParameters: parameters) { [weak self] (loaded, error) -> Void in
        if loaded {
            // Parent class of self is UIViewContorller
            self?.present(storeViewController, animated: true, completion: nil)
        }
    }   
}

3.1

    func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {
    viewController.dismiss(animated: true, completion: nil)
}
  1. 사용하는 방법:
openStoreProductWithiTunesItemIdentifier(identifier: "here_put_your_App_id")

노트 :

APP의 정확한 ID를 입력하는 것은 매우 중요합니다. 이 원인 오류 (오류 로그를 표시하지 않지만이 때문에 아무 문제가 없습니다)




앱 스토어 ID가 있다면 사용하는 것이 가장 좋습니다. 특히 향후에 응용 프로그램의 이름을 변경할 수 있습니다.

http://itunes.apple.com/app/id378458261

앱 스토어 ID가 없다면이 문서를 기반으로 URL을 만들 수 있습니다. https://developer.apple.com/library/ios/qa/qa1633/_index.html

+ (NSURL *)appStoreURL
{
    static NSURL *appStoreURL;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        appStoreURL = [self appStoreURLFromBundleName:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]];
    });
    return appStoreURL;
}

+ (NSURL *)appStoreURLFromBundleName:(NSString *)bundleName
{
    NSURL *appStoreURL = [NSURL URLWithString:[NSString stringWithFormat:@"itms-apps://itunes.com/app/%@", [self sanitizeAppStoreResourceSpecifier:bundleName]]];
    return appStoreURL;
}

+ (NSString *)sanitizeAppStoreResourceSpecifier:(NSString *)resourceSpecifier
{
    /*
     https://developer.apple.com/library/ios/qa/qa1633/_index.html
     To create an App Store Short Link, apply the following rules to your company or app name:

     Remove all whitespace
     Convert all characters to lower-case
     Remove all copyright (©), trademark (™) and registered mark (®) symbols
     Replace ampersands ("&") with "and"
     Remove most punctuation (See Listing 2 for the set)
     Replace accented and other "decorated" characters (ü, å, etc.) with their elemental character (u, a, etc.)
     Leave all other characters as-is.
     */
    resourceSpecifier = [resourceSpecifier stringByReplacingOccurrencesOfString:@"&" withString:@"and"];
    resourceSpecifier = [[NSString alloc] initWithData:[resourceSpecifier dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES] encoding:NSASCIIStringEncoding];
    resourceSpecifier = [resourceSpecifier stringByReplacingOccurrencesOfString:@"[!¡\"#$%'()*+,-./:;<=>¿?@\\[\\]\\^_`{|}~\\s\\t\\n]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, resourceSpecifier.length)];
    resourceSpecifier = [resourceSpecifier lowercaseString];
    return resourceSpecifier;
}

이 시험 합격

- (void)testAppStoreURLFromBundleName
{
    STAssertEqualObjects([AGApplicationHelper appStoreURLFromBundleName:@"Nuclear™"].absoluteString, @"itms-apps://itunes.com/app/nuclear", nil);
    STAssertEqualObjects([AGApplicationHelper appStoreURLFromBundleName:@"Magazine+"].absoluteString, @"itms-apps://itunes.com/app/magazine", nil);
    STAssertEqualObjects([AGApplicationHelper appStoreURLFromBundleName:@"Karl & CO"].absoluteString, @"itms-apps://itunes.com/app/karlandco", nil);
    STAssertEqualObjects([AGApplicationHelper appStoreURLFromBundleName:@"[Fluppy fuck]"].absoluteString, @"itms-apps://itunes.com/app/fluppyfuck", nil);
    STAssertEqualObjects([AGApplicationHelper appStoreURLFromBundleName:@"Pollos Hérmanos"].absoluteString, @"itms-apps://itunes.com/app/polloshermanos", nil);
    STAssertEqualObjects([AGApplicationHelper appStoreURLFromBundleName:@"Niños and niñas"].absoluteString, @"itms-apps://itunes.com/app/ninosandninas", nil);
    STAssertEqualObjects([AGApplicationHelper appStoreURLFromBundleName:@"Trond, MobizMag"].absoluteString, @"itms-apps://itunes.com/app/trondmobizmag", nil);
    STAssertEqualObjects([AGApplicationHelper appStoreURLFromBundleName:@"!__SPECIAL-PLIZES__!"].absoluteString, @"itms-apps://itunes.com/app/specialplizes", nil);
}



이것은 APP ID 만 사용하여 완벽하게 작동했습니다.

 NSString *urlString = [NSString stringWithFormat:@"http://itunes.apple.com/app/id%@",YOUR_APP_ID];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];

리디렉션 수는 0입니다.




QA1629 itms-apps: 또는 itms: 에 따르면 작동하지 않을 것이다. 너는 다음을 사용해야한다.

appStoreLink = "https://itunes.apple.com/us/app/apple-store/id375380948?mt=8"  

또는

SKStoreProductViewController 



2015 년 여름 이후로 ...

-(IBAction)clickedUpdate
{
    NSString *simple = @"itms-apps://itunes.apple.com/app/id1234567890";
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:simple]];
}

'id1234567890'을 'id'및 'your ten digit number'로 바꿉니다.

  1. 이것은 모든 장치에서 완벽하게 작동 합니다 .

  2. 리디렉션없이 앱 스토어로 곧바로 이동합니다.

  3. 모든 국내 상점에서 OK입니다.

  4. loadProductWithParameters 를 사용하는 loadProductWithParameters 옮겨야 한다는 것은 사실 이지만 링크의 목적이 실제로 내부에있는 앱을 업데이트하는 것이라면이 "구식"접근 방식을 사용하는 것이 좋습니다.







이것은 ios5에서 작동하고 직접 연결됩니다.

NSString *iTunesLink = @"http://itunes.apple.com/app/baseball-stats-tracker-touch/id490256272?mt=8";  
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]];



개발자의 앱에 연결하고 개발자 이름에 구두점 또는 공백이 있으면 (예 : Development Company, LLC) 다음과 같이 URL을 구성합니다.

itms-apps://itunes.com/apps/DevelopmentCompanyLLC

그렇지 않으면 iOS 4.3.3에서 '요청을 처리 할 수 ​​없습니다.'를 반환합니다.



Related