Skip to content

Object.defineProperty methods cannot be invoked from Objective-C #1012

Open
@Mitko-Kerezov

Description

@Mitko-Kerezov

Brief description

Methods declared inside a JavaScript class which are constructed using the following template:
(where MyClass is some JavaScript class extending some Objective-C class (with __extends))

Object.defineProperty(MyClass, "methodName", {
    get: function () {
        // code ...
    },
    set: function (value) {
           // code ...
    }
});

Are not accessible from Objective-C - when asked respondsToSelector the class answers with NO as if no Objective-C counterpart of said method is present at all.

Repro

I've devised a quick app in the playground to showcase the issue. The actual repro of the issue is located inside home.component.ts

Example

An example can be seen in this PR:
hypery2k/nativescript-urlhandler#81

When inside the running application from within Objective-C native code one tries to swizzle application:openURL:options: of the application delegate and uses the following code:

-(BOOL) swizzled_application:(UIApplication *)application
    openURL:(NSURL *)url
    options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options
{
    if ([self respondsToSelector:@selector(swizzled_application:openURL:options:)])
    {
        NSLog(@"Original method exists!!");
        return [self swizzled_application:application openURL:url options:options];
    }
    
    NSLog(@"Original method does NOT exist!!");
    return NO;
}

Running the code shows that the delegate does not respond to swizzled_application:openURL:options: when the method applicationOpenURLOptions is defined as Object.defineProperty. This leads to inability to invoke the JavaScript method from native code.
Whereas after the change in the proposed PR the method applicationOpenURLOptions is defined as delegate["applicationOpenURLOptions"] = function () { ... } then the delegate responds correctly to swizzled_application:openURL:options: and the JavaScript method can be invoked.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions