hrydgard / ppsspp

A PSP emulator for Android, Windows, Mac and Linux, written in C++. Want to contribute? Join us on Discord at https://discord.gg/5NJB6dD or just send pull requests / issues. For discussion use the forums at forums.ppsspp.org.
https://www.ppsspp.org
Other
10.76k stars 2.12k forks source link

UPnP Incompatibility with iOS 17.x+ #19246

Open yzsnes opened 3 weeks ago

yzsnes commented 3 weeks ago

Game or games this happens in

None

What area of the game / PPSSPP

Attempting to enable UPnP under networking settings will give a "Unable to find UPnP device" error regardless if the router has UPnP enabled or not.

What should happen

The application should be able to detect the router as a UPnP device and allow for online play

Logs

No response

Platform

iOS

Mobile device model or graphics card (GPU)

iPhone 15

PPSSPP version affected

v1.17.1-491-g9cdd97c13b

Last working version

No response

Graphics backend (3D API)

Vulkan

Checklist

hrydgard commented 3 weeks ago

Same issue, it seems:

https://forums.ppsspp.org/showthread.php?tid=29904

anr2me commented 3 weeks ago

May be try to update the miniupnp repo, there might be new commits there

hrydgard commented 3 weeks ago

A lot of new commits actually. Can someone test the PR? #19249

anr2me commented 3 weeks ago

Here is the iOS IPA artifact (for testing) generated after that PR https://github.com/hrydgard/ppsspp/actions/runs/9375693751/artifacts/1568951264

yzsnes commented 3 weeks ago

No luck! UPnP seems to work on my desktop but is still giving me an error on the test build.

Screenshot 2024-06-04 at 8 47 56 PM

Something else that was mentioned in forum threads discussing the issue was the UPnP timeout, which might be a factor here. Worth mentioning is that the app does request permission to view devices on the local network.

anr2me commented 3 weeks ago

Did you gave the permission? because UPnP use SDDP (Simple Device Discovery Protocol) through UDP port 1900 to detect UPnP-compatible devices as i remembered.

anr2me commented 3 weeks ago

May be similar issue to this https://superuser.com/questions/1512639/upnp-server-behind-firewall-wont-show-up-in-ios-apps

I'm in the middle of setting up a server net at home. The firewall between user and server net does UPnP-Routing via smcroute (and firewalling with iptables plus ipset). All in all it works perfectly. On my PCs and on my Android phone the media server (minidlna) gets found an serves the media files without question. Only the iOS devices (iPad and iPhone) make trouble. VLC recognizes the server here too, but the iOS version doesn't support resuming to an earlier timestamp after stopping the video. And two other apps don't find the server (in particular XtremePlayer which would be the first choice).

Something related to TTL ? not sure how to change that programmatically (may be using setsockopt with IP_TTL as parameter), especially since we don't have access to the miniupnp's socket, but the default TTL on iOS is 64 i think, so shouldn't be an issue (unless it's changed recently on newer iOS)

Finally with help from another forum I was able to identify the cause of this malfunction. The players that won't find the server send request packets with a TTL of 1 on the IP layer. Hence they aren't routable at all... The functioning ones (e.g. VLC) use higher values for TTL (in the case of VLC: 4). So, albeit I'm not able to fix this for good now I'm glad to know what's going on.

But it's old issue from 2019, so not sure.

yzsnes commented 3 weeks ago

Yes, I gave PPSSPP access to the local network. There's one or two posts I've seen of people able to use multiplayer, and a guide from about 2 or 3 months ago on how to connect to the soccom.cc servers using a modified IPA and specific add-on;

https://youtu.be/yvMXzTuwnvE?si=o1n3VAT_-L2LqWov

anr2me commented 3 weeks ago

Yes, I gave PPSSPP access to the local network. There's one or two posts I've seen of people able to use multiplayer, and a guide from about 2 or 3 months ago on how to connect to the soccom.cc servers using a modified IPA and specific add-on;

https://youtu.be/yvMXzTuwnvE?si=o1n3VAT_-L2LqWov

Is that version still have working UPnP on your test? because it's only modified to support infrastructure i think, and the add-on you mean is the infra_plugin, right?

anr2me commented 3 weeks ago

Btw the PR that expose UPnP timeout in networking settings is here https://github.com/hrydgard/ppsspp/pull/18867 But it was tested before and reported not to have a difference (although it uses an older version of miniupnp library during the test)

anr2me commented 3 weeks ago

This might also be related (Multicast Networking entitlement issue?) https://forums.developer.apple.com/forums/thread/661606

However, I'm concerned about the app currently in production on the App Store, and how it behaves on various versions of iOS. Especially, it seems our app (built with Xcode 11) is still able to send multicast requests even if run on an iOS 14 device. However the app built with Xcode 12 systematically fails to send requests on the local network (through CFSocketSendData) on the same iOS 14 device, the local network access being properly granted by the user.

May be we need to add the com.apple.developer.networking.multicast key in the Info.plist file, like:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.developer.networking.multicast</key>
    <true/>
</dict>
<dict/>
</plist>

But the Info.plist file inside the IPA seems to have a different content than the one in source code, was it auto-generated?

