」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 掌握 React Native 中的深度連結和通用連結:OpenGraph Share 和 Node.js 集成

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

發佈於2024-11-07
瀏覽:468

设想

假设您有一个名为 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如有侵犯,請聯絡study_golang @163.com刪除
最新教學 更多>
  • C++11 的 `string::c_str()` 仍然以 Null 終止嗎?
    C++11 的 `string::c_str()` 仍然以 Null 終止嗎?
    C 11 的 string::c_str() 是否消除空終止? 在C 11 中,string::c_str 不再保證產生一個空終止的string.原因:在C 11 中, string::c_str 定義為與string::data 相同,而string::data 又被定義為等價於*( begin(...
    程式設計 發佈於2024-11-07
  • Effect-TS 中的壓縮選項:實用指南
    Effect-TS 中的壓縮選項:實用指南
    Effect-TS 中的壓縮選項:實用指南 在函數式程式設計中,以安全且可預測的方式組合多個可選值(表示為選項)是一項常見任務。 Effect-TS 提供了多種將選項「壓縮」在一起的方法,讓您可以組合它們的值或根據特定規則選擇一個。在本文中,我們將探討壓縮選項的三個關鍵函數:O.z...
    程式設計 發佈於2024-11-07
  • 提升你的 JavaScript:深入研究物件導向程式設計✨
    提升你的 JavaScript:深入研究物件導向程式設計✨
    面向对象编程 (OOP) 是一种强大的范例,它彻底改变了我们构建和组织代码的方式。 虽然 JavaScript 最初是一种基于原型的语言,但它已经发展到接受 OOP 原则,特别是随着 ES6 的引入和后续更新。 这篇文章深入研究了 JavaScript 中 OOP 的核心概念,探索如何实现它们来...
    程式設計 發佈於2024-11-07
  • 如何在 Go 中擷取多個引用組:正規表示式解決方案
    如何在 Go 中擷取多個引用組:正規表示式解決方案
    在Go 中捕獲多個引用組本文解決了解析遵循特定格式的字符串的挑戰:大寫命令後跟可選引用的論點。目標是將命令和參數提取為單獨的字串。 要處理此任務,需要使用正規表示式: re1, _ := regexp.Compile(([A-Z] )(?: " (1) ")*)。第一個捕獲組([...
    程式設計 發佈於2024-11-07
  • 從初學者到建構者:掌握 PHP 程式設計藝術
    從初學者到建構者:掌握 PHP 程式設計藝術
    想要學PHP程式設計?逐步指南幫您輕鬆入門!首先,安裝PHP([官方網站](https://www.php.net/))。掌握變數、條件語句和迴圈等基本語法。透過建立一個簡單的登入表單來實踐:提交表單後,處理輸入並驗證憑證。透過這些步驟和練習,您將掌握PHP程式設計的基礎知識。 PHP程式設計入門指...
    程式設計 發佈於2024-11-07
  • 使用 HTML、CSS 和 JavaScript 建立簡單的密碼管理器
    使用 HTML、CSS 和 JavaScript 建立簡單的密碼管理器
    您是否厭倦了使用弱密碼或忘記登入憑證?在本教程中,我們將使用 HTML、CSS 和 JavaScript 建立一個簡單的密碼管理器。此密碼管理器將允許您安全地儲存您的登入憑證並在需要時檢索它們。 代碼:這裡
    程式設計 發佈於2024-11-07
  • 為什麼在向 Spring MVC 控制器發送 JSON 請求時收到 406(不可接受)錯誤?
    為什麼在向 Spring MVC 控制器發送 JSON 請求時收到 406(不可接受)錯誤?
    Spring JSON 請求返回406(不可接受)當嘗試向Spring MVC 控制器發送JSON 請求時,一些用戶遇到“ 406 不可接受」錯誤。此問題源自於請求的內容類型(“application/json”)與控制器的回應能力不符。 在 Spring MVC 中,控制器方法以「@Respons...
    程式設計 發佈於2024-11-07
  • 如何在 Chrome DevTools 中輕鬆識別和監控表單元素事件?
    如何在 Chrome DevTools 中輕鬆識別和監控表單元素事件?
    了解元素互動觸發的事件要在可自訂表單元素上正確識別和處理事件,必須了解互動時觸發的特定事件。 Chrome DevTools 提供了一個強大的工具,monitorEvents,來協助完成此過程。 使用monitorEvents()檢查目標元素: 右鍵單擊該元素並選擇“Inspect”或在DevToo...
    程式設計 發佈於2024-11-07
  • 不到一分鐘即可完成帶有身份驗證和用戶面板的 Laravel + React 項目
    不到一分鐘即可完成帶有身份驗證和用戶面板的 Laravel + React 項目
    我最近在X 上發布了一個視頻,其中我在不到一分鐘的時間內設置了一個帶有身份驗證和用戶個人資料頁面的Laravel React專案!我認為為任何喜歡遵循詳細指南的人分享書面版本會很有幫助。 在本指南中,我將向您展示如何使用React 前端和內建身份驗證快速設定新的Laravel 項目,所有這些都使用...
    程式設計 發佈於2024-11-07
  • Django 請求生命週期解釋
    Django 請求生命週期解釋
    In the world of web development, understanding the request life cycle is crucial for optimizing performance, debugging issues, and building robust app...
    程式設計 發佈於2024-11-07
  • 使用 OpenVINO 和 Postgres 建立快速且有效率的語意搜尋系統
    使用 OpenVINO 和 Postgres 建立快速且有效率的語意搜尋系統
    照片由 real-napster 在 Pixabay上拍摄 在我最近的一个项目中,我必须构建一个语义搜索系统,该系统可以高性能扩展并为报告搜索提供实时响应。我们在 AWS RDS 上使用 PostgreSQL 和 pgvector,并搭配 AWS Lambda 来实现这一目标。面临的挑战是允许用户...
    程式設計 發佈於2024-11-07
  • 如何消除 Matplotlib 大數字刻度標籤中的相對偏移?
    如何消除 Matplotlib 大數字刻度標籤中的相對偏移?
    刪除Matplotlib 軸中的相對偏移在Matplotlib 中針對大量數字進行繪圖可能會導致軸的刻度標籤出現相對偏移。為了說明這一點,請考慮以下繪圖:plot([1000, 1001, 1002], [1, 2, 3])這會在橫座標軸上產生刻度,如下圖所示:0.0 0.5 1.0...
    程式設計 發佈於2024-11-07
  • 為什麼 Python 正規表示式中有時會缺少 \'r\' 前綴?
    為什麼 Python 正規表示式中有時會缺少 \'r\' 前綴?
    Python 正規表示式:「r」前綴之謎在Python 正規表示式領域,神秘的「r」前綴經常引發人們對其必要性的質疑。為了闡明這個主題,讓我們深入研究一個令人費解的場景:丟失“r”的奇怪案例示例1 提出了一個令人費解的觀察結果:import re print(re.sub('\s ', ' ', '...
    程式設計 發佈於2024-11-07
  • 如何在沒有資料庫的情況下根據第一個下拉選擇自動更新下拉選項?
    如何在沒有資料庫的情況下根據第一個下拉選擇自動更新下拉選項?
    如何在不使用資料庫的情況下根據第一個下拉清單中的選擇自動更新第二個下拉清單中的選項您有兩個下拉列表,其中選項不是從資料庫中檢索的。第一個下拉清單允許使用者選擇一個類別。第二個下拉清單中的選項取決於第一個下拉清單中的選擇。 例如,如果使用者在第一個下拉清單中選擇First 選項,第二個下拉清單應顯示選...
    程式設計 發佈於2024-11-07
  • C 中的頭文件
    C 中的頭文件
    什麼是頭文件 C 中的頭文件是帶有「.h」副檔名的文件,其中包含函數、巨集、常數的聲明,有時還包含可以在多個原始檔之間共享的資料類型。 預處理器指令 預處理器指令是程式中的一行,它不是程式語句,而是實際上預處理器的命令。 例如:- #包括 #定義 在此指令中,#...
    程式設計 發佈於2024-11-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3