2017-02-07 8 views
13

я пишу SDK для прошивки и я хочу, чтобы проверить, если StoreKit.framework связан с приложением, которое использует свой SDK, так что я бег:Как проверить, использует ли приложение iOS 'StoreKit.framework'?

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

enter image description here

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

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


Редактировать 1

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

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

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

Edit 2

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

от IOS App идентификаторов:

enter image description here

Однако из Xcode:

enter image description here

Может быть, это причина, почему даже пустое приложение имеет встроенный StoreKit?

+0

Как насчет 'NSClassFromString (@ "SKStoreProductViewController")'? – matt

+0

Вот проблема, я думаю. Импорт отличается от загрузки. _You_ импортировал StoreKit. Таким образом, если не пытаться _use_ StoreKit и сбой, у вас нет возможности узнать, действительно ли StoreKit тоже загружен. – matt

+0

@matt 'NSClassFromString (@" SKStoreProductViewController ")' возвращает true – snaggs

ответ

0

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

+0

Мой вопрос: Как я могу определить, связано ли приложение Host с 'StoreKit.framework' на – snaggs

+0

. Для этого доступна слабая ссылка требуемой структуры в вашем SDK и использование NSStringFromClass (@" SKStoreProductViewController "). https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html –

0
//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; 
} 

Objective C: ---

- (BOOL)isStoreKitAvailable { 

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

Найти больше ссылок от here

0

В 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); 

Я надеюсь, что это может помочь вам.

2

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

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

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

- (BOOL)checkStoreKitAvailibility { 

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

 Смежные вопросы

  • Нет связанных вопросов^_^