Подтвердить что ты не робот

Как проверить, использует ли приложение iOS "StoreKit.framework"?

Я пишу SDK для iOS, и я хочу проверить, привязан ли StoreKit.framework к приложению, использующему мой SDK, поэтому я запускаю:

if ([SKStoreProductViewController class]) {
        SKStoreProductViewController *storeController =
                        [[ SKStoreProductViewController alloc ] init ];
        // ...
    }

введите описание изображения здесь

Однако даже если StoreKit.framework не связан [SKStoreProductViewController class, все еще возвращает true.

Как решить эту проблему?


Изменить 1

as @x4h1d указал, что я создал новый пустой проект и добавил к контроллеру по умолчанию:

BOOL isStoreKitAvailable = 
   (NSClassFromString(@"SKStoreProductViewController") != nil);

// => YES (there is no linked frameworks at all, why I get YES?)

Изменить 2

Мой профиль Provisioning имеет In-App Purchase включен (не сам проект)

из идентификаторов приложений iOS:

введите описание изображения здесь

Однако из Xcode:

введите описание изображения здесь

Возможно, это причина, по которой даже пустое приложение имеет встроенный StoreKit?

4b9b3361

Ответ 1

Вы можете проверить доступность storekit, используя следующий код.

func checkStoreKitAvailibility() -> Bool {
    for bundle in Bundle.allFrameworks {
        if ((bundle.classNamed("SKStoreProductViewController")) != nil) {
            return true;
        }
    }
    return false;
}

Изменить: Для Objective-C вы можете использовать:

- (BOOL)checkStoreKitAvailibility {

    for (NSBundle *bundle in NSBundle.allFrameworks) {
        if ([bundle classNamed:@"SKStoreProductViewController"]) {
            return YES;
        }
    }
    return NO;
}

Ответ 2

В связанных структурах и библиотеках вместо Required введите Optional. Итак, если разработчики приложений захотят его реализовать, он помечает инфраструктуру как Required в приложении. Теперь, если вы используете [SKStoreProductViewController class]. он может сбой использовать NSStringFromClass(@"SKStoreProductViewController"), чтобы определить, безопасно ли его использовать.

Ответ 3

//SWIFT 
class func allFrameworks() -> [AnyObject]

//OBJECTIVE-C
+ (NSArray *)allFrameworks

Из NSBundle

+allFrameworks
Returns an array of all of the application’s bundles that represent frameworks.

Возвращаемое значение

Массив всех пакетов приложений, которые представляют фреймворки. Включены только рамки с одним или несколькими классами Objective-C.

Операция импорта

import Foundation

Доступность

Available in iOS 2.0 and later.

Как использовать

(NSBundle.allFrameworks() → Возвращаемый массив всех применений в проекте.

Вы можете проверить использование for апплет цикла, содержащий storeKit.framework или не как ниже.

Swift: ---

func isStoreKitAvailable() -> Bool {
    for frameWorkName in Bundle.allFrameworks {
        if ((frameWorkName.classNamed("SKStoreProductViewController")) != nil) {
            return true;
        }
    }
    return false;
}

Цель C: ---

- (BOOL)isStoreKitAvailable {

    for (NSBundle *frameWorkName in NSBundle.allFrameworks) {
        if ([frameWorkName classNamed:@"SKStoreProductViewController"]) {
            return YES;
        }
    }
    return NO;
}

Найти дополнительную ссылку от здесь

Ответ 4

В Xcode

когда мы включаем In-App purchase под Capabilities, Xcode автоматически связывает StoreKit.framework и Add the In-App purchase feature to our App ID. Аналогично, если наш идентификатор приложения уже имеет возможность покупки In-App, то это происходит.

Итак, просто:

BOOL isStoreKitAvailable = (NSClassFromString(@"SKStoreProductViewController") != nil);

Надеюсь, это поможет вам.