2016-10-02 2 views
0

didRecieve()를 구현하여 iOS 10 확장의 스토리 보드 부분을 트리거하려고합니다. 스토리 보드를 사용하여 다음 코드를 사용하여 메시지를 작성한 후 단편을 트리거 할 수 있습니다.iOS 10 메시지 확장 - 시뮬레이터에서 didRecieve() 및 selectedMessage 구현

@IBAction func createThing(_ sender: AnyObject) { 
    self.createMessage() 
} 

func composeMessage(customMessage: String, caption: String) -> MSMessage { 
    var components = URLComponents() 

    // create a query item from our custom message 
    let item = URLQueryItem(name: "New Thing", value: customMessage) 

    // put it into an array of query items 
    var items = [URLQueryItem]() 
    items.append(item) 
    components.queryItems = items 

    // tell messages to use the default message template layout 
    let layout = MSMessageTemplateLayout() 
    layout.caption = caption 

    // create a message and tell it the content and layout 
    let message = MSMessage() 
    message.url = components.url! 
    message.layout = layout 

    // return it for sending 
    return message 
} 

override func didReceive(_ message: MSMessage, conversation: MSConversation) { 

    print("message recieved!!") 
    self.pollRecieved = true 

    guard let messageURL = message.url else { return } 
    guard let urlComponents = NSURLComponents(url: messageURL, resolvingAgainstBaseURL: false), let queryItems = urlComponents.queryItems else { return } 

    print("URL Components", urlComponents) 
    print("queryItems", queryItems) 

    for item in queryItems { 
     print("Received \(item.name) with value \(item.value)") 
    } 

    print("attempting segue!") 
    self.performSegue(withIdentifier: "showPollSegue", sender: self) 
} 

func createMessage() { 
    let message = composeMessage(customMessage: "This is really important.", caption: "User-facing caption here") 
    self.activeConversation?.insert(message) 
    print("message here!!", message) 
} 

// segue override 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if(segue.identifier == "showThingSegue") { 
     let vc = segue.destination as! MessagesViewController 
     vc.messageID = "1234567" 
    } 
} 

위대한 작품입니다. 내가 만든 후에 나는 메시지를 사용하여 메시지를 보낼 수 있으며, 메시지를 보내는 사람을 위해 세그 (segue)를 트리거하는 아이폰 시뮬레이터에 의해 수신됩니다.

다른 사람의 스레드에서 메시지를 선택하려고 할 때 문제가 발생합니다. Apple은 확장자를 가진 사용자간에 메시지를주고받는 것을 테스트하기 위해 시뮬레이터에 두 개의 상호 연결된 메시지 스레드를 포함합니다.

수신 된 스레드에서 메시지를 선택하면 Segue가 트리거되지 않습니다. 루트 뷰 컨트롤러의 새로운 복사본을로드하기 만하면됩니다.

내가 원하는 동작은 특정 메시지 인스턴스에 대해 수신 된 정보를 수집하고이 데이터를 사용하여 세그먼트를 트리거하는 것입니다. Apple은이를 위해 다음과 같은 인스턴스 속성을 제공합니다.

여기 API 문서에 selectedMessage 참조 : 질문이 방법이 인스턴스 속성이 https://developer.apple.com/reference/messages/msconversation/1648186-selectedmessage

을 구현한다? 메시지 확장을위한 루트보기 컨트롤러의 onViewDidLoad()에 구현 되었습니까? Apple의 문서는 실제로 메시지 속성 확장자의 수신 된 쪽에서 선택된 메시지의받은 메시지 데이터를 스쿠프하기 위해 인스턴스 속성을 실제로 구현하는 방법에 대해 매우 모호합니다. 누구든지 이것을 구현 했습니까?

고맙습니다! 수신자가 메시지 willBecomeActive가 호출을 선택하고 당신에게 MSConversation를 제공하면

답변

0

이되는 selectedMessage 원하는 분야

override func willBecomeActive(with conversation: MSConversation) { 
    super.willBecomeActive(with: conversation) 
    let message = conversation.selectedMessage 
    ... 
} 

참조 : 팁을위한 Helpful Apple sample

+0

감사합니다! didSelect는 수신 메시지 사용자가 메시지를 선택할 때 트리거되지 않습니다. 메시지가 보낸 사람 기록에서 선택되면 트리거됩니다. 확장 프로그램 내에서 메시지가 선택 될 때마다 트리거되어야합니다. 맞습니까? – thexande

+0

나는 그 방법을 착각했다. 죄송합니다. 답변이 업데이트되었습니다. – shallowThought

+0

xcode가 그 메소드 이름을 인식하지 못하는 것 같습니다. – thexande