在使用自定义SDK库调用内部API的应用程序中,我们尝试使用AppAuth来实现用户访问。我将提供一些上下文:我们的应用程序依赖于我们的库,该库将AppAuth添加为依赖项。
使用它可以很好地管理登录,在我们的应用清单中声明RedirectUriReceiverActivity的替换项,如下所示:
<activity
android:name="net.openid.appauth.RedirectUriReceiverActivity"
tools:node="replace">
<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:path="//example"
android:scheme="${applicationId}"
tools:ignore="GoogleAppIndexingUrlError" />
</intent-filter>
</activity>
这可以按预期工作,一旦在ChromeTab中完成登录过程,就会自动启动活动。
但是,一旦我们尝试执行与登出类似的操作,事情就会开始崩溃。我们在ChromeTab中打开注销网页,并通过以下活动(来自我们图书馆清单中的代码)收听重定向:
<activity android:name=".access.activities.MyAuthLogoutComplete"
android:exported="true">
<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="${logoutScheme}" />
</intent-filter>
</activity>
然后,在我们的应用清单中,我们以如下方式声明该活动:
<activity android:name="com.elcorteingles.ecisdk.access.activities.MyAuthLogoutComplete"
tools:node="replace">
<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:path="//logout"
android:scheme="${applicationId}"
tools:ignore="GoogleAppIndexingUrlError" />
</intent-filter>
</activity>
所有这些实现都是(大致)按照在AppAuth中的实现方式执行的。
在声明此新的Intent过滤器后,登录和注销行为均相同。每当有效的意图过滤器进入系统时,我们的应用程序和自定义库都会在选择对话框中显示为响应者,就好像两者都已注册为接收该事件一样。在进一步模式下,两者似乎具有相同的程序包名称(我们应用程序的名称)。
很明显,这是由于在最终的清单中声明此类活动并替换其代码时缺少了某些内容,但到目前为止,我一直没有发现发生的情况。
提前谢谢!