2016-09-06 7 views
2

私はiOSアプリケーションiMessage Extensionを作成しています。 Example by AppleによればSwift 3 iMessage ExtensionはURLを開けません

、私は私の知る限り理解するように、メッセージが送信された後に提供される論理

guard let url: URL = URL(string: "http://www.google.com") else { return } 

let message = composeMessage(url: url) 
activeConversation?.insert(message, completionHandler: { [weak self] (error: Error?) in 
    guard let error = error else { return } 
    self?.presentAlert(error: error)   
}) 

private func composeMessage(url: URL) -> MSMessage { 
    let layout = MSMessageTemplateLayout() 
    layout.caption = "caption" 
    layout.subcaption = "subcaption" 
    layout.trailingSubcaption = "trailing subcaption" 

    let message = MSMessage() 
    message.url = url 
    message.layout = layout 

    return message 
} 

private func presentAlert(error: Error) { 
    let alertController: UIAlertController = UIAlertController(
     title: "Error", 
     message: error.localizedDescription, 
     preferredStyle: .alert 
    ) 

    let cancelAction: UIAlertAction = UIAlertAction(
     title: "OK", 
     style: .cancel, 
     handler: nil 
    ) 

    alertController.addAction(cancelAction) 

    present(
     alertController, 
     animated: true, 
     completion: nil 
    ) 
} 

に従ってメッセージを作成、クリックするとSafariブラウザが開きます。

送信したメッセージをクリックすると、Safariや他のアプリを開かずに画面全体でMessageViewControllerの画面が表示されます。

問題はどこですか?どのようにして目的の機能を達成できますか?

答えて

2

SafariブラウザはmacOS用にのみ開くと思います。これが私の仕事:

override func didSelectMessage(message: MSMessage, conversation: MSConversation) { 

     if let message = conversation.selectedMessage { 
      // message selected 

      // Eg. open your app: 
      let url = // your apps url 
      self.extensionContext?.openURL(url, completionHandler: { (success: Bool) in 

      }) 
     } 
    } 
+0

私は、 'extensionContext?.openURL(url、completionHandler:nil)'を何も成功させることなく呼び出してみました。少なくともiOS 10の場合。 –

+0

このコードブロックを使用してディープリンクURLを開いていますが、self.extensionContext?open(URLとしてURL、completionHandler: (成功:Bool)は にあります) –

-1
  1. のOpenURL didSelectMessage中:会話:それは不可能ですextensionContext

  2. ホストでURLスキームを扱うAppDelegateに思え

+0

継承目的のメッセージがタップされたときに 'didSelectMessage:conversation:'メソッドが呼び出されません。メッセージが送信される前に選択されたときにトリガされます。さらに、ホストアプリケーションデリゲートのURLスキームを処理することはさらに悪いです。ホストアプリケーションは、事実にもかかわらず、起動されていない可能性があります。それは、ベストケースのシナリオとしてバックグラウンドにあります。 –

+1

@DaumantasVersockas送信メッセージをタップするとdidBecomeActiveWithConversation:メソッドでそれを処理する必要があります、あなたは変換からselectedMessageを得ることができます。 extensionContextを使用すると、openURLがホストアプリケーションを起動します。 – handrenliang

1

を使用してワークスペースに含まれているコンパニオンアプリを除いて、メッセージエクステンションからアプリを開きます。私たちはMessage ExtensionからSafariを開こうとしましたが、うまくいきませんでした。この制限は設計上のようです。

あなたはあなたの問題を解決するために、他のscenariを試みることができる:

  1. 拡張メッセージ延長でのWebView

    あなたのメッセージ拡張でのWebViewを持つことができ、あなたがメッセージに をクリックすると、拡張モードを開き、 WebviewでUrlを開くことができます。

ユーザーはSafariには所属しませんが、そのページはメッセージ拡張機能に埋め込まれます。

<オール開始=「2」>
  • オープン を通じてコン​​パニオン、あなたのコンパニオンアプリを開くことができ、メッセージをクリックでアプリ

    内のURL(MyAppを持つのURLスキーム:/ /?myParam = myValue)を特別なパラメータ で置き換えます。コンパニオンアプリはこのパラメータに反応し、 をOpenUrl経由でSafariにリダイレクトできます。

  • この場合、Webページの前にリダイレクトされますが、会話に戻ることができます。

    また、メッセージストアでApple Storeを開き、ユーザーにアイテムを購入させたい場合は、メッセージエクステンションにSKStoreProductViewControllerをインスタンスすることもできます。

    +0

    このお手伝いができますか?https://stackoverflow.com/q/48032024/5589073 –

    0

    リンクを挿入する必要がある場合は、activeConversation.insertTextを使用してリンクを挿入する必要があります。メッセージに触れるとSafariが開きます。

    関連する問題