Комментарии 32
Сейчас это так?
просто у стандартной звонилки Andorid 6.0 из коробки есть определение номера во время звонка. Обычные разработчики могут получить к этой фиче доступ?
2. Мы не имеет доступа к входящим звонкам, мы всего лишь «учим» систему что номер 911 это служба спасения.
3. Когда служба спасения звонит нам (приходит входящий вызов от 911) iOS смотрит базу всех номеров, которые были получены от экстеншенов (не обязательно нашего) если он находит номер 911, он вытаскивает этот номер из базы телефона (не расширения) и показывает его во время звонка (что видно на скриншоте).
4. Обычные разработчики под iOS (я как обычный разработчик вам говорю) могут получить доступ к этой фиче, курите доки.
Включение в глубине настроек — это конечно тихий ужас, очень надеюсь они это каким-то образом оптимизируют… =\
У нас уже есть готовая система доставки данных, которая легко держит нагрузки в 15млн пользователей, а после того как обожглись на On demand resources, не хотелось больше ничего иметь с эппловской системой доставки.
Думаю это прям ок связка для баз в районе 100-300к и месячной аудитории такого же порядка.
А как ведёт себя система, если включено 2 определителя от разных разработчиков? Не проверяли?
Это была одна из гипотез как запихать 4 000 000+ млн номеров. Был прототип с 3 экстеншенами от одного приложения, все работало ок.
Также проверяли как работает несколько разных приложений с CallKit экстеншенами, проблем тоже не было.
Простите, возможно я неправильно прочитал, но что за 10 сек на поиск по файлу, а как же бинарный поиск по отсортированным данным? Что за ограничение по оперативке, есть же маппинг файлов в память?
Для самого сложного случая нам нужно проитерировать 2 000 000 номеров. Итерация по всем номерам в экстеншене (а ему выделяется далеко не все системные ресурсы) и запись всего этого в память телефона занимает около 10 секунд на iPhone 5.
В качестве оптимизации, предлагаю не копировать куски NSData
в массивы а потом еще и в строки. Предлагаю сразу создавать NSString
без копирования данных на исходном NSData
через -initWithBytesNoCopy:length:encoding:freeWhenDone:
https://developer.apple.com/reference/foundation/nsstring/1413830-initwithbytesnocopy?language=objc
Учитывая, что -dataWithContentsOfFile:options:error:
и так маппит файл в память – получение памяти сведется к минимуму вообще.
1) Скажите, происходит ли закачка номеров в экстеншн когда приложение свернуто в бэкграунд? У меня почему ранее при тестировании происходила, потом перестала. Не могу понять или не качественно изначально протестил или она не происходит.
2) Можете дать пример файла с которого парсите номера? У меня приходятся архивированные файлы которые я распарсиваю, гоню в базу в Realm, в ней сортирую, и потом с экстеншна уже тяну отсортированные. По памяти все ок (в iOS 10.2 расширился лимит до 13-14 мб), но скорость этой операции жуть. Хочу взять ваш файл за образец.
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
Потому что NSLog от экстеншна в консоль не пишет, я отдельно сделал логирование через userDefaults — через записи них у меня экстеншн сообщает свой статус основному приложению.
Мы смотрели в сторону дарвиновских нотификаций, но из за нехватки времени и малой приоритетности этой фичи, не дожали эту тему.
Если Apple выкатит более вменяемый api для включения из приложения, вернемся к этой теме.
Error while reloading status for тутмойбандлid extension: Optional(Error Domain=sqlite Code=11 «sqlite3_step for query 'INSERT OR IGNORE INTO Label (localized_label) VALUES (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?), (?),
и дальше много таких же вопросов,…
returned 11 (11) errorMessage 'database disk image is malformed'» UserInfo={NSLocalizedDescription=sqlite3_step for query 'INSERT OR IGNORE INTO Label (localized_label) VALUES (?)
- (void)addIdentificationEntryWithNextSequentialPhoneNumber:(CXCallDirectoryPhoneNumber)phoneNumber label:(NSString *)label;
Еще возникали подобные проблемы когда обновить экстеншн 2 раза не дожидаясь окончания обновления, но кажется это поправили.
я сначала импортирую номера в realm, а потом их достаю оттуда, вот значения для номеров на которых выскакивают ошибки:
中畑酒店
アラミス2
ошибка повторяется на одном аппарате 6+ у тестера, у меня на 6ках двух разных прекрасно все инсталлится. Причем то на одном номере стопорится то его проходит и стопорится на одном из следующих.
На других 6+ нет возможности проверить.
Есть идеи как можно проверку делать на допустимость? Алфавит там японский)
Просто ошибка вылетает со стеком sqlite а такие варианты я видел на форуме эпла только в постах от июня 2016 года и то после обновления ios такие ошибки со стеками исчезали.
Только сегодня узнал про эту фичу, странно, что никаких анонсов нигде не видел, они были?
Выглядит полезным, включил, потестим!
Все «радости» CallKit или как мы делали определитель номера на iOS 10