Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

V1.8.0 on iOS #11905

Closed
thorieo opened this issue Mar 17, 2019 · 72 comments
Closed

V1.8.0 on iOS #11905

thorieo opened this issue Mar 17, 2019 · 72 comments

Comments

@thorieo
Copy link

thorieo commented Mar 17, 2019

I’d love to help out in porting 1.8 or a 1.9 build to iOS. I’m gonna be honest I have no experience building apps or emulators but I’m basically proficient in most areas of Xcode and Opendev so if anyone can point me along or who I can help out I’d love you forever

@unknownbrackets
Copy link
Collaborator

Your interest is very welcome. It should be a matter of building it, mainly. There are instructions here:

https://github.com/hrydgard/ppsspp/wiki/Build-instructions#building-for-ios-cmake

There are some issues that only affect iOS.

One (I wouldn't suggest trying to tackle this, just making you aware) is that since Apple doesn't allow applications to use jit by default, we use a workaround that enables jit on some OS versions / some jailbreak versions:

syscall(SYS_ptrace, 0 /*PTRACE_TRACEME*/, 0, 0, 0);

However, this same workaround (although it makes it faster) has the downside of not working on newer iOS versions (afaik) and also causing the app to hang when closed by the task switcher.

-[Unknown]

@andyroid1023
Copy link

Before compiling your build, maybe you can apply this fix and maybe it can solve issues #9186 (comment)

@jeeeyul
Copy link
Contributor

jeeeyul commented Mar 21, 2019

syscall(SYS_ptrace, 0 /*PTRACE_TRACEME*/, 0, 0, 0); 

Above code enables W^X JIT. However newer iOS SDK seems to inject some assertion code dynamically when build PPSSPP. Those code seems to assert code signature validity of dynamically compiled code.

I could see log:

기본	16:08:45.028019 +0900	assertiond	[PPSSPP:409] Got exit context: <BKSProcessExitContext: 0x135e1c940; reason: badSignature>
기본	16:08:45.028039 +0900	SpringBoard	<FBApplicationProcess: 0x10a90c4a0; PPSSPP (org.ppsspp.ppsspp); pid: 409> assertiond says the process actually exited with context: <BKSProcessExitContext: 0x283887b60; reason: badSignature>
기본	16:08:45.028059 +0900	SpringBoard	<FBApplicationProcess: 0x10a90c4a0; PPSSPP (org.ppsspp.ppsspp); pid: 409> exited due to an invalid code signature.
기본	16:08:45.028188 +0900	SpringBoard	Removing: <FBApplicationProcess: 0x10a90c4a0; PPSSPP (org.ppsspp.ppsspp); pid: 409>
기본	16:08:45.028207 +0900	SpringBoard	Process exited: <FBApplicationProcess: 0x10a90c4a0; PPSSPP (org.ppsspp.ppsspp); pid: -1> -> <FBApplicationProcessExitContext: 0x28379c9f0; exitReason: badSignature; terminationReason: (none)> {
    stateAtExit = <FBProcessState: 0x283a8f780; pid: 409; taskState: Not Running; visibility: Unknown>;
}

So iOS seems to kill PPSSPP few second after JIT has began.

I think It's not runtime restriction. When I build it with old SDK, It runs well on iOS 12.2 beta device also with W^X JIT.

@andyroid1023
Copy link

According to this issue: #11881, commenting out syscall(SYS_ptrace, 0 /PTRACE_TRACEME/, 0, 0, 0); solved the problem

@unknownbrackets
Copy link
Collaborator

According to this issue: #11881, commenting out syscall(SYS_ptrace, 0 /PTRACE_TRACEME/, 0, 0, 0); solved the problem

I assume you mean solved the exit problem, not actually allowing jit. Or do you mean that you're able to use jit without this in some iOS version? It sounds like from @jeeeyul's comment that this isn't likely.

However newer iOS SDK seems to inject some assertion code dynamically when build PPSSPP.

This makes sense, and probably explains why some users have said it's still working while others say it doesn't. Thanks for checking into this.

Are we already targeting the old SDK by default in CMake or do we need to make that more explicit? I realize that eventually it won't be supported anymore.

-[Unknown]

@mattkerrison
Copy link

I'd LOVE for 1.8 to make it's way to ios, @thorieo please keep us posted!

@jeeeyul
Copy link
Contributor

jeeeyul commented Mar 22, 2019

At least, I could launch PPSSPP 1.7.1 with W^X JIT on my iOS 12.2 beta device.

  1. Install Xcode 9.4 from here
  2. Launch latest Xcode(for me, it's 10.2 b4)
  3. In Xcode preference, in Locations tab, choose Command Line Tool as Xcode 9.4.1
  4. Quit the Xcode.
  5. Generate xcode project using cmake -DCMAKE_TOOLCHAIN_FILE=./cmake/Toolchains/ios.cmake -DIOS_PLATFORM=OS -H. -Bbuild.ios -GXcode
  6. Open the project with Xcode(10.2 b4).
  7. Change Singing Identity with own.
  8. Build and launch.
  9. Works well.

I will test with latest PPSSPP later and I will tell more.

@jeeeyul
Copy link
Contributor

jeeeyul commented Mar 22, 2019

The unwelcome friend who injects unwanted code that disables JIT comes with iOS12.1 SDK. NOT iOS itself.

AppStore will force 12.1 or above SDK from 27 March.

@iOS4all
Copy link

iOS4all commented Mar 22, 2019

Sorry fo noob question.
I’m just wondering what is the different between W^X and X^Y JIT? Also which one is better for performance?

@hrydgard
Copy link
Owner

hrydgard commented Mar 22, 2019

There's no such thing as X^Y jit, there's normal jit (fastest, used when we can map pages as Read, Write, eXecutable) and W^X jit (where Write and eXecute are mutually exclusive, that is, only one can be enabled at a time for a page of code, requiring special handling).

@jeeeyul
Copy link
Contributor

jeeeyul commented Mar 22, 2019

Sorry for typo. @hrydgard is correct.

@andyroid1023
Copy link

Any hopes or updates on this?

@iOS4all
Copy link

iOS4all commented Mar 23, 2019

There's no such thing as X^Y jit, there's normal jit (fastest, used when we can map pages as Read, Write, eXecutable) and W^X jit (where Write and eXecute are mutually exclusive, that is, only one can be enabled at a time for a page of code, requiring special handling).

Thank you so much for clarification.

@devinprater
Copy link

For me even with IR interpretor, PPSSPP runs perfectly on my iPhone X R. There is one game that hangs after character and stage selection, Soul Calibur, Broken Destiny, but all other games I've tried, Mortal Kombat Unchained, Dissidia Final Fantasy and Duodecim, Tekken 6, all run perfectly. I know GIT will help older devices, but it may not be as big of a need.

@hrydgard
Copy link
Owner

Well yeah, those Apple CPUs are becoming ridiculously fast so for the latest ones the IR interpreter is a decent option.

@DrConflict
Copy link

DrConflict commented Mar 24, 2019

Really hoping this can be figured out soon and someone compiles the latest versions. Would really love to have 1.8 on both iOS and Mac OS. It seems crazy with a high quality project like this to not have versions compiled for both iOS and Mac OS every time a big update number is released. The PPSSPP community is huge, I'm sure there is someone who can figure this out.

@hrydgard
Copy link
Owner

@DrConflict It would help a lot with motivation if Apple didn't ban emulators fully from their stores. I prefer to support platforms where emulators are officially allowed, Apple will always be an afterthought.

@DrConflict
Copy link

@hrydgard
I totally understand your point, and I agree with you. It's just sad that the iOS and Mac community has to miss out because of it though. PPSSPP still has an active Cydia repo as well which makes things a bit confusing. I assumed those were latest builds until I figured out the project was at 1.8.0 haha. I do appreciate all the work though, I'll be using 1.6.3 for now which works great anyway. Cheers

@devinprater
Copy link

devinprater commented Mar 24, 2019 via email

@hrydgard
Copy link
Owner

@DrConflict Sad or not it's what it is until Apple changes their mind. And I understand the confusion, the official Cydia repo was maintained by a volunteer who has mostly disappeared. Need to do something about that (not the disappearance, the repo).

@jeeeyul
Copy link
Contributor

jeeeyul commented Mar 26, 2019

I could build and run PPSSPP 1.8.0 on iOS 12.2 with W^X JIT just now.

All the things that I did:

  • Use Xcode 9.4 toolchain. (iOS11.4 SDK)
  • Disables animated exit from main.mm, It causes stopping JIT in background that will cause freezing. So it will fixes freezing problem when user tap Exit button.
  • Some changes in ViewController.mm: Just simple changes that enables that user can tap edge areas.

main.mm

// main.mm boilerplate

#import <UIKit/UIKit.h>
#import <string>
#import <stdio.h>
#import <stdlib.h>
#import <sys/syscall.h>
#import <AudioToolbox/AudioToolbox.h>

#import "AppDelegate.h"
#import "PPSSPPUIApplication.h"
#import "ViewController.h"

#include "base/NativeApp.h"
#include "profiler/profiler.h"

std::string System_GetProperty(SystemProperty prop) {
    switch (prop) {
        case SYSPROP_NAME:
            return "iOS:";
        case SYSPROP_LANGREGION:
            return "en_US";
        default:
            return "";
    }
}

int System_GetPropertyInt(SystemProperty prop) {
    switch (prop) {
        case SYSPROP_AUDIO_SAMPLE_RATE:
            return 44100;
        case SYSPROP_DISPLAY_REFRESH_RATE:
            return 60000;
        case SYSPROP_DEVICE_TYPE:
            return DEVICE_TYPE_MOBILE;
        default:
            return -1;
    }
}

bool System_GetPropertyBool(SystemProperty prop) {
    switch (prop) {
        case SYSPROP_HAS_BACK_BUTTON:
            return false;
        case SYSPROP_APP_GOLD:
#ifdef GOLD
            return true;
#else
            return false;
#endif
        default:
            return false;
    }
}

void System_SendMessage(const char *command, const char *parameter) {
    if (!strcmp(command, "finish")) {
        exit(0);
    }
}

void System_AskForPermission(SystemPermission permission) {}
PermissionStatus System_GetPermissionStatus(SystemPermission permission) { return PERMISSION_STATUS_GRANTED; }

FOUNDATION_EXTERN void AudioServicesPlaySystemSoundWithVibration(unsigned long, objc_object*, NSDictionary*);

BOOL SupportsTaptic()
{
    // we're on an iOS version that cannot instantiate UISelectionFeedbackGenerator, so no.
    if(!NSClassFromString(@"UISelectionFeedbackGenerator"))
    {
        return NO;
    }
    
    // http://www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with-uifeedbackgenerator/
    // use private API against UIDevice to determine the haptic stepping
    // 2 - iPhone 7 or above, full taptic feedback
    // 1 - iPhone 6S, limited taptic feedback
    // 0 - iPhone 6 or below, no taptic feedback
    NSNumber* val = (NSNumber*)[[UIDevice currentDevice] valueForKey:@"feedbackSupportLevel"];
    return [val intValue] >= 2;
}

void Vibrate(int mode) {
    
    if(SupportsTaptic())
    {
        PPSSPPUIApplication* app = (PPSSPPUIApplication*)[UIApplication sharedApplication];
        if(app.feedbackGenerator == nil)
        {
            app.feedbackGenerator = [[UISelectionFeedbackGenerator alloc] init];
            [app.feedbackGenerator prepare];
        }
        [app.feedbackGenerator selectionChanged];
    }
    else
    {
        NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
        NSArray *pattern = @[@YES, @30, @NO, @2];
        
        dictionary[@"VibePattern"] = pattern;
        dictionary[@"Intensity"] = @2;
        
        AudioServicesPlaySystemSoundWithVibration(kSystemSoundID_Vibrate, nil, dictionary);
    }
}

int main(int argc, char *argv[])
{
    // Simulates a debugger. Makes it possible to use JIT (though only W^X)
    syscall(SYS_ptrace, 0 /*PTRACE_TRACEME*/, 0, 0, 0);
    
    PROFILE_INIT();
    
    @autoreleasepool {
        NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSString *bundlePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/assets/"];
        
        NativeInit(argc, (const char**)argv, documentsPath.UTF8String, bundlePath.UTF8String, NULL);
        
        return UIApplicationMain(argc, argv, NSStringFromClass([PPSSPPUIApplication class]), NSStringFromClass([AppDelegate class]));
    }
}

ViewController.mm

-(UIRectEdge)preferredScreenEdgesDeferringSystemGestures
{
    return UIRectEdgeAll;
}

iOS 12.1 SDK seems to inject some assertion code when build just like ARC mechanism. This assertion cause killing the app when JIT code runs. So we have to use iOS12.0 SDK or below. I'v done with iOS 11.4SDK (ships with Xcode 9.4)

In my inference, X^W JIT works on iOS because iOS think it's currently debugging by Xcode, PTRACE makes this available. (Debugging feature needs dynamic code evaluation to provide expression debugging - likes po command, So I think iOS allows JIT for this reason)

Calling PTRACE seems to play a role in deceiving iOS.

However, Some context, iOS waits signals from Xcode forever, I think this makes freezing. This may explain why PPSSPP works and terminate well when it attached with Xcode debugger.


All of these information are just came from my pure inference. If anyone find some error, please correct this.

@jeeeyul
Copy link
Contributor

jeeeyul commented Mar 26, 2019

By the way, Apple will not change their mind. Even Apple allows emulators on AppStore, Allowing unsigned code running is too dangerous for normal users. All the problems related with JIT will remain.

The only official way to run dynamic code is using ScriptKit.

@andyroid1023
Copy link

andyroid1023 commented Mar 26, 2019

Are you planning to compile an IPA for 1.8.0 and post it here? I would be happy to test it for you

@jeeeyul
Copy link
Contributor

jeeeyul commented Mar 26, 2019

@andyroid1023 I’ve already post everything those are needed to run PPSSPP1.8.0 on iOS 12.2. I wonder what you need to test.

@DrConflict
Copy link

@jeeeyul Can you upload the 1.8.0 PPSSPP iOS .ipa file so people can start testing it please?! I don't understand why you would not post the actual .ipa as well if you said you got it working. Thanks in advance.

@coolstar
Copy link

coolstar commented Mar 26, 2019

On the iOS 11 & 12 Electra jailbreaks, it isn't required to call syscall 26 (and I recommend you don't, otherwise iOS will keep the process hung rather than exit it when you try and exit PPSSPP). Electra already disables codesigning completely in PPSSPP; so just don't run the syscall and everything will continue working fine.

You can detect if it's bring run under Electra using csops:

#define CS_OPS_STATUS       0   /* return status */
#define CS_DEBUGGED         0x10000000  /* process is currently or has previously been debugged and allowed to run with invalid pages */

int csops(pid_t pid, unsigned int  ops, void * useraddr, size_t usersize);

uint32_t flags;
csops(getpid(), CS_OPS_STATUS, &flags, 0);
if (flags & CS_DEBUGGED){
  //being run either under a debugger or under Electra already
}

@unknownbrackets
Copy link
Collaborator

That makes sense. Want to send a PR wrapping the ptrace in that?

Also, @jeeeyul - I'm guessing the animatedExit isn't a big loss, might be good to PR that if it makes Exit more stable too.

-[Unknown]

@jeeeyul
Copy link
Contributor

jeeeyul commented Mar 27, 2019

@coolstar @unknownbrackets I made a PR #11942 for this discussion.

@Halo-Michael
Copy link
Contributor

I wrote a simple ppsspp build tool. :P
https://github.com/Halo-Michael/ppsspp-builder
Hope this will help you.

@kpalczewski
Copy link

kpalczewski commented Jul 19, 2019

hey, I have found a way to exit ppsspp without it hanging. works every time.
I go to ppsspp menus and tap "buy ppssppgold" or "www.ppsspp.org" on main screen. This opens safari webbrowser. I am able to lauch ppsspp and it still works. no need to reboot.

ppsspp version that I have on device:
last commit: 37a97e7
date build: 19.07.2019
Xcode version: 10.2.1
hardware: iphone 7
iOS: 12.3.1 without jailbreak

Maybe this will guide you to some great workaround to be able to quit ppsspp and still use jit.

@mariolopjr
Copy link

mariolopjr commented Jul 31, 2019

@Halo-Michael Having a separate builder and using Xcode to change the default version (and then change it back) is not necessary. All that needs to be done is the following:

  1. Follow PPSSPP cloning instructions
  2. Download Xcode 9.4.1 from https://developer.apple.com/download/more/, extract from .xip file, rename to Xcode-9.4.1, and copy to Applications
  3. Run the following command (instead of the one from the wiki):
    cmake -DCMAKE_TOOLCHAIN_FILE=./cmake/Toolchains/ios.cmake -DIOS_PLATFORM=OS -DCMAKE_IOS_SDK_ROOT=/Applications/Xcode-9.4.1.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk -H. -Bbuild.ios -GXcode
  4. Navigate to build.ios, open PPSSPP.xcodeproj in Xcode-9.4.1, set the signing stuff, and then build the app
  5. Install the .app as necessary, or navigate to the built .app, create Payload folder and move .app into it, and create an ipa using the following command zip -r9 PPSSPP.ipa Payload/PPSSPP.app, and use Cydia Impactor to install.

You should have an updated PPSSPP version, built on iOS 11 SDK (that should help with crashes)!

PS: If this should belong in the wiki as an aside, I don't mind writing this up in a more helpful, friendly way for others to use. :)

EDIT: Tweaked some things, fixed some stuff, clarified items, etc. ;)

