Fix problem loading certs for tests of library projects

In library projects (cf. app projects) the main bundle is nil. `NSBundle+bundleForClass:` works in both types of projects.

Also makes the library load the certificates only once.
pull/1839/head
Jorge Canizales 10 years ago
parent 2c31a56d4a
commit f1c368c068
  1. 16
      src/objective-c/GRPCClient/private/GRPCSecureChannel.m

@ -38,13 +38,17 @@
@implementation GRPCSecureChannel @implementation GRPCSecureChannel
- (instancetype)initWithHost:(NSString *)host { - (instancetype)initWithHost:(NSString *)host {
// TODO(jcanizales): Load certs only once. static const grpc_credentials *kCredentials;
NSURL *certsURL = [[NSBundle mainBundle] URLForResource:@"gRPC.bundle/roots" withExtension:@"pem"]; static dispatch_once_t loading;
NSData *certsData = [NSData dataWithContentsOfURL:certsURL]; dispatch_once(&loading, ^{
// Do not use NSBundle.mainBundle, as it's nil for tests of library projects.
NSBundle *bundle = [NSBundle bundleForClass:self.class];
NSString *certsPath = [bundle pathForResource:@"gRPC.bundle/roots" ofType:@"pem"];
NSData *certsData = [NSData dataWithContentsOfFile:certsPath];
NSString *certsString = [[NSString alloc] initWithData:certsData encoding:NSUTF8StringEncoding]; NSString *certsString = [[NSString alloc] initWithData:certsData encoding:NSUTF8StringEncoding];
kCredentials = grpc_ssl_credentials_create(certsString.UTF8String, NULL);
grpc_credentials *credentials = grpc_ssl_credentials_create(certsString.UTF8String, NULL); });
return (self = [super initWithChannel:grpc_secure_channel_create(credentials, return (self = [super initWithChannel:grpc_secure_channel_create(kCredentials,
host.UTF8String, host.UTF8String,
NULL)]); NULL)]);
} }

Loading…
Cancel
Save