{"_id":"@bluesyoung/app-launcher","_rev":"2-2dfc2bc459b47b22313e5f642e7ab034","name":"@bluesyoung/app-launcher","dist-tags":{"latest":"1.2.1"},"versions":{"1.1.7":{"name":"@bluesyoung/app-launcher","version":"1.1.7","keywords":["call-app","app-launcher","browser","mobile","deeplink","url-scheme","universal-links"],"author":{"name":"BluesYoung-web"},"license":"MIT","_id":"@bluesyoung/app-launcher@1.1.7","maintainers":[{"name":"bluesyoung","email":"15171255945@163.com"}],"homepage":"https://github.com/BluesYoung-web/app-launcher#readme","bugs":{"url":"https://github.com/BluesYoung-web/app-launcher/issues"},"dist":{"shasum":"54dbc7cd2795579d1e064d08e2f8cf82b8847e8b","tarball":"https://registry.npmjs.org/@bluesyoung/app-launcher/-/app-launcher-1.1.7.tgz","fileCount":31,"integrity":"sha512-/k4AB3GIfzUJiwF72p3VMZHcgP8pBIi8gwTjV+EAPkISYMnG8Vn7WGwJ1iwESyJpRPMIyUauWghOIHSCUbAf7Q==","signatures":[{"sig":"MEYCIQDftPW2fvp6IfaEP57OClJCCaOzFCPMlAgebnNdODnTvAIhAIV4q/C8D3Fjdhez7xAXuu5mwSFSQ48qW4gF2NBedM7N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bluesyoung%2fapp-launcher@1.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":184856},"main":"dist/index.es.js","types":"dist/index.d.ts","module":"dist/index.es.js","gitHead":"9912131188c35b2ebbf05bee6d0ae640dff09ba8","scripts":{"dev":"vite --host","lint":"eslint","test":"vitest","build":"vite build","test:ui":"vitest --ui","lint:fix":"eslint --fix","postinstall":"node ./init.mjs","test:coverage":"vitest --coverage","prepublishOnly":"pnpm run build"},"_npmUser":{"name":"bluesyoung","email":"15171255945@163.com"},"repository":{"url":"git+https://github.com/BluesYoung-web/app-launcher.git","type":"git"},"_npmVersion":"10.8.2","description":"一个用于在浏览器中唤起移动端App的NPM包，支持多种平台和智能策略","directories":{},"lint-staged":{"*":"eslint --fix"},"_nodeVersion":"20.19.5","dependencies":{"defu":"^6.1.4"},"publishConfig":{"registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^4.0.0","jsdom":"^22.0.0","eslint":"^9.35.0","terser":"^5.44.0","vitest":"^0.34.0","@vitest/ui":"^0.34.0","typescript":"^5.0.0","@types/node":"^20.0.0","lint-staged":"^16.1.6","vite-plugin-dts":"^3.0.0","simple-git-hooks":"^2.13.1","@vitest/coverage-v8":"^0.34.0","@antfu/eslint-config":"^5.3.0"},"simple-git-hooks":{"pre-commit":"pnpm lint-staged"},"_npmOperationalInternal":{"tmp":"tmp/app-launcher_1.1.7_1760604425400_0.6335016479876026","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@bluesyoung/app-launcher","version":"1.2.1","description":"一个用于在浏览器中唤起移动端App的NPM包，支持多种平台和智能策略","author":{"name":"BluesYoung-web"},"license":"MIT","homepage":"https://github.com/BluesYoung-web/app-launcher#readme","repository":{"type":"git","url":"git+https://github.com/BluesYoung-web/app-launcher.git"},"bugs":{"url":"https://github.com/BluesYoung-web/app-launcher/issues"},"keywords":["call-app","app-launcher","browser","mobile","deeplink","url-scheme","universal-links"],"main":"dist/index.es.js","module":"dist/index.es.js","types":"dist/index.d.ts","scripts":{"build":"vite build","dev":"vite --host","test":"vitest","test:coverage":"vitest --coverage","test:ui":"vitest --ui","lint":"eslint","lint:fix":"eslint --fix","prepublishOnly":"pnpm run build","postinstall":"node ./init.mjs"},"dependencies":{"defu":"^6.1.4"},"devDependencies":{"@antfu/eslint-config":"^5.3.0","@types/node":"^20.0.0","@vitest/coverage-v8":"^0.34.0","@vitest/ui":"^0.34.0","eslint":"^9.35.0","jsdom":"^22.0.0","lint-staged":"^16.1.6","simple-git-hooks":"^2.13.1","terser":"^5.44.0","typescript":"^5.0.0","vite":"^4.0.0","vite-plugin-dts":"^3.0.0","vitest":"^0.34.0"},"simple-git-hooks":{"pre-commit":"pnpm lint-staged"},"lint-staged":{"*":"eslint --fix"},"publishConfig":{"registry":"https://registry.npmjs.org/","provenance":true},"_id":"@bluesyoung/app-launcher@1.2.1","gitHead":"e477a3727178d8c895f911089422538c69dcdf16","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-Y/w2YT/hUE3FkkC+QB4nd08ml9i2W3hcyKt2BSVYn64oneecX5HIc61pGCQzwKpS89i8Jm/lG+v1ykoAY1+aeA==","shasum":"fa93897c4f0349fc5a9e30f75a877bbab3ba5772","tarball":"https://registry.npmjs.org/@bluesyoung/app-launcher/-/app-launcher-1.2.1.tgz","fileCount":31,"unpackedSize":186974,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bluesyoung%2fapp-launcher@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIHVahMcRvpiAEikjrPaZzeMu9SQiUZUN8W9PWQ4qWIGQAiAJSsv+lHP7y7vVo/+fsDP0dyZn+9PtngT1lMOiairCAA=="}]},"_npmUser":{"name":"bluesyoung","email":"15171255945@163.com"},"directories":{},"maintainers":[{"name":"bluesyoung","email":"15171255945@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/app-launcher_1.2.1_1775615079093_0.03346446363318467"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-16T08:47:05.276Z","modified":"2026-04-08T02:24:39.608Z","1.1.7":"2025-10-16T08:47:05.620Z","1.2.1":"2026-04-08T02:24:39.274Z"},"bugs":{"url":"https://github.com/BluesYoung-web/app-launcher/issues"},"author":{"name":"BluesYoung-web"},"license":"MIT","homepage":"https://github.com/BluesYoung-web/app-launcher#readme","keywords":["call-app","app-launcher","browser","mobile","deeplink","url-scheme","universal-links"],"repository":{"type":"git","url":"git+https://github.com/BluesYoung-web/app-launcher.git"},"description":"一个用于在浏览器中唤起移动端App的NPM包，支持多种平台和智能策略","maintainers":[{"name":"bluesyoung","email":"15171255945@163.com"}],"readme":"# App Luancher\n\n一个用于在浏览器中唤起移动端App的NPM包，支持多种平台和智能策略。\n\n[![](https://img.shields.io/badge/Author-BluesYoung--web-blue)](https://gitee.com/BluesYoung-web)\n\n[![code style](https://antfu.me/badge-code-style.svg)](https://github.com/antfu/eslint-config)\n\n\n## ✨ 特性\n\n- 🚀 **多种唤起方式** - 支持 Scheme 唤起、Universal Link、App Link\n- 🔗 **链式调用** - 流畅的 API 设计，易于配置\n- 🔌 **插件系统** - 支持自定义插件扩展\n- 📱 **设备检测** - 自动检测设备类型和浏览器环境\n- 🎯 **智能回退** - 唤起失败时自动跳转到回退页面\n- 📋 **剪切板支持** - 支持唤起前写入剪切板内容\n- 🐛 **调试模式** - 详细的日志输出，便于调试\n- 📦 **TypeScript** - 完整的类型支持\n\n## 📦 安装\n\n```bash\nnpm install @bluesyoung/app-launcher\n# 或\nyarn add @bluesyoung/app-launcher\n# 或\npnpm add @bluesyoung/app-launcher\n```\n\n## 🚀 快速开始\n\n### 基础用法\n\n```typescript\nimport { AppLauncher } from '@bluesyoung/app-launcher'\n\n// 传统方式\nconst launcher = new AppLauncher({\n  scheme: 'myapp://open',\n  fallbackUrl: 'https://example.com/download',\n  timeout: 3000,\n  debug: true\n})\n\nawait launcher.launch()\n```\n\n### 链式调用（推荐）\n\n```typescript\nimport { AppLauncher } from '@bluesyoung/app-launcher'\n\n// 链式调用方式\nconst result = await AppLauncher.create()\n  .scheme('myapp://open')\n  .fallbackUrl('https://example.com/download')\n  .timeout(3000)\n  .debug(true)\n  .onStart(() => console.log('开始唤起'))\n  .onSuccess(() => console.log('唤起成功'))\n  .onFail(error => console.error('唤起失败:', error))\n  .launch()\n```\n\n## 📖 API 文档\n\n### AppLauncher.create()\n\n创建链式调用构建器。\n\n```typescript\nconst builder = AppLauncher.create()\n```\n\n### 链式调用方法\n\n#### scheme(scheme: string)\n\n设置唤起 Scheme。\n\n```typescript\n.scheme('myapp://open')           // 自定义 Scheme\n.scheme('https://myapp.com/open') // Universal Link\n```\n\n#### fallbackUrl(url: string)\n\n设置唤起失败时的回退 URL。\n\n```typescript\n.fallbackUrl('https://example.com/download')\n```\n\n#### clipboardText(text: string)\n\n设置需要写入剪切板的内容。\n\n```typescript\n.clipboardText('分享的内容')\n```\n\n#### timeout(ms: number)\n\n设置唤起超时时间（毫秒）。\n\n```typescript\n.timeout(5000) // 5秒超时\n```\n\n#### debug(enabled: boolean)\n\n启用或禁用调试模式。\n\n```typescript\n.debug(true) // 启用调试模式，会输出详细日志\n```\n\n#### 回调函数\n\n```typescript\n.onStart(() => {\n  console.log('开始唤起应用')\n  // 可以在这里添加埋点统计\n})\n\n.onSuccess(() => {\n  console.log('应用唤起成功')\n  // 可以在这里添加成功统计\n})\n\n.onFail((error) => {\n  console.error('应用唤起失败:', error)\n  // 可以在这里添加失败统计\n})\n```\n\n#### 插件管理\n\n```typescript\n// 添加单个插件\n.addPlugin(new CustomPlugin())\n\n// 添加多个插件\n.addPlugins([new CustomPlugin(), new AnotherPlugin()])\n```\n\n### 执行方法\n\n#### build()\n\n构建并返回 AppLauncher 实例。\n\n```typescript\nconst launcher = AppLauncher.create()\n  .scheme('myapp://open')\n  .build()\n\nawait launcher.launch()\n```\n\n#### launch()\n\n构建并立即执行唤起。\n\n```typescript\nconst result = await AppLauncher.create()\n  .scheme('myapp://open')\n  .launch()\n```\n\n## 🔌 插件系统\n\n### 内置插件\n\n- **DefaultPlugin** - 默认唤起插件，支持常规浏览器环境，包含全屏加载动画\n- **WechatPlugin** - 微信内唤起插件，引导用户在外部浏览器打开\n- **DingTalkPlugin** - 钉钉内唤起插件，引导用户在外部浏览器打开\n\n### 自定义插件\n\n```typescript\nimport { AppLaunchPlugin } from '@bluesyoung/app-launcher'\n\nclass CustomPlugin implements AppLaunchPlugin {\n  name = 'custom'\n  priority = 0\n\n  supported(deviceInfo: DeviceInfo): boolean {\n    // 定义插件支持的设备条件\n    return deviceInfo.isAndroid\n  }\n\n  async launch(options: LaunchOptions, deviceInfo: DeviceInfo): Promise<boolean> {\n    // 实现自定义唤起逻辑\n    console.log('使用自定义插件唤起')\n\n    // 返回是否唤起成功\n    return true\n  }\n}\n\n// 使用自定义插件\nconst launcher = AppLauncher.create()\n  .scheme('myapp://open')\n  .addPlugin(new CustomPlugin())\n  .build()\n```\n\n## 📱 设备检测\n\n库会自动检测以下设备信息：\n\n```typescript\ninterface DeviceInfo {\n  isMobile: boolean // 是否为手机\n  isAndroid: boolean // 是否为安卓\n  isIOS: boolean // 是否为 iOS\n  isMacOS: boolean // 是否为 macOS\n  isHarmonyOS: boolean // 是否为鸿蒙\n  isWechat: boolean // 是否为微信\n  rawUA: string // 原始 User Agent\n}\n```\n\n## 🎯 使用场景\n\n### 1. 应用下载页面\n\n```typescript\n// 在应用下载页面，尝试唤起已安装的应用\nAppLauncher.create()\n  .scheme('myapp://open?page=home')\n  .fallbackUrl('/download') // 如果唤起失败，跳转到下载页面\n  .launch()\n```\n\n### 2. 分享功能\n\n```typescript\n// 分享内容到应用\nAppLauncher.create()\n  .scheme('myapp://share')\n  .clipboardText('分享的内容') // 将内容写入剪切板\n  .onSuccess(() => {\n    // 唤起成功，可以隐藏分享按钮\n  })\n  .onFail(() => {\n    // 唤起失败，显示下载提示\n  })\n  .launch()\n```\n\n### 3. 深度链接\n\n```typescript\n// 从网页跳转到应用的特定页面\nAppLauncher.create()\n  .scheme('myapp://product/123')\n  .fallbackUrl('/product/123') // 如果应用未安装，跳转到网页版\n  .launch()\n```\n\n## 🔧 高级配置\n\n### 复杂配置示例\n\n```typescript\nconst launcher = AppLauncher.create()\n  .scheme('https://myapp.com/open')\n  .fallbackUrl('https://example.com/download')\n  .clipboardText('分享的内容')\n  .timeout(3000)\n  .debug(true)\n  .onStart(() => {\n    console.log('开始唤起应用')\n    // 显示加载状态\n    showLoading()\n  })\n  .onSuccess(() => {\n    console.log('应用唤起成功')\n    // 隐藏加载状态\n    hideLoading()\n    // 发送成功统计\n    analytics.track('app_launch_success')\n  })\n  .onFail((error) => {\n    console.error('应用唤起失败:', error)\n    // 隐藏加载状态\n    hideLoading()\n    // 显示下载提示\n    showDownloadTip()\n    // 发送失败统计\n    analytics.track('app_launch_failed', { error: error.message })\n  })\n  .build()\n\n// 执行唤起\nconst result = await launcher.launch()\nconsole.log('唤起结果:', result)\n```\n\n## 📊 唤起结果\n\n```typescript\ninterface LaunchResult {\n  success: boolean // 是否成功\n  error?: Error // 错误信息\n  timestamp: number // 时间戳\n  deviceInfo: DeviceInfo // 设备信息\n}\n```\n\n## 🐛 调试\n\n启用调试模式可以查看详细的唤起过程：\n\n```typescript\nAppLauncher.create()\n  .scheme('myapp://open')\n  .debug(true) // 启用调试模式\n  .launch()\n```\n\n调试模式下会输出：\n- 设备检测结果\n- 插件匹配情况\n- 唤起过程日志\n- 成功/失败状态\n\n## 🛠️ 开发\n\n### 构建\n\n```bash\n# 安装依赖\npnpm install\n\n# 构建项目\npnpm run build\n\n# 开发模式\npnpm run dev\n\n# 运行测试\npnpm run test\n\n# 代码检查\npnpm run lint\n```\n\n### 项目结构\n\n```\nsrc/\n├── core/           # 核心功能\n│   ├── AppLauncher.ts\n│   └── PluginManager.ts\n├── plugins/         # 内置插件\n│   └── index.ts\n├── utils/          # 工具函数\n│   ├── clipboard.ts\n│   ├── device.ts\n│   └── logger.ts\n├── types.d.ts      # 类型定义\n└── index.ts        # 入口文件\n```\n\n### 技术栈\n\n- **TypeScript** - 类型安全\n- **Vite** - 构建工具\n- **ESLint** - 代码检查\n- **Vitest** - 测试框架\n\n## 📄 许可证\n\nMIT License\n\n## 🤝 贡献\n\n欢迎提交 Issue 和 Pull Request！\n\n## 📞 支持\n\n如有问题，请提交 Issue 或联系维护者。\n","readmeFilename":"README.md"}