@hrydgard
Copy link
Owner

@mariolopjr Yeah, that should be in the wiki. I could just copy-paste what you wrote above, but if you want to rewrite it or something first, be my guest :)

@mariolopjr
Copy link

@hrydgard Yeah, let me get something that makes a little more sense. It's a bit involved in comparison to the default instructions. I can say tho, it works extremely well. I really appreciate the work you've done with PPSSPP, it's absolutely amazing (and brings me back to my middle school days!). It's a shame Apple doesn't allow emulators on the store, I am sure with your bank of $$$$, they can figure out how to allow arbitrary code execution with JIT in a sandboxed app.

Thanks again!

@hrydgard
Copy link
Owner

hrydgard commented Aug 26, 2019

@mariolopjr I'm just gonna copy it to the wiki as-is - ping me if you write a better version :)

https://github.com/hrydgard/ppsspp/wiki/Build-instructions

@mariolopjr
Copy link

@hrydgard thanks that’s a good idea! I got a little busy and now dealing with the incoming hurricane haha. I will take a look and iterate on the instructions if they seem too difficult or if others have suggestions!

@devinprater
Copy link

With the release of Altstore, perhaps PPSSPP could have a more permanent, and updatable, home for iOS? The repo with created IPA's for PPSSPP is gone now though, and the IPA creator tool fails to run with Xcode 11, and MacOS Mojave:

