मैं C#, Visual Studio और Xamarin का उपयोग करके Android APP में Google One Tap लागू कर रहा हूं।

मेरी मूल समस्या यह है कि मैं दो कंप्यूटरों के साथ काम कर रहा हूं। जब मैं कंप्यूटर ए से ऐप बनाता और डिबग करता हूं, तो BeginSignIn() अपेक्षा के अनुरूप OnActivityResult() पर पहुंच जाता है। जब मैं कंप्यूटर बी से निर्माण और डीबग करता हूं, तो BeginSignIn() हमेशा विफलता श्रोता की ओर जाता है। दोनों ही मामलों में, मैं एक ही टैबलेट पर एपीपी लोड कर रहा हूं। दोनों ही मामलों में मैं बिना किसी बदलाव के प्रोजेक्ट कोड की क्लोनिंग कर रहा हूं।

चूंकि मैं यूएसबी को किसी भी कंप्यूटर से कनेक्ट करके परीक्षण करने के लिए एक ही टैबलेट का उपयोग कर रहा हूं, टैबलेट पर स्पष्ट रूप से एक सहेजा गया क्रेडेंशियल है (क्योंकि यह कंप्यूटर ए से अपेक्षित काम करता है)।

ऊपर वर्णित चीजों के अलावा, मैंने कंप्यूटर बी पर एक एपीके बनाने और इसे टैबलेट पर स्थापित करने का प्रयास किया। इसका एक ही परिणाम था, यानी, BeginSignIn() को कॉल करने के बाद यह विफलता श्रोता में समाप्त हो गया। फिर मैंने कंप्यूटर ए पर एपीके बनाने की कोशिश की। यह टैबलेट पर विफल रहा, यानी, BeginSignIn() के बाद, यह विफलता श्रोता के पास गया। इसलिए, मैंने 4 अलग-अलग तरीकों की कोशिश की है: कंप्यूटर ए, बी से डिबग और कंप्यूटर ए, बी पर बनाया गया एपीके। इन 4 में से, केवल वही जो बिना किसी त्रुटि के साइन इन प्रक्रिया से गुजरता है, वह कंप्यूटर A से डिबग है।

अनुरोध पैकेट बनाने के लिए स्निपेट यहां दिया गया है। यह Google One Tap के बारे में doc पेज पर कोड के बहुत करीब है। , सिवाय इसके कि जावा के बजाय C# है।

TheBeginSignInRequest = new BeginSignInRequest.Builder()
     .SetPasswordRequestOptions(new PasswordRequestOptions.Builder()
         .SetSupported(true)
         .Build())
     .SetGoogleIdTokenRequestOptions(
          new GoogleIdTokenRequestOptions.Builder()
                 .SetSupported(true)
          // Your server's client ID, not your Android client ID.
          .SetServerClientId(
               GetString(Resource.String.default_web_client_id))
          .SetFilterByAuthorizedAccounts(false)
          .Build())
      .SetAutoSelectEnabled(false)
      .Build();

यहां BeginSignIn शुरू करने के लिए स्निपेट दिया गया है। कंप्यूटर ए पर, यह पूर्ण और सफल श्रोताओं की ओर जाता है। कंप्यूटर बी पर, यह पूर्ण और विफलता श्रोताओं की ओर जाता है।

Log.Info("bob", "SignInButton_Click: sign in.");
var SignInTask = TheOneTap_SignInClient.BeginSignIn(TheBeginSignInRequest);
SignInTask.AddOnCanceledListener(this);
SignInTask.AddOnCompleteListener(this);
SignInTask.AddOnSuccessListener(this);
SignInTask.AddOnFailureListener(this);

यहां कंप्यूटर ए से लॉग है। मैं केवल ऑनसक्सेस() में लॉग अप शामिल करता हूं क्योंकि यह कंप्यूटर बी पर ऑनफेलर() के बराबर है।

10-11 16:18:00.091 14053 14053 I bob     : SignInButton_Click: sign in.
10-11 16:18:00.149   866  2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.171   866  2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.173   866  1568 D AccountManagerService: getUserAccounts0
10-11 16:18:00.173   866  1778 D AccountManagerService: getUserAccounts0
10-11 16:18:00.174   866  1778 I chatty  : uid=1000(system) Binder:866_E identical 1 line
10-11 16:18:00.175   866  1778 D AccountManagerService: getUserAccounts0
10-11 16:18:00.176   866  2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.177   866  2818 I chatty  : uid=1000(system) Binder:866_11 identical 1 line
10-11 16:18:00.180   866  2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.182   866  4626 D AccountManagerService: getUserAccounts0
10-11 16:18:00.184   866  4626 D AccountManagerService: getUserAccounts0
10-11 16:18:00.185   866  2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.188   866  4626 D AccountManagerService: getUserAccounts0
10-11 16:18:00.190   866  2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.190   866  2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.201  1594  1610 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:18:00.201  1594  1610 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:18:00.326   866  4626 D AccountManagerService: getUserAccounts0
10-11 16:18:00.327  1594  1610 E Auth    : [GoogleAccountDataServiceImpl] getToken() -> NEED_REMOTE_CONSENT. App: com.SalmonCreekGames.SolitaireMobile, Service: oauth2:openid
10-11 16:18:00.346 14053 14053 I bob     : OnComplete()
10-11 16:18:00.404 14053 14053 I bob     : OnSuccess.  result=com.google.android.gms.auth.api.identity.BeginSignInResult@5da485a

यहां कंप्यूटर बी से लॉग स्निपेट दिखाया गया है कि यह विफलता श्रोता पर कैसे समाप्त होता है।

