”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 掌握 React Native 中的深度链接和通用链接:OpenGraph Share 和 Node.js 集成

掌握 React Native 中的深度链接和通用链接:OpenGraph Share 和 Node.js 集成

发布于2024-11-07
浏览:150

设想

假设您有一个名为 ShopEasy 的电子商务应用程序,并且您希望点击电子邮件、消息或社交媒体中的产品链接的用户被直接重定向到应用程序中的相关产品页面,而不是网站。


步骤1:在nodejs服务器中进行Opengraph配置以进行链接预览:

Mastering Deep Linking and Universal Links in React Native: OpenGraph Share & Node.js Integration

Open Graph 是 Web 开发人员使用的一种协议,用于控制在 Facebook、Twitter、LinkedIn 等社交媒体平台上共享时 URL 的表示方式。通过在网页的 HTML 中使用 Open Graph 标签,您可以指定当用户共享链接时预览中将显示哪些内容。

要在 React Native 应用程序中使用这些 OpenGraph 标签,您需要使用深层链接或通用链接来处理服务器的链接(例如 https://ShopEasy.com/${type}/${id})。当用户分享这些链接时,Facebook、Twitter 或 iMessage 等平台将根据您定义的 OpenGraph 标签自动显示内容预览。

/routes/share.js

const express = require('express');
const app = express();
const path = require('path');

// Serve static files (e.g., images, CSS, JavaScript)
app.use(express.static(path.join(__dirname, 'public')));

// Route to serve the OpenGraph meta tags
app.get('/:type/:id', (req, res) => { // type: product/category
    const productId = req.params.id;

    // Fetch product details from a database or API (placeholder data for this example)
    const product = {
        id: productId,
        name: 'Sample Product',
        description: "'This is a sample product description.',"
        imageUrl: 'https://ShopEasy.com/images/sample-product.jpg',
        price: '$19.99',
    };

    // Serve HTML with OpenGraph meta tags
    res.send(`
        
        
        
            ${product.name}

${product.name}

${product.description}

${product.name}

Price: ${product.price}

`); }); // Start the server const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on http://localhost:${PORT}`); });

第 2 步:iOS 设置和配置:

a) (用于生产) 准备 apple-app-site-association 文件

