SVGKit: Как отобразить XML-строку SVG, которая ссылается на фотографию устройства iOS, используя SVGKit

Итак, мой основной вопрос:

Есть ли способ на iOS использовать SVGKit для рендеринга SVG, который содержит ссылки на локальные изображения?

Гори Подробнее

Мое приложение должно генерировать и визуализировать SVG (XML в NSString). XML будет ссылаться на URL-адреса изображений на устройстве (в Camera Roll). Я использую SVGKit для iOS. Я могу получить URL-адреса из изображений PHAssets, используя следующее (см. Stackru: nsurl-from-phasset):

+ (void) getUrlFromPHAsset:(PHAsset *)asset 
         completionHandler:(void (^)(NSURL *url)) handler {

    PHImageRequestOptions *imgOptions = [PHImageRequestOptions new];
    PHContentEditingInputRequestOptions *options = 
                              [PHContentEditingInputRequestOptions new];
    imgOptions.version = PHImageRequestOptionsVersionCurrent;

    [asset requestContentEditingInputWithOptions:options 
            completionHandler:^(PHContentEditingInput * _Nullable contentEditingInput, NSDictionary * _Nonnull info) {
        handler(contentEditingInput.fullSizeImageURL);
    }];
}

Затем я использую этот URL-адрес изображения в сгенерированной XML-строке SVG (эта была сгенерирована в симуляторе):

<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="2175px" height="1537px" viewBox="0 0 2175 1537" style="background-color:#ffffff">

<defs>
    <clipPath id="my-uuid" clipPathUnits="userSpaceOnUse">  <rect x="1062" y="-1" width="1111" height="1538"/>
    </clipPath>
</defs>

<g clip-path="url(#my-uuid)">
    <image overflow="hidden" transform="translate(1062, -64.58393285371704) rotate(0, 555, 832)" x="0" y="0" width="1111" height="1665.167865707434" xlink:href="file:///Users/joe/Library/Developer/CoreSimulator/Devices/E8B8D888-93EC-4152-B0AD-B82D0C1B2FFE/data/Media/DCIM/100APPLE/IMG_0003.JPG"></image>
</g>
</svg>

Что я пробовал

Я попытался использовать SVGKSourceString для создания SVGKImage, но это возвращает пустое изображение для локального URL-адреса изображения (ссылки на удаленные URL-адреса работают нормально). Под "пустым изображением" я подразумеваю объект, отличный от нуля, с размером, но без содержимого изображения.

// DOESNT WORK on Simulator or real device
+ (SVGKImage *) svgImageFromString:(NSString *)text {
    SVGKSource *source = [SVGKSourceString sourceFromContentsOfString:svgText];
    SVGKImage *img = [SVGKImage imageWithSource:source]; // returns a blank image
}

Я заметил на симуляторе, что если я читаю содержимое SVG из файла на устройстве, это работает. Я думал, что это странно, но, что угодно. Когда он читает содержимое SVG из файла, он должен обрабатывать URL-ссылки по-разному. Итак, я превратил NSString в NSInputStream, затем использовал SVGSourceLocalFile.initWithInputStream: для создания SVGKSourceLocalFile, и он тоже работал на симуляторе. Локальное изображение, указанное в SVG, отображается. (ПРИМЕЧАНИЕ. Я должен был установить filePath с поддельным именем файла, чтобы не допустить взрыва imageWithSource.)

Но, к сожалению, это не сработало на реальном устройстве. SVGKImage imageSource: возвращается с пустым изображением.

// WORKS ON THE SIMULATOR, not on a real device
+ (SVGKImage *) svgImageFromString:(NSString *)text {
    NSData *svgData = [text dataUsingEncoding:NSUTF8StringEncoding];
    NSInputStream *inp = [NSInputStream inputStreamWithData:svgData];
    SVGKSourceLocalFile *fsource = [[SVGKSourceLocalFile alloc] initWithInputSteam:inp];
    // hack: set filePath to prevent SVGKit from barfing
    fsource.filePath = @"foo.bar";
    return [SVGKImage imageWithSource:fsource];
}

Я сильно подозреваю, что ему не понравилась ссылка на URL устройства. Я знаю, что есть проблемы с получением общего URL-адреса из PHAsset. URL на симуляторе работает в симуляторе Safari. Но URL, который я возвращаю на реальном устройстве (выглядит как "file:///var/mobile/Media/DCIM/102APPLE/IMG_2405.JPG"), НЕ работал в приложении Safari на устройстве. Я также попытался преобразовать PHAsset в ALAssetURL.. (см. Stackru: как получить alasset-url-from-a-phasset), но это тоже не сработало. Это также возвращает пустое изображение.

Подробности о версии

  • Версия iOS: 10.0.2 (реальное устройство), различные версии на сим (8.4, 9.3, 10.0)
  • Версия SVGKit: модуль 'SVGKit',: git => ' https://github.com/SVGKit/SVGKit.git ',: branch => '2.x'

1 ответ

SVGKit использует собственные классы Apple для анализа этих URL-адресов и не выполняет никакой дополнительной обработки для них.

Так что... если вы получаете нулевое изображение, вы, вероятно, нарушаете собственные возможности синтаксического анализа NSURL - см. Документацию Apple.

Однако... если вы запустите отладчик XCode, установите точку останова в используемом SVGKit-классе SVGKSourceXXXXX и запустите на устройстве, вы сможете легко увидеть в реальном времени, что не работает и где - я думаю, NSURL, но вы мог бы подтвердить это.

Другие вопросы по тегам