icloud_storage_sync
iCloud Sync Flutter 플러그인을 사용하여 앱 데이터를 쉽게 동기화하고 보호하며 원활한 iCloud 통합을 구현하세요.
iCloud Sync Flutter 플러그인을 사용하여 앱 데이터를 쉽게 동기화하고 보호하며 원활한 iCloud 통합을 구현하세요.
{"sdk":"flutter"}^2.1.8^2.1.5>=0.20.2^6.0.0{"sdk":"flutter"}아래는 영문 원문 스냅샷입니다. 최신 내용은 GitHub에서 확인하세요.
Seamless iCloud integration for your Flutter iOS apps!
iCloud Storage Sync BanneriCloud_Storage_Sync simplifies iCloud storage integration, bringing powerful cloud capabilities to your Flutter iOS apps:
🔄 Effortless backup and sync of app data
📱💻 Consistent user experience across all devices
🔒 Secure storage and retrieval of important information
☁️ Seamless integration with the iCloud ecosystem
| Feature | Description |
|---|---|
| 📂 | Get iCloud files |
| ⬆️ | Upload files to iCloud |
| ✏️ | Rename iCloud files |
| 🗑️ | Delete iCloud files |
| ↔️ | Move iCloud files |
| 🔍 | Filter by path prefix |
| ⏱️ | Timeout support |
Advanced Features:
Add this to your pubspec.yaml:
dependencies:
icloud_storage_sync: ^1.0.0
Run:
flutter pub get
Update your iCloud Container ID in the example app:
In example/lib/controller/icloud_plugin_controller.dart:
final iCloudContainerId = 'iCloud.com.yourcompany.appname'; // Replace with your container ID
In example/ios/Runner/Info.plist:
<key>iCloud.com.yourcompany.appname</key> <!-- Replace with your container ID -->
In example/ios/Runner/Runner.entitlements and RunnerDebug.entitlements:
<string>iCloud.com.yourcompany.appname</string> <!-- Replace with your container ID -->
ℹ️ Note: Your iCloud Container ID should match the format:
iCloud.<your-team-id>.<your-bundle-id>
Import in your Dart code:
import 'package:icloud_storage_sync/icloud_storage_sync.dart';
Before diving in, make sure you have:
☑️ An Apple Developer account
☑️ App ID and iCloud Container ID
☑️ iCloud capability enabled and assigned
☑️ iCloud capability configured in Xcode
🔍 See How to set up iCloud Container for step-by-step instructions.
Future<List<CloudFiles>> getCloudFiles({required String containerId}) async {
return await icloudSyncPlugin.getCloudFiles(containerId: containerId);
}
// Gather files with optional path prefix filtering
Future<List<ICloudFile>> gatherFilesFromSubdirectory({
required String containerId,
required String pathPrefix,
}) async {
return await icloudSyncPlugin.gather(
containerId: containerId,
relativePathPrefix: pathPrefix, // e.g., 'Documents/', 'Projects/MyApp/'
);
}
// Gather files with timeout to prevent indefinite hangs
Future<List<ICloudFile>> gatherFilesWithTimeout({
required String containerId,
required Duration timeout,
}) async {
try {
return await icloudSyncPlugin.gather(
containerId: containerId,
timeout: timeout, // e.g., Duration(seconds: 30)
);
} on PlatformException catch (e) {
if (e.code == 'METADATA_QUERY_TIMEOUT') {
debugPrint('iCloud query timed out');
}
return [];
}
}
// Combine both features for optimal performance
Future<List<ICloudFile>> gatherFilesOptimized({
required String containerId,
required String pathPrefix,
}) async {
return await icloudSyncPlugin.gather(
containerId: containerId,
relativePathPrefix: pathPrefix,
timeout: Duration(seconds: 30),
);
}
Features:
relativePathPrefix - Filter to specific subdirectory for faster queriestimeout - Set time limit to prevent indefinite hangsFuture<void> upload({
required String containerId,
required String filePath,
String? destinationRelativePath,
StreamHandler<double>? onProgress,
}) async {
await icloudSyncPlugin.upload(
containerId: containerId,
filePath: filePath,
destinationRelativePath: destinationRelativePath,
onProgress: onProgress,
);
}
Future<void> rename({
required String containerId,
required String relativePath,
required String newName,
}) async {
await icloudSyncPlugin.rename(
containerId: containerId,
relativePath: relativePath,
newName: newName,
);
}
Future<void> delete({
required String containerId,
required String relativePath,
required bool isDirectory
}) async {
await icloudSyncPlugin.delete(
containerId: containerId,
relativePath: relativePath,
isDirectory: isDirectory
);
}
Future replaceFile({
required String updatedFilePath,
required String relativePath
}) async {
await icloudSyncPlugin.replace(
containerId: iCloudContainerId,
updatedFilePath: updatedFilePath,
relativePath: relativePath,
);
}
Future<void> move({
required String containerId,
required String fromRelativePath,
required String toRelativePath,
}) async {
await IcloudSyncPlatform.instance.move(
containerId: containerId,
fromRelativePath: fromRelativePath,
toRelativePath: toRelativePath,
);
}
👤 Log in to your Apple Developer account and select 'Certificates, IDs & Profiles'.
🆔 Create an App ID (if needed) and an iCloud Containers ID:
iCloud Container ID🔗 Assign the iCloud Container to your App ID:
Assign iCloud Capability💻 In Xcode, enable iCloud capability and select your container:
Xcode CapabilityMade with ❤️ by the DevCodeSpace