1 Reply
      Latest reply on Jan 10, 2019 4:51 PM by john daniel
      Jordan Level 1 Level 1 (0 points)

        I am trying to figure out how to programatically install a per-user launchd agent - I have an executable Swift script I wrote and I need macOS to enforce it always be running. I found the SMJobBless sample code which I could play with to see how this works, but it hasn't been updated since it was last built with Xcode 4.6. As you can imagine it doesn't compile in Xcode 10. I was able to get it to build by upgrading to the recommended project settings, increasing the deployment target, and selecting my team for the two targets. Following the ReadMe I need to run ./SMJobBlessUtil.py setreq to configure the Info.plists appropriately. These instructions are out of date but eskimo was kind enough to provide updated instructions here to find the .app url. But when I do this and run the command I receive the following output:

         

        MacBook:SMJobBless Jordan$ ./SMJobBlessUtil.py setreq /Users/Jordan/Library/Developer/Xcode/DerivedData/SMJobBless-dffakkidazmiowcishyrborysygm/Build/Products/Debug/SMJobBlessApp.app SMJobBlessApp/SMJobBlessApp-Info.plist SMJobBlessHelper/SMJobBlessHelper-Info.plist
        Traceback (most recent call last):
          File "./SMJobBlessUtil.py", line 424, in 
            main()
          File "./SMJobBlessUtil.py", line 418, in main
            setreq(appArgs[1], appArgs[2], appArgs[3:])
          File "./SMJobBlessUtil.py", line 360, in setreq
            appToolDict[bundleID] = toolNameToReqMap[bundleID]
        KeyError: '$(PRODUCT_BUNDLE_IDENTIFIER)'

        It would seem this python script isn't able to work with the newer project structures, not surprisingly. I wasn't able to find any other information on how to accomplish this task in the modern days. So could you please explain how to go about this?

         

        I have an executable .swift file and a .plist that works when loaded from ~/Library/LaunchAgents/ ready to be added to an existing Xcode project. Thanks!