wi3land / ionic-appauth

Intergration for OpenId/AppAuth-JS into Ionic V3/4/5
MIT License
98 stars 73 forks source link

Some help to get ionic-appauth to work on Android after upgrading from Capacitor V2 to Capacitor V3 #81

Open wrzr123 opened 2 years ago

wrzr123 commented 2 years ago

Hey,

yesterday I was upgrading my Ionic app from Capacitor 2 to Capacitor 3, and I was struggeling a long time to get the redirect to work from my identity provider back to the app on a real Android device. I just want to document this for others who maybe also run into the same problem, so maybe it can just be transfered into some readme or stay here for others to be found.

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="@string/custom_url_scheme" />
</intent-filter>

This is necessary to make the redirect back to the app work. It's not necessary to replace anything here with your own app-Id, it works like that. It's strange, but with Capacitor 2 these lines were inserted automatically in the manifest. Now with Capacitor 3 you have to enter it manually.

Ben555555 commented 2 years ago

Thanks for your contribution. I faced a similar issue, when using the demo for capacitor. On the mobile the device the InAppBrowser does not return to the app. I just get a blank screen. I tried to add your second intent-filter to the AndroidManifest.xml, but it still doesn't work. The file is located under angular-android\app\src\main\AndroidManifest.xml and looks like this:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.appauth.demo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"
            android:name="com.appauth.demo.MainActivity"
            android:label="@string/title_activity_main"
            android:theme="@style/AppTheme.NoActionBarLaunch"
            android:launchMode="singleTask">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="@string/custom_url_scheme" />
            </intent-filter>
        </activity>

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths"></meta-data>
        </provider>
    </application>

    <!-- Permissions -->

    <uses-permission android:name="android.permission.INTERNET" />
</manifest>

Do I have to add anything else here?

Ben555555 commented 2 years ago

I was able to solve the issue by adding those 2 intents:

 <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="appauth" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:host=" " android:pathPrefix="/" android:scheme=" " />
            </intent-filter>
wellwoller commented 1 year ago

@Ben555555 @wrzr123 Would you be so kind and post the content of your string file? I cant get this package to work and am really desperate. Also, did you make any changes since the update?

wrzr123 commented 1 year ago

What do you mean by string file? Meanwhile we're at capacitor 4 and Android SDK 13, but at least in my AndroidManifest nothing has changed since my initial post.

I just noticed that the following bit: <data android:scheme="@string/custom_url_scheme" /> is misleading. You have to replace "@string/custom_url_scheme" with you app ID, e.g. com.yourAppName.app. That was automatically replaced while I copied from my AndroidManifest to my GitHub-Post here.

wellwoller commented 1 year ago

@wrzr123 Sadly that doesnt solve my problem. Could you tell me the content of your capacitor.config.ts? Mine is: appId: 'de.mydomain.myapp.app', appName: 'myappname', webDir: 'www', bundledWebRuntime: false, server: { iosScheme: "ionic", hostname: "de.mydomain.myapp.app" }

wrzr123 commented 1 year ago

I don't think it helps but here you go

{
  "appId": "com.myAppName.app",
  "appName": "myAppName",
  "bundledWebRuntime": false,
  "npmClient": "npm",
  "webDir": "www/de",
  "android": {
    "path": "android/app/src/main/assets/public"
  },
  "plugins": {
    "SplashScreen": {
      "launchShowDuration": 0
    }
  },
  "cordova": {}
}