Открытие нестандартного URL в приложении Какао

Не удалось избежать публикации минималистского метода без зависимости или библиотек. Для этого требуется новый API-интерфейс. Могу ли я использовать его?

var url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="

fetch(url)
.then(res => res.blob())
.then(blob => console.log(blob))

С помощью этого метода вы также можете легко получить arraybuffer, text и json


Я сделал простой тест производительности по сравнению с версией синхронизации Джереми es6. Версия синхронизации будет блокировать UI некоторое время.

// get some dummy gradient image
var img=function(){var a=document.createElement("canvas"),b=a.getContext("2d"),c=b.createLinearGradient(0,0,200,100);a.width=a.height=3000;c.addColorStop(0,"red");c.addColorStop(1,"blue");b.fillStyle=c;b.fillRect(0,0,a.width,a.height);return a.toDataURL()}();


async function perf() {
  
  const blob = await fetch(img).then(res => res.blob())
  // turn it to a dataURI
  const url = img
  const b64Data = url.split(',')[1]

  // Jeremy Banks solution
  const b64toBlob = (b64Data, contentType = '', sliceSize=512) => {
    const byteCharacters = atob(b64Data);
    const byteArrays = [];
    
    for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
      const slice = byteCharacters.slice(offset, offset + sliceSize);
      
      const byteNumbers = new Array(slice.length);
      for (let i = 0; i < slice.length; i++) {
        byteNumbers[i] = slice.charCodeAt(i);
      }
      
      const byteArray = new Uint8Array(byteNumbers);
      
      byteArrays.push(byteArray);
    }
    
    const blob = new Blob(byteArrays, {type: contentType});
    return blob;
  }

  // bench blocking method
  let i = 1000
  console.time('b64')
  while (i--) {
    await b64toBlob(b64Data)
  }
  console.timeEnd('b64')
  
  // bench non blocking
  i = 1000

  // so that the function is not reconstructed each time
  const toBlob = res => res.blob()
  console.time('fetch')
  while (i--) {
    await fetch(url).then(toBlob)
  }
  console.timeEnd('fetch')
  console.log('done')
}

perf()

6
задан Lebyrt 7 May 2014 в 19:05
поделиться

2 ответа

Я не уверен, точно ли это, что Вы ищете, но существует метод в NSString, который санирует URL:

stringByAddingPercentEscapesUsingEncoding:

8
ответ дан 9 December 2019 в 22:42
поделиться

Я думаю, что поведение здесь корректно, потому что %d не является допустимым компонентом URL (% является Escape, но ожидает, что два шестнадцатеричных символа будут следовать за ним).

Вы не можете просто URL кодировать URL, как дали Вам, потому что это закодировало бы/s и? s также, который Вы не хотите.

Так, вопрос, каково корректное поведение здесь?

Возможно, Вы хотели бы, чтобы это было превращено...

http://www.somewebsite.com/method?a=%25d

(т.е. %, кодируют к закодированной версии % в URL, поэтому когда метод получает вход, это видит как устанавливаемый на %d),

Я не думаю, что существует любая библиотечная функция, которая сделает такую вещь для Вас, так как нет никакого 'корректного' способа сделать это. Об он только исправляет вещь, которую можно сделать, возвратить сообщение об ошибке, говоря URL, который Вам дали, недопустимо (как URLWithString),


Если бы Вы хотели попытаться обработать вход, я предполагаю, что необходимо было бы искать URL любые символы %, которые сразу не сопровождаются двумя шестнадцатеричными символами и затем заменяют % %25 в этом случае. Это должно быть довольно возможно с регулярным выражением, хотя я подозреваю, что могут быть некоторые дополнительные сложности, если Ваши URL начинают содержать закодированные версии символов вне набора символов ASCII.

2
ответ дан 9 December 2019 в 22:42
поделиться