Расширение каталога вызовов Callkit не работает с React Native ⇐ IOS
-
Гость
Расширение каталога вызовов Callkit не работает с React Native
Я хочу реализовать расширение каталога вызовов Callkit в своем приложении React Native, а также создал мост. Я использовал objective-c для обработки CallDirectoryHandler. Я создал расширение, следуя этому руководству, однако мне все еще не удается добавлять и идентифицировать числа. Я перепробовал почти все возможные решения, но ни одно из них мне не помогло. Ниже приведены коды, которые я использую: CalkitBridge.m
#import "CalkitBridge.h" #define DATA_KEY @"CALLER_LIST" #define DATA_GROUP @"group.org.reactn.futurecodes.CallDirectory" #define EXTENSION_ID @"org.reactn.futurecodes.CallDirectory" @реализация CallkitBridge RCT_EXPORT_MODULE() -(NSError*) buildErrorFromException: (NSException*) исключение withErrorCode: (NSInteger)errorCode { NSMutableDictionary* информация = [NSMutableDictionary словарь]; [info setValue:Exception.name forKey:@"Name"]; [info setValue:Exception.reason forKey:@"Reason"]; [информация setValue:Exception.callStackReturnAddresses forKey:@"CallStack"]; [info setValue:Exception.callStackSymbols forKey:@"CallStackSymbols"]; [info setValue:Exception.userInfo forKey:@"UserInfo"]; NSError *error = [[NSError alloc] initWithDomain:EXTENSION_ID code: errorCode userInfo:info]; ошибка возврата; } - (NSArray*)getCallerList { @пытаться { NSUserDefaults* userDefaults = [[NSUserDefaults alloc] initWithSuiteName:DATA_GROUP]; NSArray* callerList = [userDefaults arrayForKey:DATA_KEY]; если (список вызывающих) { вернуть список вызывающих; } return [[NSArray alloc] init]; } @catch(NSException* e) { NSLog(@"CallerId: Не удалось получитьCallerList: %@", e.description); } } RCT_EXPORT_METHOD(getCallerList: (RCTPromiseResolveBlock) разрешить отказ: (RCTPromiseRejectBlock) отклонить) { @пытаться { NSArray* callerList = [NSArray arrayWithArray:[self getCallerList]]; разрешить (список вызывающих); } @catch (NSException* e) { Ошибка NSError* = [self buildErrorFromException:e withErrorCode: 100]; ignore(@"getCallerList", @"Не удалось получить мост getCallerList:", error); } } RCT_EXPORT_METHOD(setCallerList: (NSArray*) callerList withResolver: (RCTPromiseResolveBlock) разрешить отказ: (RCTPromiseRejectBlock) reject) { @пытаться { NSLog(@"Список вызывающих абонентов -> %@",callerList); NSUserDefaults* userDefaults = [[NSUserDefaults alloc] initWithSuiteName:DATA_GROUP]; [userDefaults setObject:callerList forKey:DATA_KEY]; [синхронизация пользовательских настроек]; [CXCallDirectoryManager.sharedInstance reloadExtensionWithIdentifier: EXTENSION_ID завершениеHandler: ^ (NSError * _Nullable error) { если (ошибка) { NSLog(@"ошибка при перезагрузке"); ignore(@"setCallerList", @"Не удалось перезагрузить расширение", error); } еще { NSLog(@"расширение перезагрузки...."); решить (@true); } }]; } @catch (NSException* e) { Ошибка NSError* = [self buildErrorFromException:e withErrorCode: 100]; ignore(@"setCallerList", @"Не удалось установить список вызывающих абонентов", error); } } RCT_EXPORT_METHOD(getExtensionEnabledStatus: (RCTPromiseResolveBlock) разрешить отказ: (RCTPromiseRejectBlock) отклонить) { // CompleteHandler вызывается дважды. Это обходной путь __block BOOL hasResult = false; __block int RealResult = 0; [CXCallDirectoryManager.sharedInstance getEnabledStatusForExtensionWithIdentifier: EXTENSION_ID завершениеHandler: ^ (CXCallDirectoryEnabledStatus EnabledStatus, NSError * _Nullable error) { // TODO: Удалите эти условия, когда найдете способ вернуть правильный результат или Apple просто исправит свою ошибку. если (hasResult == false) { имеетРезультат = Истина; RealResult = (INT) EnabledStatus; } если (ошибка) { ignore(@"getExtensionEnabledStatus", @"Не удалось получить статус расширения", error); } еще { разрешить ([NSNumber NumberWithInt: RealResult]); } }]; } - (NSDictionary *)constantsToExport { return @{ @"НЕИЗВЕСТНО": @0, @"ОТКЛЮЧЕНО": @1, @"ВКЛЮЧЕНО": @2}; } @конец CallDirectoryHandler.m
#import "CallDirectoryHandler.h" #define DATA_KEY @"CALLER_LIST" #define APP_GROUP @"group.org.reactn.futurecodes.CallDirectory" @interface Caller: NSObject @property NSString* имя; @property NSArray* числа; -(тип экземпляра) initWithDictionary: (NSDictionary*) словарь; @конец @implementation Звонящий -(тип экземпляра) initWithDictionary: (NSDictionary*) словарь { если (сам = [супер инициализация]) { self.name = словарь[@"имя"]; self.numbers = словарь[@"numbers"]; } вернуть себя; } @конец @interface CallDirectoryHandler () @конец @implementation CallDirectoryHandler - (void)beginRequestWithExtensionContext:(CXCallDirectoryExtensionContext *)context { context.delegate = сам; если (context.isIncremental) { [контекст удалитьAllIdentificationEntries]; } NSLog(@"перезагрузка и добавление номеров..."); [self addAllIdentificationPhoneNumbersToContext:контекст]; [контекст CompleteRequestWithCompletionHandler: ноль]; } - (NSArray*)getCallerList { @пытаться { NSUserDefaults* userDefaults = [[NSUserDefaults alloc] initWithSuiteName:APP_GROUP]; NSArray* callerList = [userDefaults arrayForKey:DATA_KEY]; если (список вызывающих) { NSLog(@"%@",callerList); вернуть список вызывающих; } return [[NSArray alloc] init]; } @catch(NSException* e) { NSLog(@"Не удалось получить список звонивших: %@", e.description); } } - (void)addAllIdentificationPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context { @пытаться { NSArray* callerList = [self getCallerList]; NSLog(@"Список каталогов вызовов %@",callerList); NSMutableDictionary* labelsKeyedByPhoneNumber = [[NSMutableDictionary alloc] init]; NSUInteger callersCount = [количество списка вызывающих]; если (callersCount > 0) { for (NSUInteger я = 0; я { (асинхронный () => { пытаться { const status = ждут CallkitBridge.getExtensionEnabledStatus(); если (статус === 2) { пытаться { ждут CallkitBridge.setCallerList(абоненты); } поймать (ошибка) { console.log('Ошибка добавления => ', error); } } } поймать (ошибка) { console.log('Ошибка -> ', ошибка); } })(); }, []); возвращаться ( Привет, мир ); } экспортировать приложение по умолчанию; P.S. Я проверил группу приложений, она верна, +92 — это код моей страны, то есть Пакистан, однако я не вижу идентификатор вызывающего абонента. Я проверил и включил расширение и вижу статус расширения === 2, который включен. Обратите внимание: хотя я испробовал все решения, мне не удалось отладить расширение каталога вызовов в XCode. Любая помощь приветствуется, спасибо.
Я попробовал изменить массив вызывающих абонентов из имени и массива чисел внутри объекта, а также немного изменить собственные коды. Ожидание: Я хочу, чтобы идентификатор вызывающего абонента показывался всякий раз, когда кто-то звонит мне с этого номера, я предоставляю ответ из своего приложения React Native.
Я хочу реализовать расширение каталога вызовов Callkit в своем приложении React Native, а также создал мост. Я использовал objective-c для обработки CallDirectoryHandler. Я создал расширение, следуя этому руководству, однако мне все еще не удается добавлять и идентифицировать числа. Я перепробовал почти все возможные решения, но ни одно из них мне не помогло. Ниже приведены коды, которые я использую: CalkitBridge.m
#import "CalkitBridge.h" #define DATA_KEY @"CALLER_LIST" #define DATA_GROUP @"group.org.reactn.futurecodes.CallDirectory" #define EXTENSION_ID @"org.reactn.futurecodes.CallDirectory" @реализация CallkitBridge RCT_EXPORT_MODULE() -(NSError*) buildErrorFromException: (NSException*) исключение withErrorCode: (NSInteger)errorCode { NSMutableDictionary* информация = [NSMutableDictionary словарь]; [info setValue:Exception.name forKey:@"Name"]; [info setValue:Exception.reason forKey:@"Reason"]; [информация setValue:Exception.callStackReturnAddresses forKey:@"CallStack"]; [info setValue:Exception.callStackSymbols forKey:@"CallStackSymbols"]; [info setValue:Exception.userInfo forKey:@"UserInfo"]; NSError *error = [[NSError alloc] initWithDomain:EXTENSION_ID code: errorCode userInfo:info]; ошибка возврата; } - (NSArray*)getCallerList { @пытаться { NSUserDefaults* userDefaults = [[NSUserDefaults alloc] initWithSuiteName:DATA_GROUP]; NSArray* callerList = [userDefaults arrayForKey:DATA_KEY]; если (список вызывающих) { вернуть список вызывающих; } return [[NSArray alloc] init]; } @catch(NSException* e) { NSLog(@"CallerId: Не удалось получитьCallerList: %@", e.description); } } RCT_EXPORT_METHOD(getCallerList: (RCTPromiseResolveBlock) разрешить отказ: (RCTPromiseRejectBlock) отклонить) { @пытаться { NSArray* callerList = [NSArray arrayWithArray:[self getCallerList]]; разрешить (список вызывающих); } @catch (NSException* e) { Ошибка NSError* = [self buildErrorFromException:e withErrorCode: 100]; ignore(@"getCallerList", @"Не удалось получить мост getCallerList:", error); } } RCT_EXPORT_METHOD(setCallerList: (NSArray*) callerList withResolver: (RCTPromiseResolveBlock) разрешить отказ: (RCTPromiseRejectBlock) reject) { @пытаться { NSLog(@"Список вызывающих абонентов -> %@",callerList); NSUserDefaults* userDefaults = [[NSUserDefaults alloc] initWithSuiteName:DATA_GROUP]; [userDefaults setObject:callerList forKey:DATA_KEY]; [синхронизация пользовательских настроек]; [CXCallDirectoryManager.sharedInstance reloadExtensionWithIdentifier: EXTENSION_ID завершениеHandler: ^ (NSError * _Nullable error) { если (ошибка) { NSLog(@"ошибка при перезагрузке"); ignore(@"setCallerList", @"Не удалось перезагрузить расширение", error); } еще { NSLog(@"расширение перезагрузки...."); решить (@true); } }]; } @catch (NSException* e) { Ошибка NSError* = [self buildErrorFromException:e withErrorCode: 100]; ignore(@"setCallerList", @"Не удалось установить список вызывающих абонентов", error); } } RCT_EXPORT_METHOD(getExtensionEnabledStatus: (RCTPromiseResolveBlock) разрешить отказ: (RCTPromiseRejectBlock) отклонить) { // CompleteHandler вызывается дважды. Это обходной путь __block BOOL hasResult = false; __block int RealResult = 0; [CXCallDirectoryManager.sharedInstance getEnabledStatusForExtensionWithIdentifier: EXTENSION_ID завершениеHandler: ^ (CXCallDirectoryEnabledStatus EnabledStatus, NSError * _Nullable error) { // TODO: Удалите эти условия, когда найдете способ вернуть правильный результат или Apple просто исправит свою ошибку. если (hasResult == false) { имеетРезультат = Истина; RealResult = (INT) EnabledStatus; } если (ошибка) { ignore(@"getExtensionEnabledStatus", @"Не удалось получить статус расширения", error); } еще { разрешить ([NSNumber NumberWithInt: RealResult]); } }]; } - (NSDictionary *)constantsToExport { return @{ @"НЕИЗВЕСТНО": @0, @"ОТКЛЮЧЕНО": @1, @"ВКЛЮЧЕНО": @2}; } @конец CallDirectoryHandler.m
#import "CallDirectoryHandler.h" #define DATA_KEY @"CALLER_LIST" #define APP_GROUP @"group.org.reactn.futurecodes.CallDirectory" @interface Caller: NSObject @property NSString* имя; @property NSArray* числа; -(тип экземпляра) initWithDictionary: (NSDictionary*) словарь; @конец @implementation Звонящий -(тип экземпляра) initWithDictionary: (NSDictionary*) словарь { если (сам = [супер инициализация]) { self.name = словарь[@"имя"]; self.numbers = словарь[@"numbers"]; } вернуть себя; } @конец @interface CallDirectoryHandler () @конец @implementation CallDirectoryHandler - (void)beginRequestWithExtensionContext:(CXCallDirectoryExtensionContext *)context { context.delegate = сам; если (context.isIncremental) { [контекст удалитьAllIdentificationEntries]; } NSLog(@"перезагрузка и добавление номеров..."); [self addAllIdentificationPhoneNumbersToContext:контекст]; [контекст CompleteRequestWithCompletionHandler: ноль]; } - (NSArray*)getCallerList { @пытаться { NSUserDefaults* userDefaults = [[NSUserDefaults alloc] initWithSuiteName:APP_GROUP]; NSArray* callerList = [userDefaults arrayForKey:DATA_KEY]; если (список вызывающих) { NSLog(@"%@",callerList); вернуть список вызывающих; } return [[NSArray alloc] init]; } @catch(NSException* e) { NSLog(@"Не удалось получить список звонивших: %@", e.description); } } - (void)addAllIdentificationPhoneNumbersToContext:(CXCallDirectoryExtensionContext *)context { @пытаться { NSArray* callerList = [self getCallerList]; NSLog(@"Список каталогов вызовов %@",callerList); NSMutableDictionary* labelsKeyedByPhoneNumber = [[NSMutableDictionary alloc] init]; NSUInteger callersCount = [количество списка вызывающих]; если (callersCount > 0) { for (NSUInteger я = 0; я { (асинхронный () => { пытаться { const status = ждут CallkitBridge.getExtensionEnabledStatus(); если (статус === 2) { пытаться { ждут CallkitBridge.setCallerList(абоненты); } поймать (ошибка) { console.log('Ошибка добавления => ', error); } } } поймать (ошибка) { console.log('Ошибка -> ', ошибка); } })(); }, []); возвращаться ( Привет, мир ); } экспортировать приложение по умолчанию; P.S. Я проверил группу приложений, она верна, +92 — это код моей страны, то есть Пакистан, однако я не вижу идентификатор вызывающего абонента. Я проверил и включил расширение и вижу статус расширения === 2, который включен. Обратите внимание: хотя я испробовал все решения, мне не удалось отладить расширение каталога вызовов в XCode. Любая помощь приветствуется, спасибо.
Я попробовал изменить массив вызывающих абонентов из имени и массива чисел внутри объекта, а также немного изменить собственные коды. Ожидание: Я хочу, чтобы идентификатор вызывающего абонента показывался всякий раз, когда кто-то звонит мне с этого номера, я предоставляю ответ из своего приложения React Native.
Мобильная версия