在 Web Angular 应用程序中分离本机功能代码的最佳方法是什么,它也是使用 Capacitor 的本机 android/ios 应用程序?

What is the best approach for separating native features code in web Angular application which is also native android/ios app using Capacitor?

我对使用电容器的 Angular 应用程序有疑问。我们的 Angular 应用程序源代码应该用于 Web 构建以及本机 android/ios 应用程序。如果我们使用例如关于 Web 应用程序的电容摄像头/蓝牙/文件系统本机功能,是否应该遵循一些建议的方法?

如何分离那些不在 Angular Web 应用程序上使用的本机功能?例如,如果我们使用 android 应用程序,我们希望用户可以从他的相机上传个人资料图片,但如果他使用网络版本,我们希望他只能从他的文件系统上传。您是否有仅为 web/native 应用程序构建的单独组件,或者您可能有条件验证移动应用程序或浏览器中的用户,然后根据该条件使用功能?

谢谢。

您可以使用此代码 运行 仅当在本机平台中时才能使用某些代码

if (Capacitor.isNativePlatform()) {
  // do something
}

https://capacitorjs.com/docs/basics/utilities#isnativeplatform

在您的示例中,相机插件也支持网络,并且可以配置为仅使用文件选择器而不使用相机。

如果三个平台都有需要考虑的特点,那么我一般会创建5个服务。 使用 Filesystem 插件的示例:

  1. CapacitorFilesystemService:这是我的包装器服务,它包装了对 Capacitor 插件的所有调用。它使用的代码应该适用于所有三个平台。
import { Filesystem } from '@capacitor/filesystem';
...

@Injectable({
  providedIn: 'root',
})
export class CapacitorFilesystemService {
  constructor() {}

  public requestPermissions(): Promise<void> {
    try {
      return Filesystem.requestPermissions();
    } catch (error) {
      // e.g. error handling for all platforms
    }
  }
}
  1. CapacitorAndroidFilesystemService:这是 Android 实施的服务。
@Injectable({
  providedIn: 'root',
})
export class CapacitorAndroidFilesystemService {
  constructor(
    private capacitorFilesystemService: CapacitorFilesystemService,
  ) {}

  public requestPermissions(): Promise<void> {
    // Maybe show a UI hint before asking for permission on Android...
    return this.capacitorFilesystemService.requestPermissions();
  }
}
  1. CapacitorIosFilesystemService:这是 iOS 实施的服务。
@Injectable({
  providedIn: 'root',
})
export class CapacitorIosFilesystemService {
  constructor(
    private capacitorFilesystemService: CapacitorFilesystemService,
  ) {}

  public requestPermissions(): Promise<void> {
    // More platform specific code...
    return this.capacitorFilesystemService.requestPermissions();
  }
}
  1. CapacitorWebFilesystemService: 这是web实现的服务。
@Injectable({
  providedIn: 'root',
})
export class CapacitorWebFilesystemService {
  constructor(
    private capacitorFilesystemService: CapacitorFilesystemService,
  ) {}

  public requestPermissions(): Promise<void> {
    // More platform specific code...
    return this.capacitorFilesystemService.requestPermissions();
  }
}
  1. FilesystemService:这是其他服务现在可以用来访问文件系统的服务,而不必担心特殊实现。
import { Platform } from '@ionic/angular';
...

@Injectable({
  providedIn: 'root',
})
export class FilesystemService {
  constructor(
    private capacitorAndroidFilesystemService: CapacitorAndroidFilesystemService,
    private capacitorIosFilesystemService: CapacitorIosFilesystemService,
    private capacitorWebFilesystemService: CapacitorWebFilesystemService,
    private platform: Platform,
  ) {}

  public requestPermissions(): Promise<void> {
    if (this.platform.is('android')) {
      return this.capacitorAndroidFilesystemService.requestPermissions();
    } else if (this.platform.is('ios')) {
      return this.capacitorIosFilesystemService.requestPermissions();
    } else {
      return this.capacitorWebFilesystemService.requestPermissions();
    }
  }
}

但是,老实说,在大多数情况下我不需要不同的实现。所以通常 CapacitorFilesystemServiceFilesystemService 对我来说就足够了。这个例子只是为了解释我的方法。