apple-app-site-association (AASA) 文件是一个 JSON 文件,它告诉 iOS 哪些 URL 应打开您的应用程序。以下是您为电子商务应用程序进行设置的方法:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appIDs": ["ABCDE12345.com.shopeasy.app"],
                "paths": [
                    "/product/*",
                    "/category/*",
                    "/cart",
                    "/checkout"
                ]
            }
        ]
    }
}
  • appID: 您的应用程序的标识符,将您的 Apple 团队 ID (ABCDE12345) 与应用程序的捆绑包标识符 (com.shopeasy.app) 相结合。
  • paths:您的网站上应在您的应用程序中打开的路径。
  • /product/*:任何产品页面(例如 https://www.shopeasy.com/product/123)都应在应用程序中打开。
  • /category/*:任何类别页面(例如 https://www.shopeasy.com/category/shoes)。
  • /cart 和 /checkout:用户的购物车和结帐页面也应该在应用程序中打开。

b) (用于生产) 托管 apple-app-site-association 文件

构建关联文件后,将其放置在站点的 .well-known 目录中。文件的 URL 应符合以下格式:

https:///.well-known/apple-app-site-association(例如:https://www.shopeasy.com/.well-known/apple-app-site-association )
您必须使用带有有效证书且不带重定向的 https:// 托管文件。

c) 在 Xcode 中启用关联域

i) 打开 Xcode:
在 Xcode 中打开您的 ShopEasy 项目。

ii) 添加关联域功能:
转到“签名和功能”选项卡。
单击“ ”按钮并添加“关联域”。

iii) 添加您的域名:
在“关联域”部分下,添加前缀为 applinks:.
的域 例如:
:
i) 服务应用链接:用于深度链接和应用程序到 Web 的交互,允许您的应用程序直接处理特定的 URL。
ii) 服务网络凭证:用于启用自动填充凭证,允许用户在您的应用程序和网站上无缝使用保存的密码。
Mastering Deep Linking and Universal Links in React Native: OpenGraph Share & Node.js Integration

对于开发人员:

applinks:shopeasy
webcredentials:shopeasy

用于生产:

applinks:shopeasy.com
webcredentials:shopeasy.com

d)(ref) 在 Info.plist 中配置 URL 方案:(当您想要通过不一定是 Web URL 的链接打开应用程序时,URL 方案非常有用,允许在应用程序内进行深层链接或从另一个应用程序启动它。)

在哪里:
CFBundleURLName:URL 方案的人类可读名称。这可以是任何描述性字符串。
CFBundleURLSchemes:您的应用程序支持的实际 URL 方案。它应该是一个唯一的字符串,如 shopeasy/showeasy.com(如果是生产集)。

    
...
        CFBundleTypeRoleEditorCFBundleURLNameshopeasyCFBundleURLSchemesshopeasy

d) 在 AppDelegate.mm 中:

#import 

// ...
// Add Below Code for DeepLinks

- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary *)options
{
return [RCTLinkingManager application:application openURL:url options:options];
}


- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity
restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler
{
return [RCTLinkingManager application:application
continueUserActivity:userActivity
restorationHandler:restorationHandler];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [RCTLinkingManager application:application openURL:url
sourceApplication:sourceApplication annotation:annotation];
}

//DEEP LINKS TILL HERE

@end

e) 测试深度链接设备:

这应该打开应用程序。

npx uri-scheme open "shopeasy://product/mobile" --ios

或者

xcrun simctl openurl booted "shopeasy://product/mobile"

第 3 步:Android 设置和配置:

i) 在 AndroidManifest.xml 中:

    />

ii) 检查 android:
adb shell am start -W -a android.intent.action.VIEW -d "shopeasy://product/apple" com.shopeasy
或者
如果路由有效,请在模拟器中单击此链接:
http://localhost:3000/share/product/iphone


第 3 步:在 React Native 应用程序中使用:

Navigation.jsx

import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import MainNavigator from './MainNavigator';
import { navigationRef } from '../utils/NavigationUtil';

const config = {
  screens: {
    ProductScreen: '/product/:id',
    CategoryScreen: '/category/:name',
  },
};

const linking = {
  prefixes: ['shopeasy://', 'https://shopeasy.com', 'http://localhost:3000'], 
  config,
};

const Navigation: React.FC = () => {
  return (
    
  );
};

export default Navigation;

App.jsx

  useEffect(() => {
    // Retrieve the initial URL that opened the app (if any) and handle it as a deep link.
    Linking.getInitialURL().then(url => {
      handleDeepLink({ url }, 'CLOSE'); // Pass the URL and an action ('CLOSE') to handleDeepLink function.
    });

    // Add an event listener to handle URLs opened while the app is already running.
    Linking.addEventListener('url', event => handleDeepLink(event, 'RESUME'));
    // When the app is resumed with a URL, handle it as a deep link with the action ('RESUME').

    // Cleanup function to remove the event listener when the component unmounts.
    return () => {
      Linking.removeEventListener('url', event => handleDeepLink(event, 'RESUME'));
    };
  }, []);

CLOSE/RESUME 是可选的,并根据要求传递句柄。

版本声明 本文转载于:https://dev.to/ajmal_hasan/mastering-deep-linking-and-universal-links-in-react-native-opengraph-share-nodejs-integration-4ppa?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • PHP 可以像 JavaScript 一样将函数作为参数传递吗?
    PHP 可以像 JavaScript 一样将函数作为参数传递吗?
    在 PHP 中将函数作为参数传递将函数作为数据元素进行操作是现代编程中常用的一种通用技术。一个这样的例子是将函数作为参数传递,这是 5.3 之前的 PHP 版本中不容易使用的功能。现在,我们深入研究此功能,探索何时以及如何使用它。问题: 函数可以在 PHP 中作为参数传递吗,类似于 JavaScri...
    编程 发布于2024-11-07
  • 反思 GSoC 4
    反思 GSoC 4
    Achievements, Lessons, and Tips for Future Success An exciting summer has come to a close for stdlib with our first participation in Google Summer of...
    编程 发布于2024-11-07
  • 在 Go 中如何将字节数组转换为有符号整数和浮点数?
    在 Go 中如何将字节数组转换为有符号整数和浮点数?
    Go 中将字节数组转换为有符号整数和浮点数在 Go 中,二进制包提供了从 []byte 转换无符号整数的函数数组,例如binary.LittleEndian.Uint16()和binary.BigEndian.Uint32()。然而,有符号整数或浮点数没有直接等价物。缺少有符号整数转换函数的原因缺少...
    编程 发布于2024-11-07
  • 如何修复 Java + MySQL UTF-8 编码问题:为什么我的特殊字符显示为问号?
    如何修复 Java + MySQL UTF-8 编码问题:为什么我的特殊字符显示为问号?
    Java MySQL UTF-8 编码问题您提到了使用 Java 和 MySQL 时经常遇到的问题,其中存储了特殊字符作为问号(“?”)。当 MySQL 数据库、表和列设置为使用 UTF-8 字符编码,但 JDBC 连接未正确配置时,就会出现此问题。在您的代码中,在建立与数据库的连接时,您可以指定附...
    编程 发布于2024-11-07
  • 令牌桶算法:流量管理必备指南
    令牌桶算法:流量管理必备指南
    令牌桶算法是控制网络流量、确保公平带宽使用和防止网络拥塞的流行机制。它的运作原理很简单,即根据令牌可用性来调节数据传输,其中令牌代表发送一定量数据的权利。该算法对于维护各种系统(包括网络、API 和云服务)中的流量至关重要,提供了一种在不造成资源过载的情况下管理流量的方法。 令牌桶算法如何工作 令...
    编程 发布于2024-11-07
  • 如何为您的 Python 项目选择最佳的 XML 库?
    如何为您的 Python 项目选择最佳的 XML 库?
    Python 中的 XML 创建:库和方法综合指南在 Python 中创建 XML 文档时,开发人员可以选择各种库选项处理。最流行和最直接的选择是 ElementTree API,它是 Python 标准库自 2.5 版以来不可或缺的一部分。ElementTree:高效选项ElementTree 提...
    编程 发布于2024-11-07
  • 如何使用多个字段对 Java 中的对象列表进行排序?
    如何使用多个字段对 Java 中的对象列表进行排序?
    Java 中具有多个字段的列表对象的自定义排序虽然基于一个字段对列表中的对象进行排序很简单,但使用多个字段进行排序可能有点棘手。本文深入研究按多个字段排序的问题,并探讨 Java 中可用的各种解决方案。问题考虑一个场景,其中您有一个包含三个字段的“Report”对象列表:ReportKey、学号和学...
    编程 发布于2024-11-07
  • 如何使用递归从具有父类别的数据库生成嵌套菜单树?
    如何使用递归从具有父类别的数据库生成嵌套菜单树?
    菜单树生成的递归在您的情况下,您有一个数据库结构,其中类别有一个“根”字段指示其父类别。您想要的 HTML 输出涉及表示类别层次结构的嵌套列表。为此,可以使用递归 PHP 函数。这是一个示例函数:function recurse($categories, $parent = null, $level...
    编程 发布于2024-11-07
  • Array_column 函数可以用于对象数组吗?
    Array_column 函数可以用于对象数组吗?
    将 array_column 与对象数组一起使用本题探讨了将 array_column 函数与由对象组成的数组一起使用的可行性。开发人员实现了 ArrayAccess 接口,但发现它没有任何影响。PHP 5在 PHP 7 之前,array_column 本身不支持对象数组。要解决此限制,可以使用替代...
    编程 发布于2024-11-07
  • HashMap 实际应用:应对常见的 Java 面试挑战
    HashMap 实际应用:应对常见的 Java 面试挑战
    技术面试通常会提出一些问题来测试您对集合的理解,尤其是HashMaps。一个常见的挑战涉及计算列表中元素的出现次数。这个问题可以帮助面试官评估您有效处理数据聚合并避免NullPointerException等陷阱的能力。 如果您是 HashMap 新手,在深入研究本文之前,您可能需要查看我的破解...
    编程 发布于2024-11-07
  • SQL中什么情况下事务不会自动回滚?
    SQL中什么情况下事务不会自动回滚?
    自动事务回滚问题围绕着 START TRANSACTION 包含的 SQL 语句块中发生错误时事务的行为提交交易。 OP注意到,当COMMIT TRANSACTION语句之前遇到语法错误时,事务会自动回滚。事务回滚机制不,事务不会回滚遇到错误立即返回。然而,某些客户端应用程序可能会采用特定的错误处理...
    编程 发布于2024-11-07
  • 如何使用数组函数将字符串转换为关联数组?
    如何使用数组函数将字符串转换为关联数组?
    使用数组函数将字符串转换为关联数组在 PHP 中,经常需要将包含键值对的字符串转换为关联数组关联数组。考虑像“1-350,9-390.99”这样的字符串,其中每个元素由连字符和逗号分隔。目标是创建一个关联数组,其中每个元素中的第一个数字成为键,第二个数字成为值。可以使用 PHP 的内置数组函数有效地...
    编程 发布于2024-11-07
  • 了解无冲突复制数据类型
    了解无冲突复制数据类型
    无冲突复制数据类型 (CRDT) 是一类数据结构,可在分布式系统中实现无缝协作和数据同步,从而实现无冲突的协作更新。 CRDT 旨在实现跨多个数据副本的最终一致性,确保即使更新独立发生,所有副本也能收敛到相同状态,而不需要复杂的冲突解决机制。 在这篇博文中,我们将深入研究 CRDT 是什么,探索它们...
    编程 发布于2024-11-07
  • 如何在 PyQt 应用程序中正确利用 QThreads?
    如何在 PyQt 应用程序中正确利用 QThreads?
    在 PyQt 应用程序中使用 QThreads 的最佳实践使用 QThreads 允许在 PyQt 应用程序中进行多线程处理,从而实现任务分离并提高响应能力。然而,理解适当的技术至关重要。重新实现 Run 方法的不适当性正如参考博客文章中提到的,重新实现 run 方法是不是使用 QThreads 的...
    编程 发布于2024-11-07
  • 轻松掌握双向一对一关系:提升 Spring Data JPA 效率
    轻松掌握双向一对一关系:提升 Spring Data JPA 效率
    释放双向一对一关系的力量 在本深入指南中,我们将探讨相互一对一关联、CRUD 操作的复杂性,以及在高效数据建模中mappedBy、@JsonManagedReference 和 @JsonBackReference 的作用。 理解相互的一对一关联 简化 CRUD 操作 mappedBy 的重要性 揭...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3