Внедрите API UIPasteboard, ориентированный на конфиденциальность, в свои приложения.

С выпуском iOS 14 Apple дала пользователям новое представление о том, что делают приложения. Одна из ключевых особенностей - это часто упускаемый из виду монтажный стол (или, как многие его знают, буфер обмена). Раньше любое приложение могло проверять содержимое монтажного стола в любое время. Обычно это было для автоматического извлечения ссылок или телефонных номеров, но оставляло ворота открытыми для более злонамеренного слежения.

Теперь, когда приложение проверяет значение монтажного стола, пользователь получает уведомление во временном всплывающем окне, в котором сообщается, что он потенциально передал этому приложению важную информацию.

Это привело к тому, что некоторые громкие приложения были вызваны за то, что казалось необоснованным, заставляя их быстро объяснять, почему они вообще шпионили за картоном. Во многих случаях они быстро убирали контроль картона.

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

Чтобы разрешить законную проверку монтажного стола, Apple предоставила новый API, который помогает приложениям определять, стоит ли копаться в этой строке и запускать это всплывающее окно.

В этой статье объясняется, как использовать эту функцию, а также некоторые неожиданные ограничения. Чтобы помочь вам изучить этот новый API, я создал очень простое приложение SwiftUI, которое использует все возможности API. Чтобы настроить образец, создайте новое приложение SwiftUI в Xcode, назовите его как хотите и вставьте приведенный ниже код в файл ContentView.swift:

Основная часть кода проста, если вы знакомы со SwiftUI. Он создает кнопку и текстовое представление. Кнопка будет смотреть на монтажный стол, условно получать содержимое и отображать его в текстовом представлении. Мы сосредоточимся на функции inspectPasteboard, разбивая ее на разделы. Если вы не используете SwiftUI, не волнуйтесь. Методы монтажного стола также работают с UIKit, но в этом примере получить что-то на экране проще с помощью SwiftUI.

Начиная сверху, у нас есть:

if !UIPasteboard.general.hasStrings { return }

Это не ново. hasStrings - очень удобный метод определения типа данных на монтажном столе. В нашем примере нас интересуют только текстовые данные, поэтому немедленно выйдите, если строки отсутствуют.

Следующая часть новая:

UIPasteboard.general.detectPatterns(for: [UIPasteboard.DetectionPattern.probableWebURL, UIPasteboard.DetectionPattern.number, UIPasteboard.DetectionPattern.probableWebSearch], completionHandler: {result in ...

Теперь мы переходим к новым битам, представленным в iOS 14. detectPatterns позволяет нам выйти за рамки базовой проверки типов и иметь некоторую вероятность того, что строка будет содержать что-то полезное. Если мы его проверим, мы, вероятно, добавим полезные функции в наше приложение.

Параметр for принимает набор DetectionPatterns. В настоящее время вы можете использовать три возможных шаблона. В этом примере мы проверим все три. Но в реальных случаях использования мы, вероятно, проверяем только один из них. Мы рассмотрим каждый из них по очереди, объясняя, что они проверяют, и некоторые типичные варианты использования. Однако сначала нам нужно поговорить о том, как это completionHandler работает.

В этом обработчике завершения у нас есть:

switch result {
case .success(let detectedPatterns):
  ...
case .failure(let error):
  ...
}

Этот .success результат не означает, что мы нашли соответствие предоставленным нами шаблонам. Это просто означает, что определение паттерна завершено. Значение detectedPatterns содержит set совпадающих шаблонов, поэтому нам нужно это проверить. Результат .failure будет установлен, если метод detectPatterns обнаружит проблему с доступом к монтажному столу - чего я никогда не видел, чтобы происходило, но вы должны изящно принять, что вы не можете смотреть на монтажный стол прямо сейчас.

Наконец, мы переходим к интересной части: эти три if оператора по очереди проверяют, содержат ли обнаруженные шаблоны тот, который нас интересует, и можем ли мы действовать в соответствии с ним. Именно в этот момент мы знаем, что у нас, вероятно, есть значение, которое мы хотим прочитать, и вызываем этот UIPasteboard.general.string метод, который вызовет всплывающее окно пользователя.

Apple не задокументировала точные критерии каждого из этих шаблонов, но я объясню, как они работают. Весьма вероятно, что Apple со временем усовершенствует их и, возможно, добавит дополнительные шаблоны для дальнейшего предотвращения ненужного доступа приложений к монтажному столу.

DetectionPattern.probableWebURL

Вероятно, это наиболее часто используемый шаблон. Он определяет, содержит ли строка URL-адрес, который мы можем извлечь и использовать. Важно отметить, что это будет выполнено, если в строке есть URL-адрес в любом месте, поэтому вам придется самостоятельно манипулировать строкой, если вы хотите извлечь фактическую часть URL-адреса.

Очевидный вариант использования - приложения в стиле «прочтите позже», чтобы взять URL-адрес из другого приложения и предложить его проанализировать или сохранить.

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

DetectionPattern.number

Этот шаблон, кажется, подходит для многих числовых вариантов использования. Наряду с простым целым числом, числами с десятичными знаками и числами с символами валюты он также соответствует строкам, начинающимся с числа и формул (1 + 2 и т. Д.).

Хотя это широкое соответствие может быть полезно для приложений в стиле электронных таблиц / калькуляторов, вы получите ложное срабатывание, если, например, вы создаете калькулятор налога с продаж, а у пользователя был пронумерованный элемент списка на монтажном столе. Пока вы не вызовете это всплывающее окно, создающее UIPasteboard.general.string, вы не узнаете, действительно ли сможете обработать значение.

DetectionPattern.probableWebSearch

Это самый широкий образец из всех. Кажется, он соответствует всему, что есть на монтажном столе, если это текст. Я скопировал целые абзацы, и этот шаблон все еще совпадает. Стоит отметить, что он также дает положительное совпадение для URL-адресов и чисел, поэтому, если вы работаете с несколькими шаблонами, всегда обрабатывайте это последним.

У меня нет конкретного варианта использования для этого. Оно настолько широкое, что я бы все равно выбрал значение монтажного стола (и, тем самым, показывал бы всплывающее окно).

Заключение

Хотя новые шаблоны обнаружения не останавливают всплывающее окно, они помогут вашему приложению определить, будет ли полезно проверить монтажный стол. Это всплывающее окно появляется реже, поскольку пользователь дает уверенность в том, что ваше приложение не переусердствует с собираемыми им данными, хотя, вероятно, стоит объяснить, почему вы читаете монтажный стол, когда это необходимо.

Я чувствую, что это первый шаг в наборах картонных выкроек. Следите за изменениями в будущем, поскольку Apple будет их совершенствовать, что будет хорошо как для вас, как разработчика приложений, так и для обеспечения конфиденциальности пользователей.