web-dev-qa-db-ja.com

アプリをiOSの連絡先アプリと統合するにはどうすればよいですか?

IOSの連絡先アプリに統合されたメッセージングアプリを取得しようとしています。これにより、ユーザーは連絡先からアプリ経由でメッセージを直接開始できます。これは WWDC 2016セッション24 で説明されていますが、一部の詳細が省略されているようです。

WWDCの例に従って、私は次のことを行いました。

  • アプリの_Info.plist_にアクティビティタイプを追加しました:

    _<key>NSUserActivityTypes</key>
    <array>
            <string>INSendMessageIntent</string>
    </array>
    _
  • アプリのデリゲートにapplication(_:continue:restorationHandler:)を実装しました。

  • インタラクションを作成して寄付しました

    _let activity = NSUserActivity(activityType: "com.example.message")  
    activity.title = "Send CB Test Message"  
    activity.expirationDate = Date.distantFuture  
    
    let recipient = INPerson( /* recipient with an email address in my Contacts database */ )  
    let sender = INPerson( /* me */ )        
    
    let intent = INSendMessageIntent(recipients: [recipient], content: nil, groupName: nil, serviceName: "CB Test Chat", sender: sender)  
    
    let response = INSendMessageIntentResponse(code: .success, userActivity: activity)
    let interaction = INInteraction(intent: intent, response: response)  
    interaction.direction = .outgoing  
    interaction.donate { (error) in  
        print("Donated")  
        if let error = error {  
            print("Donate error: \(error)")  
        }  
    }  
    _

これの種類が機能します。アプリはオプションとして1人の受信者のカードに連絡先に表示されます。連絡先でタップすると、NSUserActivityでアプリが起動します。それは良いですが、それは十分ではありません。

WWDCセッションでは、例としてWhatsAppを使用しました。 WhatsAppは、WhatsAppアカウントのない連絡先でも、私の連絡先のallのオプションとして表示されます。 WhatsAppが作成し、すべての人のためのインタラクションを寄付したのではないかと思いました。しかし、WhatsAppが実行されていないときに新しい連絡先を作成すると、それはすぐにその連絡先のオプションになります。受信者の引数をnilまたは空の配列に設定して少し実験しましたが、効果はありませんでした。

ここで何が欠けているのですか?近いかしら?しかし、それは私が実際に必要なものではない相互作用の寄付のようです。

@Markへの応答として更新:activityの使用を明確化。私はresponseactivityを使用)とresponseにnil値を使用してこれを試しましたが、どちらも機能しませんでした。

40
Tom Harrington

WWDC 2019でこれについて質問したところ、この種の寄付はVOIPアプリでのみ機能し、メッセージングアプリでは機能しないと言われました。この質問のコードは、理論的にはVOIPで機能します。適切な種類のアプリで作業していないため、試したことはありません。

1
Tom Harrington

単にUIActivityViewControllerを使用します。テキストまたは任意のオブジェクトでインスタンス化できます。必要な場合は、メッセージング以外のすべてのタイプを除外することもできます。

let objectsToShare = [textToShare, otherObject] as [Any]
            let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)

        //New Excluded Activities Code
        activityVC.excludedActivityTypes = [UIActivityType.addToReadingList]
        //

        activityVC.popoverPresentationController?.sourceView = sender as? UIView
        self.present(activityVC, animated: true, completion: nil)
1
Ron Jones Jr