|
9 | 9 | #import "RCTARKitManager.h" |
10 | 10 | #import "RCTARKit.h" |
11 | 11 | #import "RCTARKitNodes.h" |
| 12 | +#import <UIKit/UIKit.h> |
| 13 | +#import <Photos/Photos.h> |
12 | 14 |
|
13 | 15 | @implementation RCTARKitManager |
14 | 16 |
|
@@ -95,12 +97,90 @@ - (NSDictionary *)constantsToExport |
95 | 97 |
|
96 | 98 |
|
97 | 99 |
|
98 | | -RCT_EXPORT_METHOD(snapshot:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { |
99 | | - [[ARKit sharedInstance] snapshot:resolve reject:reject]; |
| 100 | +- (NSString *)getAssetUrl:(NSString *)localID { |
| 101 | + // thx https://stackoverflow.com/a/34788748/1463534 |
| 102 | + // heck, objective c is such a mess |
| 103 | + NSString * assetID = [localID stringByReplacingOccurrencesOfString:@"/.*" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [localID length])]; |
| 104 | + NSString * ext = @"JPG"; |
| 105 | + NSString * assetURLStr = [NSString stringWithFormat:@"assets-library://asset/asset.%@?id=%@&ext=%@", ext, assetID, ext]; |
| 106 | + return assetURLStr; |
100 | 107 | } |
101 | 108 |
|
102 | | -RCT_EXPORT_METHOD(snapshotCamera:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { |
103 | | - [[ARKit sharedInstance] snapshotCamera:resolve reject:reject]; |
| 109 | +- (void)storeImageInPhotoAlbum:(UIImage *)image reject:(RCTPromiseRejectBlock)reject resolve:(RCTPromiseResolveBlock)resolve { |
| 110 | + __block PHObjectPlaceholder *placeholder; |
| 111 | + |
| 112 | + [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ |
| 113 | + PHAssetChangeRequest* createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image]; |
| 114 | + placeholder = [createAssetRequest placeholderForCreatedAsset]; |
| 115 | + |
| 116 | + } completionHandler:^(BOOL success, NSError *error) { |
| 117 | + if (success) |
| 118 | + { |
| 119 | + |
| 120 | + NSString * localID = placeholder.localIdentifier; |
| 121 | + |
| 122 | + NSString * assetURLStr = [self getAssetUrl:localID]; |
| 123 | + |
| 124 | + resolve(@{@"url": assetURLStr}); |
| 125 | + } |
| 126 | + else |
| 127 | + { |
| 128 | + reject(@"snapshot_error", @"Could not store snapshot", error); |
| 129 | + } |
| 130 | + }]; |
| 131 | +} |
| 132 | + |
| 133 | + |
| 134 | +- (void)storeImageInDirectory:(UIImage *)image directory:(NSString *)directory reject:(RCTPromiseRejectBlock)reject resolve:(RCTPromiseResolveBlock)resolve { |
| 135 | + |
| 136 | + NSData *pngData = UIImagePNGRepresentation(image); |
| 137 | + |
| 138 | + NSString *prefixString = @"capture"; |
| 139 | + |
| 140 | + NSString *guid = [[NSProcessInfo processInfo] globallyUniqueString] ; |
| 141 | + NSString *uniqueFileName = [NSString stringWithFormat:@"%@_%@.png", prefixString, guid]; |
| 142 | + |
| 143 | + NSString *filePath = [directory stringByAppendingPathComponent:uniqueFileName]; //Add the file name |
| 144 | + bool success = [pngData writeToFile:filePath atomically:YES]; //Write the file |
| 145 | + if(success) { |
| 146 | + resolve(@{@"url": filePath}); |
| 147 | + } else { |
| 148 | + // TODO use NSError from writeToFile |
| 149 | + reject(@"snapshot_error", [NSString stringWithFormat:@"could not save to '%@'", filePath], nil); |
| 150 | + } |
| 151 | + |
| 152 | +} |
| 153 | + |
| 154 | +- (void)storeImage:(UIImage *)image options:(NSDictionary *)options reject:(RCTPromiseRejectBlock)reject resolve:(RCTPromiseResolveBlock)resolve { |
| 155 | + NSString * target = @"cameraRoll"; |
| 156 | + if(options[@"target"]) { |
| 157 | + target = options[@"target"]; |
| 158 | + } |
| 159 | + if([target isEqualToString:@"cameraRoll"]) { |
| 160 | + // camera roll / photo album |
| 161 | + [self storeImageInPhotoAlbum:image reject:reject resolve:resolve]; |
| 162 | + } else if([target isEqualToString:@"cache"]) { |
| 163 | + NSString * cacheDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; |
| 164 | + [self storeImageInDirectory:image directory:cacheDir reject:reject resolve:resolve]; |
| 165 | + } else if([target isEqualToString:@"documents"]) { |
| 166 | + NSString * documentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; |
| 167 | + [self storeImageInDirectory:image directory:documentsDir reject:reject resolve:resolve]; |
| 168 | + } else { |
| 169 | + [self storeImageInDirectory:image directory:target reject:reject resolve:resolve]; |
| 170 | + } |
| 171 | +} |
| 172 | + |
| 173 | +RCT_EXPORT_METHOD(snapshot:(NSDictionary *)options resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { |
| 174 | + UIImage *image = [[ARKit sharedInstance] getSnaphshot]; |
| 175 | + [self storeImage:image options:options reject:reject resolve:resolve]; |
| 176 | +} |
| 177 | + |
| 178 | + |
| 179 | + |
| 180 | + |
| 181 | +RCT_EXPORT_METHOD(snapshotCamera:(NSDictionary *)options resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { |
| 182 | + UIImage *image = [[ARKit sharedInstance] getSnaphshotCamera]; |
| 183 | + [self storeImage:image options:options reject:reject resolve:resolve]; |
104 | 184 | } |
105 | 185 |
|
106 | 186 | RCT_EXPORT_METHOD(getCamera:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { |
|
0 commit comments