¿Cómo comprobar si la aplicación iOS utiliza 'StoreKit.framework'?

Escribo SDK para iOS y quiero validar si StoreKit.framework está vinculado a una aplicación que usa mi SDK, así que ejecuto:

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

introduzca la descripción de la imagen aquí

Sin embargo, incluso si StoreKit.framework no está vinculado [SKStoreProductViewController class still returns true .

¿Cómo resolver este problema?


Edit 1

como señaló @ x4h1d, creé un nuevo proyecto vacío y lo agregué al controller pnetworkingeterminado:

 BOOL isStoreKitAvailable = (NSClassFromString(@"SKStoreProductViewController") != nil); // => YES (there is no linked frameworks at all, why I get YES?) 

Editar 2

Mi perfil de aprovisionamiento tiene habilitada la In-App Purchase (no un proyecto en sí)

desde las ID de la aplicación de iOS:

introduzca la descripción de la imagen aquí

Sin embargo desde Xcode:

introduzca la descripción de la imagen aquí

Tal vez esta es una razón por la cual incluso la aplicación vacía tiene build-in StoreKit?

Puede verificar la disponibilidad del kit de almacenamiento utilizando el siguiente código.

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

Editar: para Objective-C puede usar:

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

En Linked Frameworks and Libraries hacerlo Optional lugar de Requinetworking . Entonces, si los desarrolladores de la aplicación quieren que se implementen, marcará el marco como Requinetworking en la aplicación. Ahora si usa la [SKStoreProductViewController class] . puede bloquearse utilizando NSStringFromClass(@"SKStoreProductViewController") para determinar si es seguro usarlo.

En Xcode,

cuando habilitamos la In-App purchase en la In-App purchase bajo Capabilities , Xcode vincula automáticamente StoreKit.framework y Add the In-App purchase feature to our App ID . De manera similar, si nuestra ID de la aplicación ya tiene habilitada la compra dentro de la aplicación, sucede lo mismo.

Entonces, simplemente,

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

Espero que esto te pueda ayudar.

 //SWIFT class func allFrameworks() -> [AnyObject] //OBJECTIVE-C + (NSArray *)allFrameworks 

De NSBundle

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

Valor de retorno

Una matriz de todos los packages de la aplicación que representan frameworks. Solo se incluyen frameworks con una o más classs de Objective-C en ellos.

Declaración de import

 import Foundation 

Disponibilidad

 Available in iOS 2.0 and later. 

Cómo utilizar

(NSBundle.allFrameworks() -> Return Array de All framework use en proyecto.

Puede verificar Usar for bucle contener storeKit.framework o Not as Below.

Swift: —

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

C objective :—

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

Encuentre más references aquí