@DrConflict
Copy link

With the release of Altstore, perhaps PPSSPP could have a more permanent, and updatable, home for iOS? The repo with created IPA's for PPSSPP is gone now though, and the IPA creator tool fails to run with Xcode 11, and MacOS Mojave:

I 100% agree.

@DuIslingr
Copy link
Contributor

DuIslingr commented Oct 6, 2019

@devinprater what tool? I was able to build PPSSPP with XCode 11 with sdk 13 targeting iOS 13 on Catalina.

@unknownbrackets The hanging you described for closing ppsspp with task switch applies whether jit is used or not. I switched to the IR Interpreter and the issue is still present.

Tested on PPSSPP_0v1.9.2-23-g349e64fe3 iPad OS 13.1.2 Compiled with XCode 11 SDK 13 and deployed for iOS 13. Signed with Cydia Impactor and it runs. Jit works as well.

Heres a link to the build if anyone wants to try it.
https://cdn.discordapp.com/attachments/210158337575223297/629532254170775552/PPSSPP_0v1.9.2-23-g349e64fe3.ipa

Make sure to close PPSSPP with the Exit button on the main menu instead of using task switcher otherwise PPSSPP will not work again until you reboot. I did target iOS 13 when building this so I am pretty sure it will only run on iOS 13.

