Рубрики
Без рубрики

Использование общих листов на iOS и Android

Как экспортировать данные из вашего приложения. Помеченный ios, android, swift, java.

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

Что такое Общий лист и почему я должен его использовать?

Общие листы – это интерфейсы как для 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”