You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Share Sheet直接向自研聊天应用联系人发送内容并展示联系人

自研消息应用实现Share Sheet分享及联系人展示方案

一、实现Share Sheet直接向应用内联系人发送内容

iOS端实现

  • 配置Info.plist,声明应用支持的分享类型及扩展权限:
    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeName</key>
            <string>Text</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>public.text</string>
            </array>
        </dict>
        <dict>
            <key>CFBundleTypeName</key>
            <string>Image</string>
            <key>LSItemContentTypes</key>
            <array>
                <string>public.image</string>
            </array>
        </dict>
    </array>
    <key>NSExtension</key>
    <dict>
        <key>NSExtensionAttributes</key>
        <dict>
            <key>NSExtensionActivationRule</key>
            <string>TRUEPREDICATE</string>
        </dict>
        <key>NSExtensionMainStoryboard</key>
        <string>MainInterface</string>
        <key>NSExtensionPointIdentifier</key>
        <string>com.apple.share-services</string>
    </dict>
    
  • 创建Share Extension扩展,获取分享内容并传递给主应用:
    // 获取分享文本示例
    let item = extensionContext?.inputItems.first as? NSExtensionItem
    let provider = item?.attachments?.first as? NSItemProvider
    provider?.loadObject(ofClass: NSString.self) { (text, error) in
        if let sharedText = text as? String {
            UserDefaults.standard.set(sharedText, forKey: "SharedContent")
        }
        // 关闭扩展,跳转主应用
        self.extensionContext?.completeRequest(returningItems: [], completionHandler: nil)
    }
    
  • 主应用启动时读取暂存的分享内容,引导用户选择联系人发送。

Android端实现

  • 在AndroidManifest.xml中注册分享接收Activity:
    <activity android:name=".ShareReceiverActivity">
        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="text/plain" />
            <data android:mimeType="image/*" />
        </intent-filter>
    </activity>
    
  • 在接收Activity中获取分享内容,跳转至联系人选择界面:
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val sharedText = intent.getStringExtra(Intent.EXTRA_TEXT)
        val sharedImageUri = intent.getParcelableExtra<Uri>(Intent.EXTRA_STREAM)
        
        // 暂存内容,跳转到联系人列表页
        val intent = Intent(this, ContactListActivity::class.java)
        intent.putExtra("SHARED_TEXT", sharedText)
        intent.putExtra("SHARED_IMAGE_URI", sharedImageUri)
        startActivity(intent)
        finish()
    }
    

二、实现类似WhatsApp的联系人展示方式

核心展示规则

  • 按联系人名称首字母分组排序,侧边添加字母索引栏支持快速定位
  • 高频聊天联系人置顶显示
  • 顶部集成搜索框,支持按名称/手机号筛选联系人
  • 显示联系人头像(无头像时用首字母占位)及在线状态

iOS端实现

  • 使用UITableView实现分组列表,配置侧边索引:
    override func sectionIndexTitles(for tableView: UITableView) -> [String]? {
        return contactSectionTitles // 预先生成的字母分组标题数组
    }
    
    override func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
        return index
    }
    
  • 实现搜索过滤逻辑:
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        filteredContacts = allContacts.filter { 
            $0.name.lowercased().contains(searchText.lowercased()) || 
            $0.phone.contains(searchText)
        }
        tableView.reloadData()
    }
    

Android端实现

  • 用RecyclerView搭配自定义分组Adapter实现字母分组,集成侧边索引栏:
    // 侧边索引栏触摸监听示例
    sideBar.setOnTouchListener { _, event ->
        if (event.action == MotionEvent.ACTION_DOWN || event.action == MotionEvent.ACTION_MOVE) {
            val position = sideBar.getPosition(event.y)
            if (position != -1 && position < contactGroups.size) {
                val group = contactGroups[position]
                val index = contactList.indexOfFirst { it.groupKey == group.key }
                recyclerView.scrollToPosition(index)
            }
        }
        true
    }
    
  • 实现搜索过滤:
    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String?) = false
        override fun onQueryTextChange(newText: String?): Boolean {
            filteredContacts = allContacts.filter {
                it.name.lowercase().contains(newText?.lowercase() ?: "") ||
                it.phone.contains(newText ?: "")
            }
            adapter.notifyDataSetChanged()
            return true
        }
    })
    

内容的提问来源于stack exchange,提问作者gowtham6672

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 01:45:09