Общий доступ – это действительно мощная функция, которая сегодня доступна практически на любом телефоне. Если вы являетесь разработчиком приложений и хотите, чтобы ваши пользователи рассказывали о вашем продукте, убедительный опыт работы с хорошо настроенной таблицей общего доступа может помочь обеспечить рост сетевого эффекта.
Что такое Общий лист и почему я должен его использовать?
Общие листы – это интерфейсы как для iOS, так и для Android, которые позволяют обмениваться контентом из вашего приложения в другое приложение. Например, в приложении “Фотографии” вы можете выбрать изображение, а затем поделиться им с другими приложениями, такими как Instagram, почтовое приложение, приложение для обмена сообщениями и многими другими.
Фактическая логика, лежащая в основе общих листов, обрабатывается операционной системой, все, что вам нужно сделать как разработчику приложения, – это указать ему открыть. Общие таблицы настроены таким образом, поэтому вам не нужно обновлять код приложения для обработки новых приложений, которые могут совместно использовать один и тот же контент. Вы отправляете операционной системе свой контент для совместного использования, и она сообщит пользователю, куда им можно поделиться.
На iOS лист общего доступа выглядит следующим образом:
А на Android это выглядит так:
Как мне это сделать?
Давайте разберемся с каким-нибудь кодом!
iOS
В iOS Общий лист представлен в виде контроллера представления, который необходимо программно создать и представить пользователю. Это называется UIActivityViewController
, и для простых случаев использования это довольно просто:
let textToSend = "This is some text that will be exported to another app!" let activityViewController = UIActivityViewController(activityItems: [textToSend], applicationActivities: nil) currentViewController.present(activityViewController, animated: true, completion: nil)
С этим кодом на месте, это то, что мы видим:
И это отлично подходит для текста, но что, если бы мы захотели поделиться изображением?
let image: UIImage = getImage() let activityViewController = UIActivityViewController(activityItems: [image], applicationActivities: nil) currentViewController.present(activityViewController, animated: true, completion: nil)
Он отлично работает, но выглядит немного простовато. Однако можно настроить общий лист с заголовком, описанием и миниатюрой, минуя контроллер экземпляра UIActivityItemProvider
вместо просто необработанных данных:
class ShareImage: UIActivityItemProvider { var image: UIImage override var item: Any { get { return self.image } } override init(placeholderItem: Any) { guard let image = placeholderItem as? UIImage else { fatalError("Couldn't create image from provided item") } self.image = image super.init(placeholderItem: placeholderItem) } @available(iOS 13.0, *) override func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? { let metadata = LPLinkMetadata() metadata.title = "1 Image" var thumbnail: NSSecureCoding = NSNull() if let imageData = self.image.pngData() { thumbnail = NSData(data: imageData) } metadata.imageProvider = NSItemProvider(item: thumbnail, typeIdentifier: "public.png") return metadata } } ... let image: UIImage = getImage() let item = ShareImage(placeholderItem: image) let activityViewController = UIActivityViewController(activityItems: [item], applicationActivities: nil) currentViewController.present(activityViewController, animated: true, completion: nil)
И вот оно у вас есть! Также можно отправить несколько объектов данных на общий лист или указать, какие приложения могут получать доступ к данным, используя параметр applicationActivities
.
Андроид
Я обнаружил, что сделать это на Android сложнее, чем на iOS, в основном из-за того, как Android справляется с правами доступа к файлам. По сути, вам нужно установить права доступа к файлу, которым вы хотите поделиться вручную, тогда как в iOS это обрабатывалось автоматически.
В Android вам необходимо указать класс, из которого вы собираетесь звонить, как Поставщик файлов
и указать, к каким файлам ему разрешен доступ. Вы делаете это, указывая класс в AndroidManifest.xml
файл:
А затем создаем новый каталог с именем xml
и файл в нем с именем пути к файлам
:
Обратите внимание, что вам может потребоваться использовать другой тег, чем files-путь
, в зависимости от того, где хранятся ваши файлы. Если вы используете временные файлы, вам может потребоваться использовать путь к кэшу
. Полный список того, что вам может понадобиться, см. в документах android здесь
Теперь внутри класса, который мы указали в поставщике выше:
File file = getFile() Uri uri = FileProvider.getUriForFile(getContext(), this.getClass().getName(), file); Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_STREAM, uri); intent.setType("MIME_TYPE_OF_FILE"); Intent shareIntent = Intent.createChooser(intent, "Share File"); shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(shareIntent);
Выполнение этого откроет общий доступ и отправит ваш файл в веселый путь. Я не нашел последовательного способа настроить Общий доступ на Android, как мы делали ранее на iOS, но если я это сделаю, я обновлю этот пост.
Оригинал: “https://dev.to/jakebloom/using-share-sheets-on-ios-and-android-4obi”