android - 如何从 web 视图打开 Android 应用程序链接
问题描述
我有一个可以处理应用链接的应用。
例如,如果您有一个链接,例如https://my-app-domain.com/something,然后单击它,它将启动我的应用程序。
但是,如果该链接是在一个在 web 视图中打开链接的应用程序中发送的,我的应用程序将不会启动。例如,Facebook Messenger、Instagram 和 Snapchat 都在他们自己的 web 视图中打开链接,这会将用户带到我的网站,而不是启动我的应用程序。
我想要做的是让这个链接启动我的应用程序,即使它是在一个在 web 视图中打开链接的应用程序中发送的。
谢谢,
解决方案
就像你说的,Facebook Messenger 不处理应用链接/通用链接。
我一直在尝试,似乎自定义 uri 方案样式链接 (my-app://something) 有效。您可以做的是在https://my-app-domain.com/something上实现网络回退,尝试将浏览器重定向到您的自定义 uri,如果这不起作用,请显示一个漂亮的网页。这就是 Spotify 等大公司的做法。
在 Android 上,您可以通过指定多个意图过滤器来支持应用链接和自定义 uri 方案;
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https"
android:host="my-app-domain"
android:pathPrefix="/something" />
</intent-filter>
<!-- Google claims that one intent-filter can handle multiple <data> elements, this seems to be untrue however -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="my-app" />
</intent-filter>
然后在https://my-app-domain.com/something的网络后备中,你会遇到这种令人作呕的黑客攻击。
<script>
window.location = 'my-app://something'
// optional secondary fallback
setTimeout(() => {window.location = 'https://secondary-fallback'}, 1000)
</script>
结果是,如果您安装了该应用程序,您最终会按预期进入您的应用程序,但如果您不这样做,您最终会进入您的辅助后备页面。
同样的原理也适用于 iOS。我正在使用本机反应,并在我的 AppDelegate.m 中添加了以下内容:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [RCTLinkingManager application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
}
然后在 Info.plist 中指定一个 uri 方案:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>my-app</string>
</array>
</dict>
</array>
推荐阅读
- python - 如何遍历 json 文件并将其作为 Django 中的 HttpRespones 返回?
- javascript - 无法显示属于数组的图像
- ruby-on-rails - Rails 6.1 将不加修改地返回 Content-Type 标头...改用 `#media_type`
- reactjs - 如何在“initialRouteName”抽屉React Native中添加if条件
- swiftui - 在 SwiftUI 中从 UIKit 更新 UIViewRepresentable 大小
- hadoop - WARN util.NativeCodeLoader:无法在 clodera-quickstart-vm 中加载 native-hadoop 库
- c# - Search Expndable Listview 后不展开
- ios - 处理具有多个故事板的导航控制器
- swift - 尝试在 Swift 5 中设置 UISearchController 的背景颜色
- python - 保存时在客户用户创建表单中获取当前用户