【发布时间】:2015-11-19 07:45:47
【问题描述】:
我正在我的移动应用上运行某种 OAuth 挑战,流程是这样的:
- 用户输入电子邮件地址并点击“登录”。
- 转到浏览器 -> 按下按钮,此操作会将他重定向回登录活动页面。
更新后(在编辑 2 中),流程来自 SignInActivity -> Browser -> SignInactivity(以上更新)。
这是当前的流程。在SignInActivity中,我使用下面的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="com.alpha.beta" android:host="signin" />
</intent-filter>
问题在于,当单击按钮并且焦点返回到应用程序时,SignIn 视图不显示任何 UI。
编辑 1
PS:因为我使用的是 Xamarin,所以代码在 c# 中。
我被要求发布一些代码,但这有点难。这是我所拥有的:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.AlphaBeta.AlphaBeta" android:versionName="1.1.1" android:versionCode="7">
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="19" />
<application android:name="AlphaBeta.Application" android:label="AlphaBeta" android:icon="@drawable/icon" android:debuggable="true">
<activity android:label="@string/appName" android:name="AlphaBeta.SignInActivity" android:screenOrientation="portrait" android:configChanges="orientation" android:noHistory="true">
<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.CREATE_SHORTCUT" />
<category android:name="android.intent.category.DEFAULT" />
</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="http" />
<data android:host="*" />
<data android:pathPattern=".*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
<data android:mimeType="*/*" />
</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="https" />
<data android:host="*" />
<data android:pathPattern=".*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
<data android:mimeType="*/*" />
</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="file" />
<data android:host="*" />
<data android:pathPattern=".*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
<data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.AlphaBeta" />
<data android:mimeType="*/*" />
</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="content" />
<data android:mimeType="application/octet-stream" />
</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="com.AlphaBeta.AlphaBeta" android:host="sso" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
</manifest>
SignInActivity.cs
public class SignInActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
}
protected override void OnResume()
{
base.OnResume();
Android.Net.Uri redirectUriFromBrowser = this.Intent.Data;
if (redirectUriFromBrowser != null)
{
// Redirect from user to continue with the SignIn flow
string SignInToken = SignInTokenFromUri(redirectUriFromBrowser);
if (singleSignOnToken == null)
{
HandleSignInFailure(this);
}
else
{
HandleSignInSuccess(this);
}
}
else ...
}
...
}
编辑 2:
我只是想知道 android 意图过滤器在当前用例中是否不正确。请注意流量来自SignInActivity -> Browser -> SignInactivity(以上更新)。
编辑 3:
浏览器调用:
Uri loginUri = Uri.Parse(user.SignInLink);
Intent SignInIntent = new Intent(Intent.ActionView, loginUri);
this.StartActivity(SignInIntent);
【问题讨论】:
-
没有活动代码就无法回答这个问题。同时发布一些清单代码。
-
你能发布你的代码吗?你也调用了finish();方法?
-
@EmanuelMoecklin 请看看这是否满足用例。
-
@ivan 请查看更新。谢谢。
-
启动浏览器部分的代码在哪里?当用户返回应用程序时,它是否真正启动并显示 Activity 或根本不显示?