cloudinary / cloudinary_ios

Cloudinary iOS SDK
MIT License
165 stars 106 forks source link

Unable to upload photo, uploadPrefix, unrecognized selector #369

Open nschild opened 2 years ago

nschild commented 2 years ago

Bug report for Cloudinary iOS SDK

Before proceeding, please update to latest version and test if the issue persists

Describe the bug in a sentence or two.

Trying to upload file. Upgraded to react native 0.64.x and not working now. Do you know what this error means?

Issue Type (Can be multiple)

[ ] Build - Can’t install or import the SDK [ ] Performance - Performance issues [ x] Behaviour - Functions aren’t working as expected (Such as generate URL) [ ] Documentation - Inconsistency between the docs and behaviour [ ] Other (Specify)

Steps to reproduce

idik

Error screenshots or Stack Trace (if applicable)

Exception '-[Cloudinary.CLDConfiguration initWithCloudName:apiKey:apiSecret:privateCdn:secure:cdnSubdomain:secureCdnSubdomain:secureDistribution:cname:uploadPrefix:]: unrecognized selector sent to instance 0x282d25400' was thrown while invoking uploadFile on target CloudinaryModule with params (
    "file:///var/mobile/Containers/Data/Application/6A8045F7-2399-4A2E-AED7-AE1D45131797/tmp/E10380FD-B9C5-4682-B7A0-319DF783D857.jpg",
        { ...}
  30130,
    30131
)
callstack: (
    0   CoreFoundation                      0x000000018189d110 16FAA70C-278C-3561-859E-CEC407C2DC7C + 626960
    1   libobjc.A.dylib                     0x000000019a0d7d64 objc_exception_throw + 60
    2   CoreFoundation                      0x000000018197a0c4 16FAA70C-278C-3561-859E-CEC407C2DC7C + 1532100
    3   CoreFoundation                      0x0000000181832524 16FAA70C-278C-3561-859E-CEC407C2DC7C + 189732
    4   CoreFoundation                      0x0000000181831660 _CF_forwarding_prep_0 + 96
    5   myapp                                      0x000000010293bf9c -[RNTCloudinaryManager uploadFile:fileData:uploadFileWithResolver:rejecter:] + 180
    6   CoreFoundation                      0x00000001818263a4 16FAA70C-278C-3561-859E-CEC407C2DC7C + 140196
    7   CoreFoundation                      0x0000000181843b74 16FAA70C-278C-3561-859E-CEC407C2DC7C + 260980
    8   CoreFoundation                      0x000000018187a9d4 16FAA70C-278C-3561-859E-CEC407C2DC7C + 485844
    9   myapp                                      0x0000000102ca5228 -[RCTModuleMethod invokeWithBridge:module:arguments:] + 1696
    10  myapp                                     0x0000000102d113a4 _ZN8facebook5reactL11invokeInnerEP9RCTBridgeP13RCTModuleDatajRKN5folly7dynamicEiN12_GLOBAL__N_117SchedulingContextE + 1088
    11  myapp                                     0x0000000102d10da4 _ZZN8facebook5react15RCTNativeModule6invokeEjON5folly7dynamicEiENK3$_0clEv + 128
    12  myapp                                    0x0000000102d10d18 ___ZN8facebook5react15RCTNativeModule6invokeEjON5folly7dynamicEi_block_invoke + 28
    13  libdispatch.dylib                   0x00000001069706d4 _dispatch_call_block_and_release + 32
    14  libdispatch.dylib                   0x00000001069723b4 _dispatch_client_callout + 20
    15  libdispatch.dylib                   0x000000010697a540 _dispatch_lane_serial_drain + 988
    16  libdispatch.dylib                   0x000000010697b290 _dispatch_lane_invoke + 428
    17  libdispatch.dylib                   0x0000000106987e20 _dispatch_workloop_worker_thread + 916
    18  libsystem_pthread.dylib             0x00000001f22730f4 _pthread_wqthread + 288
    19  libsystem_pthread.dylib             0x00000001f2272e94 start_wqthread + 8
)
RCTFatal
facebook::react::invokeInner(RCTBridge*, RCTModuleData*, unsigned int, folly::dynamic const&, int, (anonymous namespace)::SchedulingContext)
facebook::react::RCTNativeModule::invoke(unsigned int, folly::dynamic&&, int)::$_0::operator()() const
invocation function for block in facebook::react::RCTNativeModule::invoke(unsigned int, folly::dynamic&&, int)
_dispatch_call_block_and_release
_dispatch_client_callout
_dispatch_lane_serial_drain
_dispatch_lane_invoke
_dispatch_workloop_worker_thread
_pthread_wqthread
start_wqthread