10-11 16:27:34.251 15767 15767 I bob     : SignInButton_Click: sign in.
10-11 16:27:34.329   866   919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.356  9625  9625 D BoundBrokerSvc: onBind: Intent { act=com.google.android.gms.chromesync.service.zeroparty.START cmp=com.google.android.gms/.chimera.GmsApiService }
10-11 16:27:34.357  9625  9625 D BoundBrokerSvc: Loading bound service for intent: Intent { act=com.google.android.gms.chromesync.service.zeroparty.START cmp=com.google.android.gms/.chimera.GmsApiService }
10-11 16:27:34.372   866  4582 D ConnectivityService: filterNetworkStateForUid() uid: 10019, pid: 1594
10-11 16:27:34.372   866  4582 D ConnectivityService: isNetworkWithLinkPropertiesBlocked: uid=10019, vpn=DISCONNECTED,false
10-11 16:27:34.372   866  4582 D ConnectivityService: filterNetworkStateForUid() uid: 10019, pid: 1594, networkInfo: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), failover: false, available: true, roaming: false]
10-11 16:27:34.379   866  1775 D AccountManagerService: getUserAccounts0
10-11 16:27:34.384   866  1775 D AccountManagerService: getUserAccounts0
10-11 16:27:34.385  9625  9625 D BoundBrokerSvc: onBind: Intent { act=com.google.android.gms.auth.key.retrieval.service.START cmp=com.google.android.gms/.chimera.GmsApiService }
10-11 16:27:34.385  9625  9625 D BoundBrokerSvc: Loading bound service for intent: Intent { act=com.google.android.gms.auth.key.retrieval.service.START cmp=com.google.android.gms/.chimera.GmsApiService }
10-11 16:27:34.385   866  1775 D AccountManagerService: getUserAccounts0
10-11 16:27:34.387   866  2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.392   866   919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.392   866  2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.394   866  2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.394   866   919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.394   866  2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.396   866  2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.396   866   919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.398   866   919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.398   866  2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.401   866  2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.402   866   919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.403   866  2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.404   866  2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.405   866   919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.409   866  2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.416  1594 22041 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:27:34.416  1594 22041 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:27:34.419  1594 29593 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:27:34.419  1594 29593 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:27:34.524   866  1775 D AccountManagerService: getUserAccounts0
10-11 16:27:34.529   866  1775 D AccountManagerService: getUserAccounts0
10-11 16:27:34.559 15767 15767 I bob     : OnComplete()
10-11 16:27:34.618 15767 15767 I bob     : OnFailure.
Computer A:
    Windows 10 Pro   Version 21H1   19043.1237
    Visual Studio Community   Version 16.8.4
Computer B:
    Windows 10 Home  Version 20H2   19042.1237
    Visual Studio Community   Version 16.11.12
Tablet
    Samsung SM-T380
    Android Version 9
    
0
Bob New 12 अक्टूबर 2021, 22:14

1 उत्तर

सबसे बढ़िया उत्तर

इसलिए मुझे अंततः कंप्यूटर बी से काम करने के लिए एक टैप साइन इन मिला। मैं उत्तर की तलाश में एक लंबी स्पर्शरेखा पर चला गया। आखिरकार मैंने ऑनफेलर हैंडलर में और डीबग संदेश जोड़े।

public void OnFailure(Java.Lang.Exception e)
{
    // No saved credentials found. Launch the One Tap sign-up flow, or
    // do nothing and continue presenting the signed-out UI.
    Log.Info("bob", $"OnFailure: Couldn't start One Tap UI: " + e.Message)
}

आउटपुट में e.Message जोड़ने के परिणामस्वरूप संदेश प्राप्त हुआ: "मिलान करने वाला क्रेडेंशियल नहीं ढूंढा जा सकता।" इस संदेश ने मुझे इस SO प्रश्न तक पहुँचाया: एंड्रॉइड पर वन टैप साइन-इन और साइन-अप करते समय "16: मैचिंग क्रेडेंशियल नहीं ढूंढ सकता" प्राप्त करना। रॉय सोलबर्ग द्वारा उस प्रश्न के उत्तर में 3 अलग-अलग मामले शामिल हैं और मुझे बहुत मदद मिली है।

समस्या का अंतिम समाधान Google क्लाउड प्लेटफ़ॉर्म कंसोल -> एपिस और सेवाएं -> क्रेडेंशियल पृष्ठ पर एक और OAuth 2.0 क्लाइंट आईडी जोड़ना था। नई क्लाइंट आईडी कंप्यूटर बी के लिए विशिष्ट है। स्पष्ट रूप से विकास के लिए लैपटॉप से ​​​​यूएसबी पर डिवाइस तक चलता है, प्रत्येक व्यक्तिगत विकास कंप्यूटर द्वारा एक अलग कीस्टोर का उपयोग किया जाता है।

Visual Studio Xamarin के लिए, मुझे यह पृष्ठ मिला: अपने कीस्टोर का सिग्नेचर ढूँढना। इसमें डिबग रन के लिए उपयोग किए जाने वाले कीस्टोर के बारे में जानकारी है। मैंने उस पृष्ठ में वर्णित keytool.exe का उपयोग करके कंप्यूटर B पर डीबग कीस्टोर से SHA1 निकाला। फिर, मैंने GCP कंसोल पर क्लाइंट आईडी बनाने के लिए कहा SHA1 का उपयोग किया।

प्रत्येक डेवलपर कंप्यूटर के लिए एक अलग क्लाइंट आईडी रखने के बजाय ऐसा करने का एक क्लीनर तरीका हो सकता है, लेकिन अभी के लिए यह मेरे लिए काम कर रहा है।

0
Bob New 20 अक्टूबर 2021, 03:38