如何在Xamarin.Forms中唤起Facebook应用打开指定搜索链接
Xamarin.Forms 跨平台打开Facebook搜索链接实现方案
整体实现逻辑基于Xamarin.Forms依赖服务完成双端适配,优先拉起已安装的Facebook主应用/Facebook Lite应用,未检测到对应应用时自动跳转默认浏览器打开目标页面。
共享层接口定义
在共享项目中定义跨平台调用的服务接口,后续通过DependencyService完成双端具体实现的调用:
public interface IFacebookLaunchService { /// <summary> /// 打开Facebook用户搜索页 /// </summary> /// <param name="searchName">要搜索的用户名称</param> Task OpenPeopleSearchPage(string searchName); }
Android端实现
- 核心逻辑:依次检测设备是否安装Facebook主应用(包名
com.facebook.katana)、Facebook Lite应用(包名com.facebook.lite),存在对应应用时通过Facebook私有Schemefb://search/people/?q={搜索词}拉起应用内搜索页,均未安装时通过系统默认浏览器打开移动端网页链接。 - 具体实现代码:
[assembly: Dependency(typeof(FacebookLaunchDroidService))] namespace YourApp.Droid.Services { public class FacebookLaunchDroidService : IFacebookLaunchService { private const string FbMainPackage = "com.facebook.katana"; private const string FbLitePackage = "com.facebook.lite"; public Task OpenPeopleSearchPage(string searchName) { var encodedName = Uri.EscapeDataString(searchName); var webTarget = $"https://m.facebook.com/search/people/?q={encodedName}"; var appTarget = $"fb://search/people/?q={encodedName}"; var appIntent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(appTarget)); appIntent.AddFlags(ActivityFlags.NewTask); // 优先拉起主应用 if (CheckAppInstalled(FbMainPackage)) { appIntent.SetPackage(FbMainPackage); Application.Context.StartActivity(appIntent); return Task.CompletedTask; } // 次选拉起Lite版 if (CheckAppInstalled(FbLitePackage)) { appIntent.SetPackage(FbLitePackage); Application.Context.StartActivity(appIntent); return Task.CompletedTask; } // fallback到默认浏览器 var browserIntent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(webTarget)); browserIntent.AddFlags(ActivityFlags.NewTask); Application.Context.StartActivity(browserIntent); return Task.CompletedTask; } private bool CheckAppInstalled(string packageName) { try { Application.Context.PackageManager.GetPackageInfo(packageName, PackageInfoFlags.Activities); return true; } catch { return false; } } } }
- 配置要求:Android 11及以上版本需要在
AndroidManifest.xml中添加包可见性查询声明,否则无法正常检测应用安装状态:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...> <!-- 其他原有配置 --> <queries> <package android:name="com.facebook.katana" /> <package android:name="com.facebook.lite" /> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https" /> </intent> </queries> </manifest>
iOS端实现
- 核心逻辑:检测设备是否可通过Facebook的URL Scheme
fb://拉起应用,可拉起则直接跳转到应用内搜索页,否则调用Safari打开网页链接。iOS端App Store无公开上线的Facebook Lite正式版本,无需额外适配Lite版。 - 前置配置:需要在
Info.plist中添加Scheme白名单,否则iOS 9及以上版本无法检测Facebook应用安装状态:
<key>LSApplicationQueriesSchemes</key> <array> <string>fb</string> </array>
- 具体实现代码:
[assembly: Dependency(typeof(FacebookLaunchIosService))] namespace YourApp.iOS.Services { public class FacebookLaunchIosService : IFacebookLaunchService { public Task OpenPeopleSearchPage(string searchName) { var encodedName = Uri.EscapeDataString(searchName); var webTarget = new NSUrl($"https://m.facebook.com/search/people/?q={encodedName}"); var appTarget = new NSUrl($"fb://search/people/?q={encodedName}"); if (UIApplication.SharedApplication.CanOpenUrl(appTarget)) { UIApplication.SharedApplication.OpenUrl(appTarget); } else { UIApplication.SharedApplication.OpenUrl(webTarget); } return Task.CompletedTask; } } }
共享层调用示例
在Xamarin.Forms页面/ViewModel中直接通过依赖服务调用即可:
await DependencyService.Get<IFacebookLaunchService>().OpenPeopleSearchPage("要搜索的用户名");
内容的提问来源于stack exchange,提问作者Costas
相关产品推荐
相关产品推荐