Build/Dependency management

[x ] Cocoa-Pods [ ] Carthage [ ] Manual import [ ] Other (Specify)

Is the issue reproducible only on a specific device?

[x ] No [ ] Yes (specify model + iOS version)

Versions and Libraries (fill in the version numbers)

iOS Cloudinary SDK version - 3.1.0 OSX (on the dev environment) - 11.6 XCode - 13.2.1 Swift - 5 Target iOS - 12.1

Repository If possible, please provide a link to a reproducible repository that showcases the problem

patrick-tolosa commented 2 years ago

@nschild

Can you please provide more context on what you're trying to do? Is this issue with React Native, or the Cloudinary IOS SDK?

nschild commented 2 years ago

@patrick-tolosa Thanks for the response, Although I did upgrade react native, I dont know what would be the cause of the error as the data that is sent to the cloudinary sdk looks the same. I did update ios recently as well and since the cloudinary sdk is throwing the error, I thought I would start here.

Below is the sdk implementation, all we are doing is uplaoding a file, pretty simple.

//  RNTCloudinaryManager.m

#import "RNTCloudinaryManager.h"
#import <React/RCTBridgeModule.h>
#import <React/RCTConvert.h>
#import <Cloudinary-Swift.h>

@implementation RNTCloudinaryManager

RCT_EXPORT_MODULE(CloudinaryModule);

RCT_EXPORT_METHOD(uploadFile:(NSString *)filePath
                  fileData:(NSDictionary *)fileData
                  uploadFileWithResolver:(RCTPromiseResolveBlock)resolve
                  rejecter:(RCTPromiseRejectBlock)reject) {
  if (!_cloudinary) {
    NSString *cloudinaryCloudName = [[[NSBundle mainBundle] infoDictionary] objectForKey: @"CLOUDINARY_CLOUD_NAME"];
    CLDConfiguration *config;
    config = [[CLDConfiguration alloc] initWithCloudName:cloudinaryCloudName apiKey:nil apiSecret:nil privateCdn:false secure:false cdnSubdomain:false secureCdnSubdomain:false secureDistribution:nil cname:nil uploadPrefix:nil];

    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    sessionConfig.HTTPMaximumConnectionsPerHost = 1;
    sessionConfig.timeoutIntervalForRequest = 1800;  // 30mins to prevent timeouts for large uploads
    sessionConfig.timeoutIntervalForResource = 1800; // 30mins to prevent timeouts for large uploads

    _cloudinary = [[CLDCloudinary alloc] initWithConfiguration:config networkAdapter:nil sessionConfiguration:sessionConfig];
  }

  NSURL *fileUrl = [RCTConvert NSURL:filePath];
  NSString *resourceType = [fileData objectForKey:@"resourceType"];
  NSString *context = [fileData objectForKey:@"context"];
  NSString *uploadPreset = [NSString stringWithFormat:@"%@%@", @"default-", resourceType];

  CLDUploader *uploader = [_cloudinary createUploader];
  CLDUploadRequestParams *params = [[CLDUploadRequestParams alloc] init];
  [ params setResourceTypeFromString:resourceType ];
  [ params setContext:context ];

  [ uploader
      uploadLargeWithUrl:fileUrl
      uploadPreset:uploadPreset
      params:params
      chunkSize:20 * 1024 * 1024
      progress:^void(NSProgress *progressResult) {
        // TODO: Can pass percentComplete value to RN in the future if we want to display a progress bar in the UI
        // double percentComplete = [progressResult fractionCompleted];
        // NSLog(@"Cloudinary uploader: progress percent completed %f", percentComplete);
        if ([progressResult isFinished]) {
          NSLog(@"Cloudinary uploader progress: finished");
          NSDictionary *dictRes = @{ @"ok":@YES };
          resolve(dictRes);
        }
      }
     completionHandler:^(CLDUploadResult *uploadResult, NSError *errorResult) {
      if (uploadResult) {
        // not in use by app - see progress handler above
        // cloudinary API was very long time to return 200 response, or would time-out, due to time required for video rotation fix
      }
      if (errorResult) {
        NSLog(@"Cloudinary uploader error: %@", [errorResult localizedDescription]);
        reject([NSString stringWithFormat:@"%li", (long)[errorResult code]], [errorResult localizedDescription], errorResult);
      }
    }
 ];
}

@end