{"id":6108,"library":"pyobjc-framework-fskit","title":"PyObjC FSKit Framework","description":"This library provides Python wrappers for the macOS FSKit framework, which is primarily used for developing Finder Sync extensions. It allows Python applications to interact with Finder's UI and filesystem events. The current version is 12.1, and releases typically follow macOS SDK updates, aligning with Apple's development cycles.","status":"active","version":"12.1","language":"en","source_language":"en","source_url":"https://github.com/ronaldoussoren/pyobjc","tags":["macos","pyobjc","fskit","finder","filesystem","objective-c","apple"],"install":[{"cmd":"pip install pyobjc-framework-fskit","lang":"bash","label":"Install FSKit bindings"}],"dependencies":[{"reason":"Core bridge for Python and Objective-C, required by all pyobjc-framework-* packages.","package":"pyobjc-core","optional":false}],"imports":[{"note":"The FSKit framework's classes and functions are typically accessed through the top-level FSKit module after importing.","symbol":"FSKit","correct":"import FSKit"},{"note":"PyObjC framework symbols are imported directly from the framework's module name, not the PyPI package name.","wrong":"from pyobjc_framework_fskit import FSKExtension","symbol":"FSKExtension","correct":"from FSKit import FSKExtension"}],"quickstart":{"code":"import FSKit\nimport objc # Required for objc.lookUpClass\n\n# FSKit is primarily designed for creating Finder Sync extensions on macOS.\n# A full functional example requires registering an extension with macOS,\n# which is beyond a simple quickstart. This code demonstrates loading\n# the framework and accessing a core class.\n\n# Access a known class from the FSKit framework, e.g., FSKExtension\n# FSKExtension is the base class for implementing Finder Sync extensions.\nFSKExtension_Class = FSKit.FSKExtension\n\nprint(f\"FSKit module loaded: {FSKit}\")\nprint(f\"FSKExtension class type: {type(FSKExtension_Class)}\")\nprint(f\"FSKExtension inherits from NSObject: {issubclass(FSKExtension_Class, objc.lookUpClass('NSObject'))}\")\n\n# To actually use FSKit, you would typically subclass FSKExtension, implement\n# its methods, and configure your macOS application's Info.plist to register\n# it as a Finder Sync extension. This process requires Xcode and specific\n# application bundling and is not shown here.","lang":"python","description":"This quickstart demonstrates how to import the `FSKit` framework and access one of its core classes, `FSKExtension`. Note that fully utilizing FSKit requires creating and registering a Finder Sync Extension within a macOS application bundle, which is a more complex setup not covered in this minimal example."},"warnings":[{"fix":"Upgrade your Python interpreter to version 3.10 or later. For older Python versions, use PyObjC versions compatible with your Python (e.g., PyObjC 11 for Python 3.9, PyObjC 10 for Python 3.8).","message":"Python 3.9 support was dropped in PyObjC 12.0. Ensure your Python environment is 3.10 or newer. Earlier versions (PyObjC 11.0) dropped Python 3.8 support.","severity":"breaking","affected_versions":">=12.0 for Python 3.9, >=11.0 for Python 3.8"},{"fix":"Review code that directly calls Objective-C `init` methods or manually manages references. Ensure proper `retain`/`release` semantics are implicitly or explicitly handled according to ARC rules.","message":"PyObjC 11.1 aligned its behavior with `clang`'s automatic reference counting (ARC) documentation for initializer methods. Methods in the 'init' family now correctly steal a reference to self and return a new reference, which might change memory management expectations for advanced users interacting directly with ObjC `init` patterns.","severity":"breaking","affected_versions":">=11.1"},{"fix":"If implementing custom class instantiation, define your own `__new__` method to ensure `__init__` can be called. Be aware that PyObjC-provided `__new__` implementations might still prevent `__init__` from being called in certain scenarios.","message":"In PyObjC 10.3, calling `__init__` on classes where `__new__` was provided by PyObjC was disabled. This was partially reverted in 10.3.1, reintroducing the ability to use `__init__` when a user implements `__new__`. However, `__init__` still cannot be used when `__new__` is provided by PyObjC and not overridden by the user.","severity":"gotcha","affected_versions":"10.3, 10.3.1"},{"fix":"Remove any dependencies on the `IMServicePlugIn` framework. If its functionality is still required, investigate alternative macOS APIs (if available) or adjust application architecture.","message":"The `IMServicePlugIn` bindings were entirely removed in PyObjC 10.0, as the framework was deprecated in macOS 10.13 and removed in macOS 14. Any code relying on this framework will fail.","severity":"breaking","affected_versions":">=10.0"}],"env_vars":null,"last_verified":"2026-04-14T00:00:00.000Z","next_check":"2026-07-13T00:00:00.000Z","problems":[]}