anr2me commented 3 weeks ago

@yzsnes try this IPA. i only modified the Info.plist inside the IPA from the artifact above https://www.dropbox.com/scl/fi/lj97osa8ubq4zc8qcdukb/PPSSPP-iOS.zip?rlkey=jwr9j5x2wgnfy8bwvgfvx1zbn&st=ormahmcl&dl=0

PS: because i edited the file on Windows, the Info.plist attributes became different than it was, so not sure whether the new attribute will be accepted by iOS or not. image

Edit: oops i put the com.apple.developer.networking.multicast key at the wrong location, reuploading the zip now.

anr2me commented 3 weeks ago

Okay, here is iOS artifacts with com.apple.developer.networking.multicast included in it's Info.plist generated from this branch/PR https://github.com/ANR2MERefork/ppsspp/pull/12 so there won't be file attribute issue here

iOS artifact: https://github.com/ANR2MERefork/ppsspp/actions/runs/9378116947/artifacts/1569463815

Halo-Michael commented 3 weeks ago

Okay, here is iOS artifacts with com.apple.developer.networking.multicast included in it's Info.plist generated from this branch/PR ANR2MERefork#12 so there won't be file attribute issue here

iOS artifact: https://github.com/ANR2MERefork/ppsspp/actions/runs/9378116947/artifacts/1569463815

Entitlements should bundle into code sign, not in Info.plist, see also: https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_networking_multicast?changes=l__9&language=objc This entitlements only allowed request by "Apple Developer". Which means sideload users signing without an "paid Apple Developer Account" can't get this work. AppStore users not affected because you have already paid for that. But you do need add a local network desciption (NSLocalNetworkUsageDescription) in Info.plist for upload to AppStore: 1f5c62f0bad105053b3eff5051d6d0c6 See also: https://developer.apple.com/documentation/bundleresources/information_property_list/nslocalnetworkusagedescription?language=objc C23A9C7C-1A22-4359-A4EE-BF4CCC01E675 It's requested in iOS14.0+. cc @hrydgard

hrydgard commented 3 weeks ago

Oh! I'll make sure to add that for the next update.

hrydgard commented 3 weeks ago

Oh right, I have to ask Apple for the entitlement too. Will do, hopefully they'll accept.

anr2me commented 3 weeks ago

Is this mean only PPSSPP Gold users will be able to detects UPnP properly? It will make debugging app that use broadcast/multicast became difficult isn't? (since debug builds will most-likely being sideloaded)

hrydgard commented 3 weeks ago

I've put in requests for both the free version and the gold version (both App Store versions).

As for sideloaded builds, I don't know how to solve that.

Halo-Michael commented 3 weeks ago

Is this mean only PPSSPP Gold users will be able to detects UPnP properly? It will make debugging app that use broadcast/multicast became difficult isn't? (since debug builds will most-likely being sideloaded)

...No You are pay for Apple, not for PPSSPP

anr2me commented 3 weeks ago

You mean as long the App ID is the same one with the one having the entitlement provisioned it will also works when sideloaded?

Halo-Michael commented 3 weeks ago

You mean as long the App ID is the same one with the one having the entitlement provisioned it will also works when sideloaded?

Yes

Halo-Michael commented 3 weeks ago

1b0f3d26a0957bf1adb3f4d9349eab9b How about unity the style? cc @hrydgard

hrydgard commented 3 weeks ago

Hm, we don't use the same app ID, but could change the sideload versions' ID though.

OK, I'll move them together and make more similar.

anr2me commented 3 weeks ago

The com.apple.developer.networking.multicast also need to be added to Entitlements.plist too isn't? something like https://github.com/hrydgard/ppsspp/blob/master/macOS/Entitlements.plist

Edit: probably not, since adding it manually could cause signing issue according to this https://stackoverflow.com/questions/76591665/is-it-enough-to-add-entitlements-manually

The entitlement needs to be added to your provisioning profile in the Apple developer portal. You can't add the entitlement until Apple has approved it and made it available to add to your provisioning profile. If you add the entitlement manually to your entitlements plist then you will get a code signing failure because the entitlements file does not match the provisioning profile.

Halo-Michael commented 3 weeks ago

The com.apple.developer.networking.multicast also need to be added to Entitlements.plist too isn't? something like https://github.com/hrydgard/ppsspp/blob/master/macOS/Entitlements.plist

Edit: probably not, since adding it manually could cause signing issue according to this https://stackoverflow.com/questions/76591665/is-it-enough-to-add-entitlements-manually

The entitlement needs to be added to your provisioning profile in the Apple developer portal. You can't add the entitlement until Apple has approved it and made it available to add to your provisioning profile. If you add the entitlement manually to your entitlements plist then you will get a code signing failure because the entitlements file does not match the provisioning profile.

Read this: https://github.com/hrydgard/ppsspp/issues/19246#issuecomment-2149122671 See also: https://developer.apple.com/documentation/bundleresources/entitlements?language=objc

hrydgard commented 2 weeks ago

I got approval for both the App Store versions to use multicast. So, hopefully it'll start working after the next update, if it hasn't already? I'm not sure what else I need to do.