withAlipay.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. const { withInfoPlist, withAndroidManifest } = require('expo/config-plugins');
  2. /**
  3. * Local Expo Config Plugin for @uiw/react-native-alipay
  4. * Configures iOS URL Schemes and Android queries for Alipay SDK
  5. */
  6. const withAlipay = (config, { alipayScheme = 'alipay' } = {}) => {
  7. // iOS: Add URL Scheme for Alipay callback
  8. config = withInfoPlist(config, (config) => {
  9. if (!config.modResults.CFBundleURLTypes) {
  10. config.modResults.CFBundleURLTypes = [];
  11. }
  12. // Check if alipay scheme already exists
  13. const existingScheme = config.modResults.CFBundleURLTypes.find(
  14. (urlType) => urlType.CFBundleURLSchemes && urlType.CFBundleURLSchemes.includes(alipayScheme)
  15. );
  16. if (!existingScheme) {
  17. config.modResults.CFBundleURLTypes.push({
  18. CFBundleURLName: 'alipay',
  19. CFBundleURLSchemes: [alipayScheme],
  20. });
  21. }
  22. // Add LSApplicationQueriesSchemes for Alipay
  23. if (!config.modResults.LSApplicationQueriesSchemes) {
  24. config.modResults.LSApplicationQueriesSchemes = [];
  25. }
  26. const alipaySchemes = ['alipay', 'alipays', 'alipayshare'];
  27. alipaySchemes.forEach((scheme) => {
  28. if (!config.modResults.LSApplicationQueriesSchemes.includes(scheme)) {
  29. config.modResults.LSApplicationQueriesSchemes.push(scheme);
  30. }
  31. });
  32. return config;
  33. });
  34. // Android: Add queries for Alipay package
  35. config = withAndroidManifest(config, (config) => {
  36. const manifest = config.modResults.manifest;
  37. if (!manifest.queries) {
  38. manifest.queries = [];
  39. }
  40. // Add package query for Alipay
  41. const alipayPackage = { package: [{ $: { 'android:name': 'com.eg.android.AlipayGphone' } }] };
  42. // Check if already exists
  43. const hasAlipayQuery = manifest.queries.some(
  44. (q) => q.package && q.package.some((p) => p.$ && p.$['android:name'] === 'com.eg.android.AlipayGphone')
  45. );
  46. if (!hasAlipayQuery) {
  47. manifest.queries.push(alipayPackage);
  48. }
  49. return config;
  50. });
  51. return config;
  52. };
  53. module.exports = withAlipay;