Как определить активный магазин iTunes на iPhone/iPod Touch/iPad?

Я хотел бы иметь возможность определить, к какому хранилищу подключается пользователь из моего приложения, чтобы я мог направить их к соответствующему контенту для своего устройства и магазина. Кто-нибудь знает, как получить эту информацию?

По сути, если пользователь находится в Великобритании и подключается к британскому магазину, я хочу, чтобы моя функция/метод возвращала ГБ, если в Корее я хочу, чтобы KR, Австралия = AU и т. д. Буду признателен за любую помощь.


person pms1969    schedule 29.03.2010    source источник


Ответы (7)


Подход с получением кода страны локали пользователя будет работать ... но только если магазин iTunes пользователя совпадает с его локалью. Так будет не всегда.

Если вы создаете элемент покупки в приложении, вы можете использовать API-интерфейсы Apple StoreKit, чтобы узнать фактическую страну пользователя iTunes, даже если она отличается от языкового стандарта их устройства. Вот код, который работал у меня:

- (void) requestProductData
{
    SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers:
                                 [NSSet setWithObject: PRODUCT_ID]];
    request.delegate = self;
    [request start];
}

- (void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    NSArray *myProducts = response.products;
    for (SKProduct* product in myProducts) {
        NSLocale* storeLocale = product.priceLocale;
        storeCountry = (NSString*)CFLocaleGetValue((CFLocaleRef)storeLocale, kCFLocaleCountryCode);
        NSLog(@"Store Country = %@", storeCountry);
    }

    [request release];

    // If product request didn't work, fallback to user's device locale
    if (storeCountry == nil) {
        CFLocaleRef userLocaleRef = CFLocaleCopyCurrent();
        storeCountry = (NSString*)CFLocaleGetValue(userLocaleRef, kCFLocaleCountryCode);
    }

    // Now we're ready to start creating URLs for the itunes store
    [super start];
}
person arteku    schedule 08.03.2012
comment
Немного поздно для меня на вечеринку, и у меня не будет возможности использовать это сейчас. Если кто-то еще подтвердит, что это действительно работает, и вы можете получить несколько голосов, я повторно отмечу это как ответ. Это было давно, но я уверен, что StoreKit API тогда еще не было. - person pms1969; 04.04.2012
comment
Это работает. Я не использую тот же код, но идея чтения кода валюты iTunes Store из product.priceLocale определенно работает. - person cheesus; 31.01.2013
comment
подождите.. это работает только в том случае, если у вас есть встроенные покупки, верно? что, если вы этого не сделаете? есть ли другой способ? - person abbood; 10.06.2015
comment
@abbood Разве вы не можете создать IAP и использовать его только для этой цели и никогда не показывать его пользователю? - person Claes; 30.10.2015
comment
Наш опыт показывает, что Apple не одобрит приложение, которое использует этот метод для определения территории/региона, но не показывает пользователю покупку в приложении. Если вы показываете пользователю покупки в приложении и также хотите определить территорию/регион, то это допустимый метод. Рецензенты Apple предложили в качестве альтернативы, если вы пытаетесь ограничить некоторые аспекты своего приложения в зависимости от региона, использовать вместо этого геолокацию. Но вам нужно будет получить одобрение Apple, чтобы использовать это, поскольку это также нарушает руководство по обзору использования данных о местоположении. - person Bennett Smith; 15.12.2015
comment
Спас мои ягодицы. Спасибо. - person jestro; 06.07.2016

Начиная с iOS 13.0, Apple представила API SKStorefront.

Это позволяет вам проверить текущую страну AppStore, к которой подключен пользователь.

SKStorefront: объект, содержащий местоположение и уникальный идентификатор витрины Apple App Store.

Обзор

Внутренние продукты, которые вы создаете через App Store Connect, доступны для продажи во всех регионах, где есть App Store. Вы можете использовать информацию с витрины магазина, чтобы определить регион клиента и предлагать продукты в приложении, подходящие для этого региона. Вы должны вести свой собственный список идентификаторов продуктов и витрин, на которых вы хотите сделать их доступными.

Темы

  • countryCode: трехбуквенный код, представляющий страну, связанную с витриной App Store.
  • идентификатор: значение, определенное Apple, которое однозначно идентифицирует витрину магазина App Store.

https://developer.apple.com/documentation/storekit/skstorefront

person jeko    schedule 29.09.2019
comment
Будьте осторожны, потому что они также говорят, что информация с витрины магазина не может использоваться для разработки или улучшения профиля пользователя или отслеживания клиентов в рекламных или маркетинговых целях. - person Andrew Kirna; 03.12.2019
comment
как вы можете получить его? - person Reimond Hill; 08.06.2020

Пока можно использовать 2 метода со своими плюсами и минусами:

Витрина магазина

-> SDK> = 13

-> трехбуквенный код, представляющий страну, связанную с витриной App Store.

if let storeFront = SKPaymentQueue.default().storefront{
    print("StoreFront CountryCode = ", storeFront.countryCode)
}
else {
    print("StoreFront NOT Available")
}

OR

