Отправка нескольких сообщений в iMessage с помощью Swift

Я пишу приложение для iMessage и хотел бы автоматически отправлять сообщения, когда пользователь нажимает на экран приложения imessage.

Сообщение состоит из карты адреса местоположения.

Первоначально я пытался использовать message.url, чтобы содержать URL-адрес maps.apple.com, поэтому, когда получатель нажимает на полученное сообщение, он открывает карты.

Но это не похоже на работу. Поэтому я попытался отправить адрес отдельно: сначала изображение, затем адрес. Затем получатель может нажать на адрес, и карты откроются.

У меня есть следующий код:

    if let image = createImageForMessage(), let conversation = activeConversation {

        let layout = MSMessageTemplateLayout()
        layout.image = image

        let message = MSMessage()
        message.layout = layout

        //conversation.insert(message, completionHandler: nil)
        //conversation.insertText("We are at:\n" + addressLabel, completionHandler: nil)

        conversation.send(message, completionHandler: nil)
        conversation.sendText("We are at:\n" + addressLabel, completionHandler: nil)

    }

В идеале я хочу, чтобы требовалось только начальное нажатие, но при использовании "send" и "sendText" отправляется только первая команда "send", "sendText" игнорируется.

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

Я пытался:

        conversation.insert(message, completionHandler: nil)
        conversation.sendText("We are at:\n" + addressLabel, completionHandler: nil)

Но это не сработало. Только текст был отправлен. Изображение не отображается вообще.

Кто-нибудь знает, как отправить оба сообщения одним нажатием?

Или кто-нибудь знает, могу ли я объединить оба сообщения в одно?

2 ответа

Посмотрев немного подробнее, кажется, что url Сообщение var on используется в macOS, но в противном случае оно игнорируется. Выглядит так, как будто вы могли бы поместить некоторую логику в несколько методов делегата, чтобы открыть контроллеры представления, где вы могли бы поместить URL-адреса, которые затем могли бы открыть, хотя я не уверен, будет ли это означать, что все, кому вы отправляли эти сообщения чтобы было необходимо установить расширение (я полагаю, вы хотели бы избежать этого требования). Интересный сайт, на котором можно получить дополнительную информацию (с примером проекта), можно найти здесь: https://medium.com/swift-programming/learn-how-to-build-an-imessage-app-with-swift-7b106ce9b033

Несмотря на все сказанное, у меня есть "решение", хотя я не могу сказать, что рекомендую его (я не фанат решений, использующих задержки). Тем не менее, это успешно отправит сообщение, которое вы создали, а затем сообщение, содержащее текст. Похоже, что он ведет себя почти так же, как если бы вы вставили сообщение, а затем вставили текст, а пользователь нажал кнопку "Отправить". Поэтому, насколько мне не нравится добавленная задержка для достижения этого, конечный результат кажется правильным.

        conversation.send(message, completionHandler: { _ in
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2.0, execute: {
                conversation.sendText("http://www.google.com", completionHandler: nil)
            })
        })

Надеюсь, это поможет.

Смотря на документацию для MSConversationПохоже, вы не можете иметь два ожидающих сообщения одновременно.

Я бы попробовал:

    conversation.insert(message, completionHandler: ^{
        conversation.sendText("We are at:\n" + addressLabel, completionHandler: nil)
    })
Другие вопросы по тегам