如何通过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
相关产品推荐
相关产品推荐

