Открытая активность без отображения UIActivityViewController

Я хочу иметь социальные значки в scrollView, который при щелчке работает так же, как если бы я нажал на них после представления UIActivityViewController. Я не хочу представлять UIActivityViewController.

Я знаю, что это не должно быть возможно, но приложение Yodel делает это (или что-то подобное), и я хочу сделать то же самое.

Нажатие на значки в Yodel работает точно так же, как в UIActivityViewController, поэтому кажется, что они каким-то образом помещают его в контейнерный вид (?)

Здесь отображается GIF

введите описание изображения здесь

Используя Whatsapp в качестве примера, я пробовал следующее:

  • Использование API Whatsapp https://www.whatsapp.com/faq/en/iphone/23559013 с помощью схемы URL

        var whatsappURL = NSURL(string: "whatsapp://send?text=Hello%2C%20World!")!
        if UIApplication.sharedApplication().canOpenURL(whatsappURL) {
            UIApplication.sharedApplication().openURL(whatsappURL)
        }
    
  • Использование UIActivityViewController, но я хочу, чтобы все они были в scrollView, как показано на рисунке выше.

  • Использование UIWebView для открытия схемы URL в надежде, что она останется внутри UIWebView.

    var whatsappURL = NSURL(string: "whatsapp://send?text=Hello%2C%20World!")!
    if UIApplication.sharedApplication().canOpenURL(whatsappURL) {
        UIApplication.sharedApplication().openURL(whatsappURL)
    }
    
    self.view.addSubview(webview)
    webview.loadRequest(NSURLRequest(URL: NSURL(string: "whatsapp://send?text=Hello%2C%20World!")!))
    

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

Любая идея, как это сделать? Помощь будет принята с благодарностью:)

Ответ 1

На самом деле я сделал точно то же самое, но для этого решения вам необходимо также реализовать боковой сервер для продолжения поддержки новых приложений, которые появляются в AppStore (без обновления вашего приложения для каждого раза, когда вам нужно/нужно добавлять/удалять новое приложение в/из список)

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

2nd: вам нужно узнать схему URL, с которой работают приложения,

пример для instagram → "instagram://user? username = your_username"

3rd: теперь логика процесса

скажем, я хочу показать facebook, twitter, slack и instagram,

установите словарь с соответствующими URL-адресами:

["facebook":"facebook://blablabla", "twitter":"twitter://blabla", "slack":"slack://blabla", "instagram":"instagram://blabla"]

ТАКЖЕ ВАМ НУЖНО СДЕЛАТЬ ПРИЛОЖЕНИЯ ICONS (локально или сервер /firebase/cloud ) - для отображения позже в вашем scrollview (horizontaly collectionview или когда-либо вы решите использовать)

4rd: вам нужно проверить, установлены ли эти приложения на устройстве:

Итак, просто зацикливайтесь на своем массиве приложений/словарях (или когда-нибудь вы решите сохранить свою информацию и проверьте наличие такой возможности:

let instagramHooks = "instagram://user?username=your_username"
let instagramUrl = URL(string: instagramHooks)
if UIApplication.shared.canOpenURL(instagramUrl! as URL)
{
 //The app are installed you can show her
 } else {
       //The app doesn't installed -> don't show it on the list
    }

После этого вам просто нужно поместить свои значки в UICollectionView/UIScrollView, а когда пользователь коснется значка, вы откроете эту схему:

UIApplication.shared.open(instagramUrl!)

О том, как целевое приложение покажет диалог (например, действие UIActivityViewController или фактически открыть приложение, которого я не вижу сейчас), но я уверен, что вы можете найти здесь кого-то, кто поможет вам с этим

Хоп вы понимаете мои шаги, если нет, вы можете связаться со мной для более подробного объяснения

Ответ 2

Короткий: Это невозможно.

Каждое приложение запускается внутри своей "игровой площадки", и приложения полностью фокусируются на устройстве.

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

Но в общем случае приложения не знают друг о друге.

И единственная возможность запуска стороннего приложения, как вы уже знаете, это URL-схема. Если вы хотите запустить приложение в своем приложении, как в UIWebView, вам нужно будет эмулировать целое iOS. Так невозможно.

Однако это может быть возможно с jailbroken iPhones, но я понятия не имею об этом.

Ответ 3

Yodel: они создали свой собственный пользовательский вид, и они выбрали некоторые распространенные приложения, такие как whatsapp, snapchat, messenger и т.д., для которых openurl common, они проверили каждый из них, используя "canOpenUrl", чтобы проверить, доступно ли данное приложение на пользователь мобильный. Если доступно, нажмите значок. Когда пользователь нажимает на него, он откроет данное приложение, используя "openUrl".

Здесь, в yodel, вы можете видеть, что он не может принимать все доступные приложения для совместного использования, он может только предопределять исправленные приложения, которые они определили. Для других приложений они добавили "больше кнопки" в конец, после чего на экране откроется UIActivityViewController.