@unknownbrackets
Copy link
Collaborator

I don't know anything about Altstore, it seems like it's not documented how to add apps to it yet. Seems like a good idea, although it won't be able to run jit.

The hack that makes it possible to use jit causes the hanging, whether or not you actually decide to use jit or not. It's not use of jit that causes the hanging.

-[Unknown]

@DuIslingr
Copy link
Contributor

@unknownbrackets Actually I just tested the beta Altstore with my build of PPSSPP and Jit does indeed work. Altstore is basically like Cydia Impactor after all.

@Halo-Michael
Copy link
Contributor

Whether the JIT itself works depends only on whether the system allows you to enable JIT, not how you compile (non-jailbreak mode). iOS11 and 13 seems allowed JIT work but 12 is not.

@DuIslingr
Copy link
Contributor

DuIslingr commented Oct 6, 2019

The conversation earlier in this thread indicates the opposite and that SDK 12.1 at least injected code that prevented the use of Jit. Also remember that there is code in place to trick the device into thinking the app is being debugged which allows Jit to work at all on iOS. So the OS allowing it doesn't even make any sense.

@devinprater
Copy link

devinprater commented Oct 7, 2019 via email

@Halo-Michael
Copy link
Contributor

This tool is what I’m talking about: https://github.com/Halo-Michael/ppsspp-builder https://github.com/Halo-Michael/ppsspp-builder I get these errors in the output file attached.

