Расширение клавиатуры iOS (группы приложений)

у меня есть вопрос о Keyboard Extension.

Приложение-контейнер имеет много изображений (например, > 100 изображений и всего 100 МБ), и приложение-контейнер сохранено с использованием NSUserDefaults.

вот так:

NSMutableArray* arr = [NSMutableArray new];

for(NSInteger i = 0; i < 100; i++)
{
    UIImage* img = [UIImage imageNamed:[NSString stringWithFormat:@"img%ld",i]];
    NSData* data = UIImagePNGRepresentation(image);
    [arr addObject:data]
}

NSUserDefaults* ud = [[NSUserDefaults alloc] initWithSuiteName:@"<group identifier>"];
[ud setObject:arr forKey:@"image_data"];
[ud synchronize];

и приложение клавиатуры получает данные изображения из NSUserDefaults.

Правильно ли приложение-контейнер отправляет большие объемы данных клавиатурному приложению?

В особом случае, когда экземпляр NSUserDefaults обращается к методу (objectForKey:) в приложении клавиатуры, происходит сбой приложения клавиатуры.

Особый случай:

если размер данных изображения в NSUserDefaults больше примерно 30 МБ (не уверен), приложение клавиатуры дает сбой, а если размер меньше примерно 30 МБ, оно работает хорошо.

Существует ли максимальный размер NSUserDefaults?

я просто хочу лайкнуть это приложение.

я хочу знать, что я управляю данными большого размера в приложении клавиатуры.


person dh0rmfpdlxm    schedule 24.01.2017    source источник
comment
если вы хотите сохранить изображение, сохраните его в основных данных, чем NSUserdefault   -  person Gurinder Batth    schedule 24.01.2017
comment
Может ли приложение клавиатуры получить доступ к основным данным, которые сохраняет приложение-контейнер?   -  person dh0rmfpdlxm    schedule 24.01.2017


Ответы (1)


1) Сначала вы должны записать изображение в общий каталог документов.

- (NSString *)getSharedLocationPath:(NSString *)appGroupName {
    NSURL *groupContainerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.yourGroupName"];
    return [groupContainerURL relativePath];
}

2) Запишите изображение в указанный выше общий каталог.

    NSString *path = [[self getSharedLocationPath:@"group.yourGroupName"] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",images]];
   //Here fileData is your Image data.
   [fileData writeToFile:path atomically:YES];

3) Точно так же получите этот путь к классу расширения клавиатуры, как указано выше.

- (NSString *)getSharedLocationPath:(NSString *)appGroupName {
    NSURL *groupContainerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.yourGroupName"];
    return [groupContainerURL relativePath];
}
//Here get content of directory from shared document directory. 
NSArray *directoryContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self getSharedLocationPath:@"group.yourGroupName"] error:NULL];
    for (Count = 0; Count < (int)[directoryContent count]; Count++)
    {
        NSLog(@"File %d: %@", (Count + 1), [directoryContent objectAtIndex:Count]);
    }
//Now you get your images from app shared directory.
person amit_donga    schedule 24.01.2017
comment
ой! я не знаю общий путь. я попробую это. Спасибо-спасибо - person dh0rmfpdlxm; 24.01.2017
comment
общий путь используется для двух приложений для обмена данными между ними из каталога документов. - person amit_donga; 24.01.2017
comment
Здесь @group.yourGroupName замените на имя группы вашего приложения расширения. - person amit_donga; 24.01.2017
comment
Пожалуйста, если вы удовлетворены моим ответом, проголосуйте или одобрите мой ответ. благодарю вас. - person amit_donga; 24.01.2017