All streams
Search
Write a publication
Pull to refresh
37
0
Женя @teanet

Пользователь

Send message
А у вас получилось на iOS 10 распарсить на девайсе DYLD_PRINT_STATISTICS?
Кажется это пустая строка или недопустимый символ в методе для поля label
- (void)addIdentificationEntryWithNextSequentialPhoneNumber:(CXCallDirectoryPhoneNumber)phoneNumber label:(NSString *)label;

Еще возникали подобные проблемы когда обновить экстеншн 2 раза не дожидаясь окончания обновления, но кажется это поправили.
Повторюсь, мы не имеем доступа к входящим звонкам. Никак, от слова вообще. Есть api для определения факта того что был входящий звонок, но номер мы получить не сможем. Плюс, не думаю что нашим пользователям понравится всплывающее окно каждый раз после того как они получили входящий звонок.
И на всякий случай еще раз
image
Мы забили на логи, потому что на процесс обновления мы повлиять не можем, а успешный сценарий проходит всегда, так как данные заранее подготовлены.

Мы смотрели в сторону дарвиновских нотификаций, но из за нехватки времени и малой приоритетности этой фичи, не дожали эту тему.

Если Apple выкатит более вменяемый api для включения из приложения, вернемся к этой теме.
denisenkoaj

1. Да происходит, экстеншн это отдельное приложение которое крутиться отдельным процессом и не зависит от основного. Происходит закачка или нет можно проверить посмотрев системные логи, там будет что то вроде
...5000 phones added…
...5000 phones added…
...5000 phones added…

2. Файл пожалуй не дам, но вот сниппет, который эти файлы создает. В статье есть пример парсера. По памяти там вообще нет просадки, а любая база делает сортированный прогон либо долгим либо прожорливым по памяти.
Код
@interface DGSPhonesDataWriter : NSObject
- (void)writePhone:(unsigned long long int)phone name:(NSString *)name;
- (void)saveWithPath:(NSString *)path;
@end


#import "DGSPhonesDataWriter.h"

@implementation DGSPhonesDataWriter {
	NSMutableData *_data;
}

- (instancetype)init {
	self = [super init];
	if (self == nil) return nil;
	_data = [NSMutableData data];
	return self;
}

- (void)writePhone:(unsigned long long int)phone name:(NSString *)name {
	NSMutableData *localData = [NSMutableData data];
	[localData appendBytes:&phone length:sizeof(unsigned long long int)];
	[localData appendData:[name dataUsingEncoding:NSUTF8StringEncoding]];
	uint16_t len = (uint16_t)localData.length;
	[_data appendBytes:&len length:sizeof(len)];
	[_data appendData:localData];
}

- (void)saveWithPath:(NSString *)path {
	[_data writeToFile:path atomically:YES];
}

@end


Да, ты прав, хоть это и не узкое горлышко, фикс выкачу)
Мы не ищем по файлу, нам нужно записать в память телефона 100 000 — 2 000 000 номеров, в возрастающем порядке ровно один раз, именно так работает АОН на iOS 10. CallKit не дает на лету перехватить входящий номер, от слова никак.
Для самого сложного случая нам нужно проитерировать 2 000 000 номеров. Итерация по всем номерам в экстеншене (а ему выделяется далеко не все системные ресурсы) и запись всего этого в память телефона занимает около 10 секунд на iPhone 5.
Нужно зайти в настройки > телефон > Блок. и индентификация вызова > Включить 2ГИС
В картинках
image
image
image
Такое бывает, долгий дебаг экстеншена ничем не помог, просто падает какая то системная библиотека, помогает только включить/выключить пару раз, или переустановка приложения (без скачанного региона включится, но номера определять не будет). Других способов это вылечить мы не нашли (
Ведет себя отлично, если в 2 определителях есть 2 одинаковых номера, то возьмет из того что выше по списку.

Это была одна из гипотез как запихать 4 000 000+ млн номеров. Был прототип с 3 экстеншенами от одного приложения, все работало ок.

Также проверяли как работает несколько разных приложений с CallKit экстеншенами, проблем тоже не было.
Пробывали. В первую очередь, основная проблема отсортировать по номерам. Создается большой кэш, как не старался при базе в 1млн номеров вылазит за 5 метров только в путь. готовить правильно NSFetchRequest не хотелось (а если честно я CoreData прям не люблю)

У нас уже есть готовая система доставки данных, которая легко держит нагрузки в 15млн пользователей, а после того как обожглись на On demand resources, не хотелось больше ничего иметь с эппловской системой доставки.

Думаю это прям ок связка для баз в районе 100-300к и месячной аудитории такого же порядка.
1. это статья про определитель на iOS, я очень рад что на андроид все можно, на iOS разрешено только то что разрешено
2. Мы не имеет доступа к входящим звонкам, мы всего лишь «учим» систему что номер 911 это служба спасения.
3. Когда служба спасения звонит нам (приходит входящий вызов от 911) iOS смотрит базу всех номеров, которые были получены от экстеншенов (не обязательно нашего) если он находит номер 911, он вытаскивает этот номер из базы телефона (не расширения) и показывает его во время звонка (что видно на скриншоте).
4. Обычные разработчики под iOS (я как обычный разработчик вам говорю) могут получить доступ к этой фиче, курите доки.
Расширение запускается один раз за одну версию, работает от 1 до 10 секунд, больше никак не поднимается, думаю жрет в районе 0.0035% (в среднем за 8 часов телефон разряжается 1 / (8 * 60 * 60) ≈ 0.000035) за каждое обновление приложения, порядок такой.
В iOS нет доступа к входящим звонкам, соответственно определить тоже никак нельзя кто звонил ни в приложении ни в экстеншене, можно только сказать какие телефоны можем определить. Пока что так.
2

Information

Rating
Does not participate
Location
Новосибирск, Новосибирская обл., Россия
Registered
Activity

Specialization

Mobile Application Developer
Lead