{"_id":"@alicloud-emas/httpdns-react-native","name":"@alicloud-emas/httpdns-react-native","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@alicloud-emas/httpdns-react-native","version":"1.0.0","description":"Alibaba Cloud HTTPDNS React Native Plugin","main":"lib/commonjs/index","module":"lib/module/index","types":"lib/typescript/index.d.ts","react-native":"src/index","source":"src/index","scripts":{"test":"jest","typecheck":"tsc --noEmit","lint":"eslint \"**/*.{js,ts,tsx}\"","prepack":"bob build","release":"release-it","example":"npm --prefix example","bootstrap":"npm --prefix example install && npm install","clean":"del-cli android/build example/android/build example/android/app/build example/ios/build"},"keywords":["react-native","ios","android"],"author":{"name":"aliyun"},"license":"MIT","publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"devDependencies":{"@commitlint/config-conventional":"^17.0.2","@evilmartians/lefthook":"^1.2.2","@react-native-community/eslint-config":"^3.0.2","@release-it/conventional-changelog":"^5.0.0","@types/jest":"^28.1.2","@types/react":"~17.0.21","@types/react-native":"0.70.0","commitlint":"^17.0.2","del-cli":"^5.0.0","eslint":"^8.4.1","eslint-config-prettier":"^8.5.0","eslint-plugin-prettier":"^4.0.0","jest":"^28.1.1","pod-install":"^0.1.0","prettier":"^2.0.5","react":"18.2.0","react-native":"0.72.0","react-native-builder-bob":"^0.20.4","release-it":"^15.0.0","typescript":"^4.5.2"},"resolutions":{"@types/react":"17.0.21"},"peerDependencies":{"react":"*","react-native":"*"},"engines":{"node":">= 16.0.0"},"jest":{"preset":"react-native","setupFiles":["./jest.setup.js"],"modulePathIgnorePatterns":["<rootDir>/example/node_modules","<rootDir>/lib/"]},"commitlint":{"extends":["@commitlint/config-conventional"]},"release-it":{"git":{"commitMessage":"chore: release ${version}","tagName":"v${version}"},"npm":{"publish":true},"plugins":{"@release-it/conventional-changelog":{"preset":"angular"}}},"eslintConfig":{"root":true,"extends":["@react-native-community","prettier"],"rules":{"prettier/prettier":["error",{"quoteProps":"consistent","singleQuote":true,"tabWidth":2,"trailingComma":"es5","useTabs":false}]}},"eslintIgnore":["node_modules/","lib/"],"prettier":{"quoteProps":"consistent","singleQuote":true,"tabWidth":2,"trailingComma":"es5","useTabs":false},"react-native-builder-bob":{"source":"src","output":"lib","targets":["commonjs","module",["typescript",{"project":"tsconfig.build.json"}]]},"dependencies":{},"_id":"@alicloud-emas/httpdns-react-native@1.0.0","gitHead":"5c2dab3e5c76328269cb852f0e7103b578aa72a7","_nodeVersion":"24.3.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-+asnwdJC/r08CQSD2qUs4t6KbS4QVeFUiUabn38VOCYl4A202o9ae8mqwaMX9D972iNMzsGmAPWv/2htqPxN9Q==","shasum":"492d0fcfc4127659d898ad947472cf9b4a05b292","tarball":"https://registry.npmjs.org/@alicloud-emas/httpdns-react-native/-/httpdns-react-native-1.0.0.tgz","fileCount":27,"unpackedSize":83877,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCkQIInLl7oLZNCt5QuxpHqlATU/05pkj48LnBZjIxeoAIhAKGJ+lmBzVFUtpxUkf6hXbYCCaz+3SbqAB0hlCJtELX9"}]},"_npmUser":{"name":"zhongyujie","email":"zhongyujie.zyj@alibaba-inc.com"},"directories":{},"maintainers":[{"name":"yn_cr","email":"yannan.cr@alibaba-inc.com"},{"name":"zhongyujie","email":"zhongyujie.zyj@alibaba-inc.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/httpdns-react-native_1.0.0_1777447298804_0.8097525954750813"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-29T07:21:38.669Z","1.0.0":"2026-04-29T07:21:38.934Z","modified":"2026-04-29T07:21:39.211Z"},"maintainers":[{"name":"yn_cr","email":"yannan.cr@alibaba-inc.com"},{"name":"zhongyujie","email":"zhongyujie.zyj@alibaba-inc.com"}],"description":"Alibaba Cloud HTTPDNS React Native Plugin","keywords":["react-native","ios","android"],"author":{"name":"aliyun"},"license":"MIT","readme":"# @alicloud-emas/httpdns-react-native\n\n阿里云 HTTPDNS React Native 插件，封装 Android 和 iOS 原生 HTTPDNS SDK，并提供统一的 JavaScript API。接入后，可以在 React Native 应用中完成 HTTPDNS 初始化、缓存、预解析、IP 优选等能力配置。\n\n插件会接入 React Native 网络请求链路。业务侧继续使用原有 `fetch`、`XMLHttpRequest`，以及默认基于 React Native 网络模块的 `Axios` 请求方式即可，无需手动调用解析接口，也无需自行适配 OkHttp、NSURLSession 等原生网络库。\n\n使用前请先开通 HTTPDNS 服务，并在控制台获取 `AccountId`。如果需要使用鉴权解析或加密解析，请同时准备 `SecretKey` 或 `AESSecretKey`。\n\n## 安装\n\n在 React Native 项目根目录执行：\n\n```bash\nnpm install @alicloud-emas/httpdns-react-native\n```\n\n如果使用 Yarn：\n\n```bash\nyarn add @alicloud-emas/httpdns-react-native\n```\n\n## Android 配置\n\nAndroid 端无需额外原生代码配置。\n\n插件会通过 `ContentProvider` 在应用启动早期自动注入 React Native 网络模块使用的 `OkHttpClient`，并配置自定义 DNS 解析器。业务侧继续使用原有网络请求代码即可。\n\n如果 React Native 应用的 Android release 包开启了代码压缩或混淆（例如 `minifyEnabled true`），请在应用工程的 `android/app/proguard-rules.pro` 中添加：\n\n```txt\n-keep class com.alibaba.sdk.android.**{*;}\n```\n\n## iOS 配置\n\n### 配置 CocoaPods 源\n\nHTTPDNS iOS SDK 和 EMASCurl 发布在阿里云 CocoaPods 源中，请在 iOS 工程的 `Podfile` 顶部添加：\n\n```ruby\nsource 'https://github.com/aliyun/aliyun-specs.git'\nsource 'https://github.com/CocoaPods/Specs.git'\n```\n\n然后执行：\n\n```bash\ncd ios\npod install\n```\n\n### 注入 React Native 网络链路\n\niOS 端需要在 `AppDelegate.m` 或 `AppDelegate.mm` 中调用一次安装方法：\n\n```objective-c\n#import <httpdns-react-native/AliyunHttpDnsRN.h>\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\n{\n  [AliyunHttpDnsRN install];\n\n  // 其他 React Native 初始化代码\n  return YES;\n}\n```\n\n该方法会通过 `RCTSetCustomNSURLSessionConfigurationProvider` 为 React Native 网络请求注入 HTTPDNS。\n\n## 初始化和使用\n\n插件采用先配置、后初始化的模式。以下配置建议在调用 `init` 前设置，`init` 内部会统一应用这些配置并构建 HTTPDNS 服务实例。\n\n```javascript\nimport * as AliyunHttpDns from '@alicloud-emas/httpdns-react-native';\n\nAliyunHttpDns.setLogEnabled(true);\nAliyunHttpDns.setHttpsRequestEnabled(true);\nAliyunHttpDns.setReuseExpiredIPEnabled(true);\n\nawait AliyunHttpDns.init({\n  accountId: 123456,\n  secretKey: 'your_secret_key', // 可选，开启鉴权解析时配置\n});\n```\n\n初始化完成后，可以配置热点域名预解析，减少后续请求的解析时延：\n\n```javascript\nAliyunHttpDns.setPreResolveHosts(['www.aliyun.com'], 'auto');\n```\n\n之后业务侧继续使用原有 React Native 网络请求方式即可：\n\n```javascript\nimport axios from 'axios';\n\n// 使用 fetch\nconst response = await fetch('https://www.aliyun.com');\nconst text = await response.text();\n\n// 使用 Axios\nconst axiosResponse = await axios.get('https://www.aliyun.com');\n```\n\n## 注意事项\n\n1. Android 端通过 `ContentProvider` 自动注入 React Native 网络模块使用的 `OkHttpClient`，无需修改 `MainApplication`，也无需手动适配 OkHttp。\n\n2. iOS 端需要在 `AppDelegate` 中调用 `[AliyunHttpDnsRN install]`。插件会通过 EMASCurl 接入 React Native 网络链路，关于 EMASCurl 的能力，请参考 [EMASCurl](https://github.com/aliyun/alicloud-ios-sdk-emascurl)。\n\n3. 插件在网络请求链路中默认使用同步非阻塞解析：优先返回缓存结果；缓存未命中或无可用结果时，不会长时间阻塞业务请求。\n\n## API\n\n### init\n\n构建 HTTPDNS 服务实例。请确保在使用 HTTPDNS 能力前完成初始化，建议在应用启动阶段调用。React Native 插件会在初始化时将已设置的配置项统一应用到底层 Android/iOS HTTPDNS SDK。\n\n```javascript\nconst success = await AliyunHttpDns.init({\n  accountId: 123456,\n  secretKey: 'your_secret_key', // 可选，开启鉴权解析时配置\n  aesSecretKey: 'your_aes_secret_key', // 可选，开启加密解析时配置\n});\n```\n\n参数：\n\n| 参数名 | 类型 | 是否必须 | 说明 |\n| --- | --- | --- | --- |\n| accountId | number | 必选 | HTTPDNS 账号 ID |\n| secretKey | string | 可选 | 鉴权密钥 |\n| aesSecretKey | string | 可选 | 加密密钥 |\n\n返回值：\n\n| 类型 | 说明 |\n| --- | --- |\n| `Promise<boolean>` | `true` 表示初始化成功，`false` 表示初始化失败 |\n\n### setLogEnabled\n\n本地调试日志开关。可以开启调试日志排查解析相关问题，上线时建议关闭。\n\n```javascript\nAliyunHttpDns.setLogEnabled(true);\n```\n\n### setHttpsRequestEnabled\n\n设置 SDK 内部向服务端发起解析请求时，是否使用 HTTPS 协议。若不调用该接口，默认使用 HTTP 协议。\n\n```javascript\nAliyunHttpDns.setHttpsRequestEnabled(true);\n```\n\n### setPersistentCacheIPEnabled\n\n设置是否启用持久化缓存。持久化缓存功能用于优化启动后的域名解析环节耗时，进而提升首屏加载速度。\n\n开启后，HTTPDNS 会将上一次解析到的结果保存到本地持久层。App 重启后，每个域名首次解析会优先从持久层获取缓存结果，以实现更快的解析效率。\n\n```javascript\nAliyunHttpDns.setPersistentCacheIPEnabled(true);\nAliyunHttpDns.setPersistentCacheIPEnabled(true, 86400);\n```\n\n参数：\n\n| 参数名 | 类型 | 是否必须 | 说明 |\n| --- | --- | --- | --- |\n| enabled | boolean | 必选 | 是否开启持久化缓存 |\n| discardExpiredAfterSeconds | number | 可选 | App 启动后，从本地持久化缓存加载记录到内存缓存时，丢弃过期时间已经超过该时长的记录，单位秒 |\n\n### setReuseExpiredIPEnabled\n\n设置是否允许解析接口返回 TTL 过期的缓存解析结果。\n\n开启后，SDK 在缓存过期时可以先返回已过期的缓存 IP，以减少 DNS 环节处理时间，并刷新该域名的解析结果。\n\n```javascript\nAliyunHttpDns.setReuseExpiredIPEnabled(true);\n```\n\n### setPreResolveAfterNetworkChanged\n\n设置网络环境变化后，是否自动刷新域名解析结果。\n\n当设备网络变化时，SDK 会监听网络变化事件并根据策略处理缓存。开启该功能后，SDK 会在网络切换后自动刷新解析结果，降低域名解析环节耗时，进而提升请求性能。\n\n```javascript\nAliyunHttpDns.setPreResolveAfterNetworkChanged(true);\n```\n\n### setRegion\n\n设置 HTTPDNS 启动服务节点。如果 App 需要在海外环境使用 HTTPDNS，可以主动设置启动服务节点。设置后，SDK 会使用该节点进行域名解析和后续调度节点列表更新。\n\n```javascript\nAliyunHttpDns.setRegion('cn');\n```\n\n取值包括：`cn`、`hk`、`sg`、`de`、`us`。默认无需设置，SDK 内部会根据客户端网络进行调度。\n\n### setTimeoutInterval\n\n设置域名解析请求超时时间，单位为秒。该配置只影响 HTTPDNS SDK 向服务端发起的解析请求，不影响业务网络请求的超时时间。\n\n```javascript\nAliyunHttpDns.setTimeoutInterval(2);\n```\n\n### setIPRankingList\n\n启用 IP 优选。指定域名对应服务的探测端口后，SDK 会对相应域名解析返回的 IP 列表进行 TCP 建连测速，并根据测速结果对 IP 列表进行动态排序。\n\n首次触发 HTTPDNS 解析后立即获得的 IP 列表可能未经排序。该能力适用于对连接时延敏感的域名，启用前建议结合业务流量和服务端负载情况评估。\n\n```javascript\nAliyunHttpDns.setIPRankingList({\n  'www.aliyun.com': 443,\n});\n```\n\n### configCacheTtlChanger\n\n自定义解析结果 TTL。HTTPDNS SDK 默认使用域名解析结果中携带的 TTL 值作为缓存时间。通过该接口可以根据不同域名指定 TTL，从而改变 SDK 对解析结果的缓存时间。\n\n```javascript\nAliyunHttpDns.configCacheTtlChanger({\n  'www.aliyun.com': 300,\n});\n```\n\n### setPreResolveHosts\n\n设置预解析域名列表。在 App 启动并完成 SDK 初始化后，可以调用此接口设置后续可能会使用到的热点域名，以便 SDK 提前解析，减少后续域名解析时请求的时延。\n\n如果在运行过程中调用，SDK 也会立即解析设置的域名列表，从而刷新这些域名的解析结果并记录到缓存中。\n\n```javascript\nAliyunHttpDns.setPreResolveHosts(['www.aliyun.com'], 'auto');\n```\n\n参数：\n\n| 参数名 | 类型 | 是否必须 | 说明 |\n| --- | --- | --- | --- |\n| hosts | string[] | 必选 | 预解析域名列表 |\n| ipType | string | 可选 | `auto`、`ipv4`、`ipv6`、`both`，默认 `auto` |\n\n`hosts` 中应传入纯域名字符串，不要包含协议头、路径或端口。\n\n### getSessionId\n\n获取当前 HTTPDNS 会话 ID。该 ID 可用于问题排查和日志关联。\n\n```javascript\nconst sessionId = await AliyunHttpDns.getSessionId();\n```\n\n返回值：\n\n| 类型 | 说明 |\n| --- | --- |\n| `Promise<string | null>` | 当前会话 ID，未初始化或获取失败时返回 `null` |\n\n### cleanHostCache\n\n清除域名缓存。传入域名列表时，清除指定域名的缓存；不传参数或传入空数组时，清除全部域名缓存。\n\n```javascript\n// 清除全部缓存\nAliyunHttpDns.cleanHostCache();\n\n// 清除指定域名缓存\nAliyunHttpDns.cleanHostCache(['www.aliyun.com']);\n```\n\n### setAuthCurrentTime\n\n校正 App 签名时间。鉴权模式下，如果设备时间不准确，可能导致鉴权校验不通过。调用该接口后，SDK 会根据传入时间校正后续请求的签名时间。\n\n校正操作在 App 的一个生命周期内生效，App 重启后需要重新设置。\n\n```javascript\nconst currentTime = Math.floor(Date.now() / 1000);\nAliyunHttpDns.setAuthCurrentTime(currentTime);\n```\n\n参数 `time` 为 Unix 时间戳，单位为秒。\n","readmeFilename":"README.md","_rev":"1-cd39cf07fc1bafa00df3d5d1e87b27df"}