On Oct 6, 2019, at 1:12 AM, DuIslingr @.***> wrote: @devinprater https://github.com/devinprater what tool? I was able to build PPSSPP with XCode 11 with sdk 13 targeting iOS 13 on Catalina. @unknownbrackets https://github.com/unknownbrackets The hanging you described for closing ppsspp with task switch applies whether jit is used or not. I switched to the IR Interpreter and the issue is still present. — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub <#11905?email_source=notifications&email_token=ADUMTTWLEFEAYG4C5QCO7ETQNF6V7A5CNFSM4G7BGTW2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEAOCLSA#issuecomment-538715592>, or mute the thread https://github.com/notifications/unsubscribe-auth/ADUMTTSVPNHZ2UWFKN7VNU3QNF6V7ANCNFSM4G7BGTWQ.

I think it should work, and I can’t view your error.

@devinprater
Copy link

devinprater commented Oct 7, 2019 via email

@DuIslingr
Copy link
Contributor

DuIslingr commented Oct 8, 2019

@hrydgard @unknownbrackets @mariolopjr With my pull request (#12398 ) edit I am able to generate the project just fine with XCode 11 and SDK 13.1 and it builds fine. So the whole thing about having to download XCode 9.4.1 is unnecessary with this release. I modified the provided command to point to xcode 11.1 and sdk 13.1 and it generates without issue.

Images

Generation

449A83A6-9B82-4B63-9596-9DEBDDA99E8E_1_105_c

6C8638DA-25C7-49EA-80AE-8980017B0185_1_105_c

9D646776-69D1-41E0-A29D-39AE427A1E3D_1_105_c

85D754F9-13C3-493F-AD32-4E026DF2E402_1_105_c

@Halo-Michael
Copy link
Contributor

After merge the pull request #12421 from sbingner, issue #12140 (#12140) can basically be confirmed as a complete fix. Even if you run PPSSPP on non jailbroken device, or if CS_DEBUGGED is not turned on, it will no longer freeze on exit.
I have compiled ipa and deb for it and can use them for testing.
https://github.com/Halo-Michael/halo-michael.github.io/raw/master/ipas/PPSSPP_0v1.9.3-80-g73bf6098e.ipa
https://github.com/Halo-Michael/halo-michael.github.io/raw/master/repo/debs/org.ppsspp.ppsspp-dev-latest_0v1.9.3-80-g73bf6098e_iphoneos-arm.deb

@Yahfz
Copy link

Yahfz commented Nov 17, 2019

@Halo-Michael hey, is there any way you can re-upload the .ipa file again? Those links are expired/broken. Thanks

@Saramagrean
Copy link
Contributor

See download ipas. :)
https://halo-michael.github.io/en_US/

@devinprater
Copy link

devinprater commented Nov 18, 2019 via email

@unknownbrackets
Copy link
Collaborator

Sounds like compiling is working, and we have #12575 for the Altstore path, which seems like the right way forward.

We still need a hero to take over maintaining the iOS port of PPSSPP and making sure Altstore is updated, etc. If anyone wants to volunteer, you're sure to make people happy.

I'm going to close this though as the original issue is resolved and builds are working - I know Cydia isn't being updated, but I think #12575 is the right issue for that.

-[Unknown]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests