La biblioteca de Khipu Inside se llama khenshin y se distribuye como un Cocoapod.
En este repositorio se encuentra una App de demostración en la carpeta app/ios/objc . Para ejecutarla se debe abrir con XCode.
Los pasos necesarios para utilizar la biblioteca nativa iOS para B2app son:
- Agregar cocoapod khenshin
- Flags de compilación
- Inicialización de la biblioteca
- Invocar Khipu desde tu app
La biblioteca khenshin se distribuye como un Cocoapod Universal, es decir, que incluye versiones en las cuatro arquitecturas soportadas por iOS, tanto para simuladores como para dispositivos físicos.
El tamaño de la biblioteca se detalla según la siguiente tabla dependiendo de la arquitectura en que se utilice.
Arquitectura | Tamaño |
---|---|
Arm64 | 12MB |
Armv7 | 11MB |
i386 | 11MB |
x86_64 | 11MB |
khenshin utiliza, además, otras bibliotecas como dependencia, el tamaño final que agregará a tu aplicación depende del grado de duplicidad de esas bibliotecas. A modo de ejemplo. Una applicación vacía, que sólo utiliza khenshin y en una arquitectura determinada es de 32MB, es decir, el tamaño que khenshin agregará a tu aplicación varía entre 11 y 32MB dependiendo del grado de intersección de las bibliotecas utilizadas.
Las bibliotecas que khenshin utiliza como dependencia son las siguientes:
PODS:
- ActionSheetPicker-3.0 (2.3.0)
- AFNetworkActivityLogger (3.0.0):
- AFNetworking/NSURLSession (~> 3.0)
- AFNetworking (3.1.0):
- AFNetworking/NSURLSession (= 3.1.0)
- AFNetworking/Reachability (= 3.1.0)
- AFNetworking/Security (= 3.1.0)
- AFNetworking/Serialization (= 3.1.0)
- AFNetworking/UIKit (= 3.1.0)
- AFNetworking-Synchronous/3.x (1.1.0):
- AFNetworking (~> 3.0)
- AFNetworking/NSURLSession (3.1.0):
- AFNetworking/Reachability
- AFNetworking/Security
- AFNetworking/Serialization
- AFNetworking/Reachability (3.1.0)
- AFNetworking/Security (3.1.0)
- AFNetworking/Serialization (3.1.0)
- AFNetworking/UIKit (3.1.0):
- AFNetworking/NSURLSession
- BEMCheckBox (1.4.1)
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
- IQKeyboardManager (5.0.3)
- JSONModel (1.7.0)
- khenshin (1.548):
- ActionSheetPicker-3.0 (= 2.3.0)
- AFNetworkActivityLogger (= 3.0.0)
- AFNetworking (= 3.1.0)
- AFNetworking-Synchronous/3.x (= 1.1.0)
- BEMCheckBox (= 1.4.1)
- FMDB (= 2.7.5)
- IQKeyboardManager (= 5.0.3)
- JSONModel (= 1.7.0)
- PPTopMostController (= 0.0.1)
- RaptureXML (= 1.0.1)
- TTTAttributedLabel (= 2.0.0)
- PPTopMostController (0.0.1)
- RaptureXML (1.0.1)
- Toast (3.1.0)
- TTTAttributedLabel (2.0.0)
Es importante mencionar que el tamaño al que nos referimos en este documento corresponde al tamaño de la aplicación instalada, lo que el usuario debe descargar de Apple Store es siempre menor y depende de optimizaciones que haga Apple con la aplicación.
Para instalar khenshin en tu proyecto es necesario utilizar cocoapods, para eso se debe crear o modificar un archivo Podfile para que contenga la referencia al pod de khenshin.
target 'Khipu Inside Demo' do
# Uncomment this line if you're using Swift or would like to use dynamic frameworks
use_frameworks!
# Pods for Khipu Inside Demo
pod 'khenshin' #Fija la versión antes de pasar a producción
end
Luego, para instalar el Pod se debe ejecutar pod install que descargará el pod de khenshin, todas sus dependencias y modificará el proyecto Xcode para incluirlas.
> pod install
Analyzing dependencies
Downloading dependencies
Using AFNetworkActivityLogger (3.0.0)
Using AFNetworking (3.1.0)
Using AFNetworking-Synchronous (1.1.0)
Using ActionSheetPicker-3.0 (2.3.0)
Using BEMCheckBox (1.4.1)
Using FMDB (2.7.5)
Using IQKeyboardManager (5.0.3)
Using JSONModel (1.7.0)
Using PPTopMostController (0.0.1)
Using RaptureXML (1.0.1)
Using TTTAttributedLabel (2.0.0)
Using Toast (3.1.0)
Using khenshin (1.599)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 11 total pods installed.
Si tu proyecto era del tipo .xcodeproj, ahora tendrás un proyecto del tipo .xcworkspace, de ahora en adelante debes abrir éste con Xcode.
Valida que tu proyecto tenga configurada la banderas -ObjC y -l"xml2"
Project -> Build Settings -> Other Linker Flags -> -Objc -l"xml2"
En el archivo AppDelegate.m debes inicializar khenshin en el selector didFinishLaunchingWithOptions
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[KhenshinInterface initWithBuilderBlock:^(KhenshinBuilder *builder) {
builder.APIUrl = @"https://khipu.com/app/enc/";
}];
return YES;
}
En la sección anterior se utilizó la construcción minimal de khenshin, a continuación veremos todos los parámetros opcionales.
[KhenshinInterface initWithBuilderBlock:^(KhenshinBuilder *builder) {
# Obligatorios
builder.APIUrl = @"https://khipu.com/app/enc/";
# Los siguientes parámetros son opcionales
# Permitir guardar credenciales bancarias en el dispositivo, pre-determinado no
builder.allowCredentialsSaving = YES;
# Estilo del botón continuar, puede ser:
# - KHMainButtonDefault: Botón en la barra de herramientas, pre-determinado
# - KHMainButtonFatOnForm: Botón en los formularios con fondo sólido
# - KHMainButtonSkinnyOnForm: Botón en los formularios sin fondo
builder.mainButtonStyle = KHMainButtonFatOnForm;
# Esconder la barra de navegación estilo browser, pre-determinado: no
builder.hideWebAddressInformationInForm = YES;
# Usar el logo de la app en la barra centrar del toolbar, pre-determinado: no
builder.useBarCenteredLogoInForm = YES;
# Logo para usar en la barra (UIImage), pre-determinado: nil
builder.barCenteredLogo = [[UIImage alloc] init];
# Logo para usar en la izquierda de la barra (UIImage), pre-determinado: nil
builder.barLeftSideLogo = [[UIImage alloc] init];
# Color principal de la app, barra principal y botones principales (UIColor)
builder.principalColor = [UIColor blueColor];
# Color principal oscuro, para barra de status (UIColor)
builder.darkerPrincipalColor = [UIColor blackColor];
# Color secundario (UIColor)
builder.secondaryColor = [UIColor redColor];
# Color de fondo de los formularios (UIColor)
builder.backgroundColor = [UIColor whiteColor];
# Tinte para la barra principal
builder.barTintColor = [UIColor whiteColor];
# Color para el indicador de progreso
builder.progressColor = [UIColor redColor];
# Tamaño del font de la barra de navegación
builder.navigationFontSize = 10.0;
# Color del texto de la barra de navegación
builder.navigationBarTextTint = [UIColor whiteColor];
# Color del texto en formularios
builder.textColorHex = @"#000000";
# Color de los controles en formularios
builder.normalControlColorHex = @"#333333";
# Font normal a usar
builder.font = [UIFont fontWithName:@"My-Font-Regular" size:16.0];
# Font bold a usar
builder.fontBold = [UIFont fontWithName:@"My-Font-Bold" size:16.0];
# Font light a usar
builder.fontLight = [UIFont fontWithName:@"My-Font-Light" size:16.0];
# No desplegar las páginas de salida, en vez, retornar directamente a la aplicación host.
builder.skipExitPage = YES;
# Mantener cookies entre una ejecución y otra
builder.keepCookies = YES;
# Imagen para poner en el fondo de los formularios
builder.backgroundImage = [[UIImage alloc] init];
# Imagen para usar como spinner de progreso
builder.spinnerImage = [[UIImage alloc] init];
# Separador de decimales
builder.decimalSeparator = @",";
# Separador de miles
builder.groupingSeparator = @".";
# Vista que se usa en el encabezado de los formularios khenshin, debe ser del tipo UIView<ProcessHeader>
PaymentProcessHeader *processHeader = [[[NSBundle mainBundle] loadNibNamed:@"PaymentProcessHeader" owner:self options:nil] objectAtIndex:0];
builder.processHeader = processHeader;
# Vista que se usar al terminar un pago exitoso, debe ser del tipo UIViewController<ProcessExit>
PaymentProcessSuccess *processSuccess = [[[NSBundle mainBundle] loadNibNamed:@"PaymentProcessSuccess" owner:self options:nil] objectAtIndex:0];
builder.processSuccess = processSuccess;
# Vista que se usar al terminar un pago con error, debe ser del tipo UIViewController<ProcessExit>
PaymentProcessFailure *processFailure = [[[NSBundle mainBundle] loadNibNamed:@"PaymentProcessFailure" owner:self options:nil] objectAtIndex:0];
builder.processFailure = processFailure;
# Vista que se usar al terminar un pago con dudas sobre el resultado, debe ser del tipo UIViewController<ProcessExit>
PaymentProcessWarning *processWarning = [[[NSBundle mainBundle] loadNibNamed:@"PaymentProcessWarning" owner:self options:nil] objectAtIndex:0];
builder.processWarning = processWarning;
}];
}
Para invocar Khipu se utiliza el método startEngineWithPaymentExternalId de la clase KhenshinInterface, para esto es necesario contar con el ID de pago generado en pasos anteriores.
[KhenshinInterface startEngineWithPaymentExternalId:<ID de pago>
userIdentifier:@""
isExternalPayment:YES
success:^(NSURL *returnURL){
NSLog(@"SUCCESS");
}
failure:^(NSURL *returnURL){
NSLog(@"FAILURE");
}
animated:NO];
Recordar que siempre se debe esperar la notificación por API de khipu para considerar que un pago aprobado. Como se explican en la documentación del proceso de pago.