Search code examples
iosobjective-capple-watchnscodingwatchos

Same Class Object With Different Methods For iOS and watchOS (Objective-C)


I am currently working on an iOS app that includes a watchOS app extension. In my iOS app I've made an NSObject subclass, which makes use of some objects from the AVFoundation framework in some of its methods.

On the Watch Extension side, I'm creating an NSDictionary object and then sending it to my iOS counterpart using the WatchConnectivity framework. I then use the dictionary to initialize my custom class.

I would like to be able to add my Watch Extension as one of the Targets for my custom class's .m file so that I can go ahead and create objects of my custom class on the watch and then send it over. (My class conforms to the NSCoding protocol so I can use NSKeyArchiver to represent my object using NSData, add it to a dictionary, then transferring that dictionary to the iOS device).

The Problem: AVFoundation is not available in watchOS, which my class utilizes. So is there a way to "omit" certain methods of a class depending which OS it's in.

Ex: In iOS, UIImage has the method initWithCIImage: but it is not available in watchOS since the CoreImage framework is not available.

(Perhaps I should recreate the class specifically for watchOS with all the same instance variables and use the same keys for the classes in the NSCoding methods, omitting AVFoundation from the watchOS version?)

Any help would be greatly appreciated!


Solution

  • You can build your class using the macros available in TargetConditionals.h, for example TARGET_OS_IOS or TARGET_OS_WATCH, e.g.:

    @implementation Foo
    
    #ifdef TARGET_OS_IOS
    
    - (void) someMethodThatUsesAVFoundation {
        // ...
    }
    
    #endif
    
    @end
    

    You'll also need to wrap #include directives to make sure you only include framework headers on the OS that actually supplies them.