2

私の現在のプロジェクトでは、チーム メンバーの 1 人が Xamarin.Android アプリに Google サインインを実装しました。彼はキーストアと sha もリリース用に追加しました。そして、デバッグモードの彼のマシンで正常に動作しています。

しかし、自分のマシンからこのコードを実行しようとすると、常にResultCode Result.Canceled OnActivityResult of activity を取得します

これは私のAndroidレンダラーのコードです:

public class GoogleLoginRendere : PageRenderer, 
GoogleApiClient.IOnConnectionFailedListener, Android.Views.View.IOnClickListener
{
    GoogleApiClient mGoogleApiClient;
    MainActivity activity;
    SignInButton signInButton;
    Android.Widget.Button btn;
    public GoogleLoginRendere()
    {

    }
    public void OnConnectionFailed(ConnectionResult result)
    {
        throw new NotImplementedException();
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
    {
    base.OnElementChanged(e);
    activity = Context as MainActivity;
    if (e.OldElement != null)
    {
        activity.ActivityResult -= HandleActivityResult;
    }
    if (e.NewElement != null)
    {
        activity.ActivityResult += HandleActivityResult;
    }
    btn = new Android.Widget.Button(activity);
    btn.Text = "Google SignIn";
    signInButton = new SignInButton(activity);
    signInButton.SetSize(SignInButton.SizeStandard);
    signInButton.Visibility = ViewStates.Visible;

    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DefaultSignIn)
     .RequestEmail()
     .Build();

    mGoogleApiClient = new GoogleApiClient.Builder(activity)
     .EnableAutoManage(activity /* FragmentActivity */, this /* OnConnectionFailedListener */)
     .AddApi(Auth.GOOGLE_SIGN_IN_API, gso)
     .Build();

    FrameLayout.LayoutParams linLayoutParam = new FrameLayout.LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent);
    linLayoutParam.Gravity = GravityFlags.Center;

    activity.AddContentView(btn, linLayoutParam);
    btn.SetOnClickListener(this);

    /* signInButton.Click += (sender, ex) =>
     {
      Console.WriteLine(string.Format("Click called"));
         Intent signInIntent = Auth.GoogleSignInApi.GetSignInIntent(mGoogleApiClient);
         activity.StartActivityForResult(signInIntent, 0);
     };*/

    MessagingCenter.Subscribe<object, string>(this, "CallLogout", (sender, msg) =>
    {
        Auth.GoogleSignInApi.SignOut(mGoogleApiClient);
        signInButton.Visibility = ViewStates.Visible;
    });
    }

    private void HandleActivityResult(object sender, ActivityResultEventArgs e)
    {
        Console.WriteLine(string.Format("renderer called"));
        if (e.RequestCode == 0)
        {
        GoogleSignInResult result = Auth.GoogleSignInApi.GetSignInResultFromIntent(e.Data);
        if (result.IsSuccess)
        {
            signInButton.Visibility = ViewStates.Invisible;
            User aUser = new User();
            aUser.Email = result.SignInAccount.Email;
            App.appUser = aUser;
            MessagingCenter.Send<object, string>(this, "callLoginWebservice", "callLoginWebservice");
        }
        else
        {
            Toast.MakeText(activity, "email not found", ToastLength.Long).Show();
            Auth.GoogleSignInApi.SignOut(mGoogleApiClient);
            signInButton.Visibility = ViewStates.Visible;
        }
        }
    }
    public void OnClick(Android.Views.View v)
    {
        var signInIntent = Auth.GoogleSignInApi.GetSignInIntent(mGoogleApiClient);
        activity.StartActivityForResult(signInIntent, 0);
        //Intent signInIntent = Auth.GoogleSignInApi.GetSignInIntent(mGoogleApiClient);
        //((MainActivity)Forms.Context).StartActivityForResult(signInIntent, 1);
        //mGoogleApiClient.Connect();
    }
}

MainActivity.cs

public class ActivityResultEventArgs : EventArgs
{
    public int RequestCode { get; set; }
    public Result ResultCode { get; set; }
    public Intent Data { get; set; }
    public ActivityResultEventArgs() : base()
    { }
}

[Activity(Label = "AppName.Droid", Icon = "@drawable/icon", Theme = "@style/MyTheme", ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
{
    public event EventHandler<ActivityResultEventArgs> ActivityResult = delegate { };
    protected override void OnCreate(Bundle bundle)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        App.ServiceManager = new SoapServiceManager(new SoapService());

        base.OnCreate(bundle);

        global::Xamarin.Forms.Forms.Init(this, bundle);

        LoadApplication(new App());
    }

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);
        Console.WriteLine(string.Format("Main activity result called"));
        GoogleSignInResult result = Auth.GoogleSignInApi.GetSignInResultFromIntent(data);
        if (result != null)
        {
            if (result.IsSuccess)
            {
                Console.WriteLine(string.Format("Activity result is {0}", result.SignInAccount.Email));
            }
            else
            {
                Console.WriteLine(string.Format("Activity result is {0}", resultCode));
            }
        }
        ActivityResult(this, new ActivityResultEventArgs
        {
            RequestCode = requestCode,
            ResultCode = resultCode,
            Data = data
        });
    }
}  

コードに問題がないことはわかっています。構成に問題があるはずです。だから私がまだ試したことは

=> SSH-1 キーを生成し、Google サインイン アカウントに追加し、google-services.json を置き換えました

=> アカウントのプロジェクトにも新しい Google サインを作成しようとしました。アプリの配布で生成される新しいキーストアを使用します。

何も機能しませんでした。それでも同じエラーが発生します。

PS:重複した回答としてマークしないでください。他のすべての質問を検索し、R&D に 2 日間の時間を費やしましたが、解決策が見つかりませんでした。 この質問は私のようです。 しかし、それはアンドロイドスタジオのJavaアンドロイド用です。そのため、記載されているすべてのファイルが Xamarin.Android ソリューションにあるわけではありません。

誰かがアイデアを持っているなら。助けて。

4

1 に答える 1

0

私の推測では、Google Play のオプションであるアプリ署名鍵の管理を Google に任せていると思います。したがって、リリース プロファイル用に生成した SHA1 キーは役に立ちません。Google は本番環境で別のキーを使用してアプリに署名するためです。

その場合は、Google Play Console -> Release Management -> App Signing に移動し、そこにある SHA1 フィンガープリントを Firebase に追加し、そのキーを含む新しい google-services.json を生成する必要があります。

これが役立つことを願っています

于 2018-12-08T15:17:53.493 に答える