SKCloudServiceController

-> Доступно с iOS 9.3.

-> Требуется разрешение. В tvOS это может стать грязным, так как я не могу найти способ изменить разрешения в настройках...

-> Текст разрешения довольно запутанный.

let skCloudServiceController = SKCloudServiceController()
SKCloudServiceController.requestAuthorization { (status) in
    guard status == .authorized else {
        return
    }

    skCloudServiceController.requestStorefrontCountryCode(completionHandler: { (countryCode, error)  in
        if let error = error {
            print("Failure: ", error)
        }
            else if let countryCode = countryCode {
            print("Country code: ", countryCode)
        }
    })
}

Не забудьте включить это в свой файл .plist:

<key>NSAppleMusicUsageDescription</key>
<string>Store information</string>
person Reimond Hill    schedule 08.06.2020

Сложный способ получить эту функцию — настроить одно приложение для каждой страны магазина приложений. Каждое приложение содержит информацию о магазине в своей стране. Это предполагает, что пользователь придерживается одного магазина, что должно быть верно для большинства людей.

person alex    schedule 29.03.2010
comment
Не совсем то решение, которое я ищу, хотя в случае необходимости я это сделаю. Я уверен, что есть более простой способ, я просто не знаю, что это такое. - person pms1969; 30.03.2010

Я предлагаю вам попробовать iTunes глубокие ссылки. Например, http://itunes.com/apps/appname должен привести пользователя к локальному приложению. Магазин, где она тратит деньги.

person Costique    schedule 12.04.2010
comment
хорошо, но как мне определить, что это за магазин. Так, например, я мог бы отобразить что-то вроде Your App Store is... - person pms1969; 12.04.2010
comment
@Costique, первая ссылка в вашем ответе не работает. - person kelin; 06.11.2017

Мне нужен такой же функционал. На данный момент я рассматриваю возможность чтения с использованием данных из NSLocale по умолчанию, но добавляю параметр в settings.app, чтобы пользователь мог настроить его, если он не совпадает.

Эта функция взята из ответ на еще один мой вопрос.

- (NSString *)getUserCountry
{
    NSLocale *locale = [NSLocale currentLocale];
    return [locale objectForKey: NSLocaleCountryCode];
}
person prendio2    schedule 14.04.2010
comment
Про настройку тоже подумал. Но мне не особенно нравится эта идея, например, у вас есть много людей, говорящих по-испански в штатах, чье местонахождение может полностью отличаться от магазина, который они используют. Я думаю, что я близок к ответу самого себя, и я опубликую, если это сработает. - person pms1969; 15.04.2010
comment
Я подумал, что этот ответ на один из моих вопросов может представлять интерес: stackoverflow.com/questions/2639684/ не будет ли метод ThierryB getUserCountry возвращать США для пользователей в США независимо от того, какой язык был установлен? - person prendio2; 20.04.2010
comment
Спасибо, я пробовал это раньше, но это не сработало так, как я ожидал, или вернуло неверный результат. Сказав это, я на самом деле не могу вспомнить, чтобы делал это на телефоне (сделал в симуляторе), поэтому я поиграю, когда разберусь со своим чертовым профилем подготовки и снова смогу отлаживать телефон. - person pms1969; 21.04.2010
comment
ОК, похоже, сработало (getUserCountry), так что ставлю лайк. Проблема с этим, конечно, заключается в том, что кто-то (скажем, британец) живет эмигрантской жизнью где-то вроде Австралии и имеет код страны, установленный на GB, даже если их магазин находится в Австралии. Но если я не смогу придумать лучший метод, придется сделать это в сочетании с возможностью смены магазина. - person pms1969; 21.04.2010
comment
Извините, что проголосовал за этот ответ, но это неверно. [NSLocale currentLocale] не дает вам языковой стандарт iTunes Store, он дает вам языковой стандарт устройства, а это не одно и то же. На самом деле, я использовал [NSLocale currentLocale] и из-за этого сталкивался с ошибками, пока не исправил их, прочитав правильную локаль магазина из свойства priceLocale SKProduct. Я живу в Австралии, но все еще использую свою учетную запись iTunes в США, поэтому для меня эти два региона тоже разные. - person Erik van der Neut; 04.06.2015

Вероятно, вам следует использовать

[[userDefaults dictionaryRepresentation] objectForKey:@"NSLocaleCode"];

Это вернет код языка, например en_US, en_UK, en_AU или даже zh_CN, zh_MY, jp_JP и так далее.

Разберите правильные коды, которые вы поддерживаете, и направьте их соответствующим образом.

person Mugunth    schedule 05.04.2010
comment
Спасибо Мугунт, но локаль и магазин не обязательно совпадают. Мне нужен элегантный способ определить магазин, в который направляется пользователь. т.е. на какой магазин они тратят свои деньги. Не предполагайте, что для NSAppStore есть пользовательские настройки по умолчанию? - person pms1969; 06.04.2010
comment
Проголосовали против, потому что это не дает языковой стандарт iTunes Store пользователя. - person Erik van der Neut; 04.06.2015