I found what I was missing:
My entitlements.plist where missing these two entries:
<key>com.apple.application-identifier</key>
<string>XXXXXXX.com.sample.app</string>
<key>com.apple.developer.team-identifier</key>
<string>XXXXXXX</string>
where XXXXXXX is your developer team id and com.sample.app is your apps bundle identifier.
These values must be the same as in the provisioning profile. You can check those values with this command:
security cms -D -i embedded.provisionprofile | xmllint --xpath "/plist/dict/key[text()='Entitlements']/following-sibling::dict[position()=1]" -
Post
Replies
Boosts
Views
Activity
Thank you very much for your insights.
I have restructured my resources and now have two things in my resources folder:
A folder named jre, containing the jre.
A folder named desktop-1.0 containing the contents of the prior jar file.
To start the java process I am using this code in a binary located in the MacOS Folder. It is the first thing that gets executed
NSBundle* myBundle = [NSBundle mainBundle];
NSString* absPath = [myBundle resourcePath];
NSTask *task = [[NSTask alloc] init];
task.launchPath = [NSString stringWithFormat:@"%@%s", absPath, "/jre/bin/java"];
task.arguments = @[@"-XstartOnFirstThread", @"-cp", [NSString stringWithFormat:@"%@%s", absPath, "/desktop-1.0"], @"software.mayr.rougelike.desktop.DesktopLauncher"];
[task launch];
Now the app can start, but it instantly crashes with this in the error report:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't posix_spawn: error 1'
terminating with uncaught exception of type NSException
abort() called
I suppose that it is either not allowed to start tasks from a sanboxed App or that the java executable is not correctly signed.
I have signed it once with just the
<key>com.apple.security.app-sandbox</key>
<true/>
value, and once with these two:
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
I tried both, because I was not sure if this process needs to keep the same sandbox as the main process, or if it should use a separate one.
access( [task.launchPath UTF8String], X_OK) returns 0.
I used the launchAndReturnError: method you recommended, and it shows me this error:
Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"
Ok, I found something new in the Console.
exec of /Applications/***.app/Contents/Resources/jre/bin/java denied since it was quarantined by Hex\x20Fiend and not approved by Gatekeeper, qtn-flags was 0x00000082
I have a feeling what this means. Originally when uploading my app to the App Store I got this error:
ITMS-90511: CFBundleIdentifier Collision - The Info.plist CFBundleIdentifier value 'net.java.openjdk.cmd' of 'java' is already in use by another application.
I searched around a bit and found that I should replace the CFBundleIdentifier in the java binary with a hex editor. I changed it to something unique under my domain with the same length as net.java.openjdk.cmd. I used Hex Fiend to do that, and apparently that has marked the binary as quarantined. I did not notice that, and the App Store also did not notify me of that. I now used
xattr -d com.apple.quarantine <path/to/java>
to remove the quarantine tag. I am currently uploading the App again to see if that solved the issue.
Ok, that worked. The App now fully works via TestFlight.
Thanks a lot for your support : )
I made a typo in the post, SomePlayerControlDelegate should be CustomControlDelegate of course.
I have found that the coordinator has a property called suspensionReasonsThatTriggerWaiting. The List is not empty, it holds one instance of AVCoordinatedPlaybackSuspensionReason.
__C.AVCoordinatedPlaybackSuspensionReason(_rawValue: AVCoordinatedPlaybackSuspensionReasonUserIsChangingCurrentTime)
Maybe that is the problem? Does someone know about that or how I can tell the coordinator that the time is not being changed?