প্রতিকার ডায়ালগ

এই পৃষ্ঠায় সততার রায়ের সমস্যাগুলি কীভাবে মোকাবেলা করতে হয় তা বর্ণনা করা হয়েছে।

একটি ইন্টিগ্রিটি টোকেন অনুরোধ করার পরে, আপনার কাছে ব্যবহারকারীর কাছে একটি Google Play ডায়ালগ প্রদর্শন করার বিকল্প থাকবে। ইন্টিগ্রিটি রায়ের সাথে এক বা একাধিক সমস্যা থাকলে অথবা ইন্টিগ্রিটি API অনুরোধের সময় কোনও ব্যতিক্রম ঘটলে আপনি ডায়ালগটি প্রদর্শন করতে পারেন। ডায়ালগটি বন্ধ হয়ে গেলে, আপনি অন্য একটি ইন্টিগ্রিটি টোকেন অনুরোধের মাধ্যমে সমস্যাটি সমাধান করা হয়েছে কিনা তা যাচাই করতে পারেন। আপনি যদি স্ট্যান্ডার্ড অনুরোধ করেন, তাহলে নতুন রায় পাওয়ার জন্য আপনাকে টোকেন প্রদানকারীকে আবার উষ্ণ করতে হবে।

রায় সংক্রান্ত সমস্যা সমাধানের জন্য একটি অখণ্ডতা সংলাপের অনুরোধ করুন

যখন ক্লায়েন্ট একটি ইন্টিগ্রিটি টোকেনের অনুরোধ করে, তখন আপনি StandardIntegrityToken (স্ট্যান্ডার্ড API) এবং IntegrityTokenResponse (ক্লাসিক API) তে প্রদত্ত পদ্ধতিটি ব্যবহার করতে পারেন: showDialog(Activity activity, int integrityDialogTypeCode)

নিম্নলিখিত ধাপগুলি GET_LICENSED ডায়ালগ কোড ব্যবহার করে একটি প্রতিকার ডায়ালগ দেখানোর জন্য Play Integrity API ব্যবহার করার পদ্ধতি বর্ণনা করে। আপনার অ্যাপ যে অন্যান্য ডায়ালগ কোডগুলি অনুরোধ করতে পারে তা এই বিভাগের পরে তালিকাভুক্ত করা হয়েছে।

  1. আপনার অ্যাপ থেকে একটি ইন্টিগ্রিটি টোকেন অনুরোধ করুন এবং টোকেনটি আপনার সার্ভারে পাঠান। আপনি স্ট্যান্ডার্ড বা ক্লাসিক অনুরোধ ব্যবহার করতে পারেন।

    কোটলিন

    // Request an integrity token
    val tokenResponse: StandardIntegrityToken = requestIntegrityToken()
    // Send token to app server and get response on what to do next
    val yourServerResponse: YourServerResponse = sendToServer(tokenResponse.token())  

    জাভা

    // Request an integrity token
    StandardIntegrityToken tokenResponse = requestIntegrityToken();
    // Send token to app server and get response on what to do next
    YourServerResponse yourServerResponse = sendToServer(tokenResponse.token());  

    ঐক্য

    // Request an integrity token
    StandardIntegrityToken tokenResponse = RequestIntegrityToken();
    // Send token to app server and get response on what to do next
    YourServerResponse yourServerResponse = sendToServer(tokenResponse.Token); 

    অবাস্তব ইঞ্জিন

    // Request an integrity token
    StandardIntegrityToken* Response = RequestIntegrityToken();
    // Send token to app server and get response on what to do next
    YourServerResponse YourServerResponse = SendToServer(Response->Token); 

    স্থানীয়

    /// Request an integrity token
    StandardIntegrityToken* response = requestIntegrityToken();
    /// Send token to app server and get response on what to do next
    YourServerResponse yourServerResponse = sendToServer(StandardIntegrityToken_getToken(response));
  2. আপনার সার্ভারে, ইন্টিগ্রিটি টোকেনটি ডিক্রিপ্ট করুন এবং appLicensingVerdict ফিল্ডটি পরীক্ষা করুন। এটি দেখতে এরকম কিছু হতে পারে:

    // Licensing issue
    {
      ...
      "accountDetails": {
          "appLicensingVerdict": "UNLICENSED"
      }
    }
  3. যদি টোকেনে appLicensingVerdict: "UNLICENSED" , তাহলে আপনার অ্যাপ ক্লায়েন্টকে লাইসেন্সিং ডায়ালগ দেখানোর অনুরোধ করে উত্তর দিন:

    কোটলিন

    private fun getDialogTypeCode(integrityToken: String): Int{
      // Get licensing verdict from decrypted and verified integritytoken
      val licensingVerdict: String = getLicensingVerdictFromDecryptedToken(integrityToken)
    
      return if (licensingVerdict == "UNLICENSED") {
              1 // GET_LICENSED
          } else 0
    }

    জাভা

    private int getDialogTypeCode(String integrityToken) {
      // Get licensing verdict from decrypted and verified integrityToken
      String licensingVerdict = getLicensingVerdictFromDecryptedToken(integrityToken);
    
      if (licensingVerdict.equals("UNLICENSED")) {
        return 1; // GET_LICENSED
      }
      return 0;
    }

    ঐক্য

    private int GetDialogTypeCode(string IntegrityToken) {
      // Get licensing verdict from decrypted and verified integrityToken
      string licensingVerdict = GetLicensingVerdictFromDecryptedToken(IntegrityToken);
    
      if (licensingVerdict == "UNLICENSED") {
        return 1; // GET_LICENSED
      }
      return 0;
    } 

    অবাস্তব ইঞ্জিন

    private int GetDialogTypeCode(FString IntegrityToken) {
      // Get licensing verdict from decrypted and verified integrityToken
      FString LicensingVerdict = GetLicensingVerdictFromDecryptedToken(IntegrityToken);
    
      if (LicensingVerdict == "UNLICENSED") {
        return 1; // GET_LICENSED
      }
      return 0;
    } 

    স্থানীয়

    private int getDialogTypeCode(string integrity_token) {
      /// Get licensing verdict from decrypted and verified integrityToken
      string licensing_verdict = getLicensingVerdictFromDecryptedToken(integrity_token);
    
      if (licensing_verdict == "UNLICENSED") {
        return 1; // GET_LICENSED
      }
      return 0;
    }
  4. আপনার অ্যাপে, আপনার সার্ভার থেকে পুনরুদ্ধার করা অনুরোধকৃত কোডটি সহ showDialog এ কল করুন:

    কোটলিন

    // Show dialog as indicated by the server
    val showDialogType: Int? = yourServerResponse.integrityDialogTypeCode()
    if (showDialogType == null) {
    return
    }
    
    // Create dialog request
    val dialogRequest = StandardIntegrityDialogRequest.builder()
            .setActivity(activity)
            .setTypeCode(showDialogType)
            .setStandardIntegrityResponse(StandardIntegrityResponse.TokenResponse(token))
            .build()
    
    // Call showDialog, the dialog will be shown on top of the provided activity
    // and the task will complete when the dialog is closed.
    val result: Task<Int> = standardIntegrityManager.showDialog(dialogRequest)
    
    // Handle response code, call the Integrity API again to confirm that the
    // verdict issue has been resolved. 

    জাভা

    // Show dialog as indicated by the server
    @Nullable Integer showDialogType = yourServerResponse.integrityDialogTypeCode();
    if(showDialogType == null){
    return;
    }
    
    // Create dialog request
    StandardIntegrityDialogRequest dialogRequest =
        StandardIntegrityDialogRequest.builder()
            .setActivity(getActivity())
            .setTypeCode(showDialogTypeCode)
            .setStandardIntegrityResponse(new StandardIntegrityResponse.TokenResponse(token))
            .build();
    
    // Call showDialog, the dialog will be shown on top of the provided activity
    // and the task will complete when the dialog is closed.
    Task<Integer> result = standardIntegrityManager.showDialog(dialogRequest);
    
    // Handle response code, call the Integrity API again to confirm that the
    // verdict issue has been resolved.

    ঐক্য

    IEnumerator ShowDialogCoroutine() {
      int showDialogType = yourServerResponse.IntegrityDialogTypeCode();
    
      // Call showDialog with type code, the dialog will be shown on top of the
      // provided activity and complete when the dialog is closed.
      var showDialogTask = tokenResponse.ShowDialog(showDialogType);
    
      // Wait for PlayAsyncOperation to complete.
      yield return showDialogTask;
    
      // Handle response code, call the Integrity API again to confirm that the
      // verdict issue been resolved.
    } 

    অবাস্তব ইঞ্জিন

    // .h
    void MyClass::OnShowDialogCompleted(
      EStandardIntegrityErrorCode Error,
      EIntegrityDialogResponseCode Response)
    {
      // Handle response code, call the Integrity API again to confirm that the
      // verdict issue has been resolved.
    }
    
    // .cpp
    void MyClass::RequestIntegrityToken()
    {
      UStandardIntegrityToken* Response = ...
      int TypeCode = YourServerResponse.integrityDialogTypeCode();
    
      // Create a delegate to bind the callback function.
      FShowDialogStandardOperationCompletedDelegate Delegate;
    
      // Bind the completion handler (OnShowDialogCompleted) to the delegate.
      Delegate.BindDynamic(this, &MyClass::OnShowDialogCompleted);
    
      // Call ShowDialog with TypeCode which completes when the dialog is closed.
      Response->ShowDialog(TypeCode, Delegate);
    }

    স্থানীয়

    // Show dialog as indicated by the server
    int show_dialog_type = yourServerResponse.integrityDialogTypeCode();
    if(show_dialog_type == 0){
    return;
    }
    
    /// Create dialog request
    StandardIntegrityDialogRequest* dialog_request;
    StandardIntegrityDialogRequest_create(&dialog_request);
    StandardIntegrityDialogRequest_setTypeCode(dialog_request, show_dialog_type);
    StandardIntegrityDialogRequest_setActivity(dialog_request, activity);
    StandardIntegrityDialogRequest_setStandardIntegrityToken(dialog_request,
                                                  token_response);
    
    /// Call showDialog with the dialog request. The dialog will be shown on top
    /// of the provided activity and complete when the dialog is closed by the
    /// user.
    StandardIntegrityDialogResponse* dialog_response;
    StandardIntegrityErrorCode error_code =
      StandardIntegrityManager_showDialog(dialog_request, &dialog_response);
    
    /// Use polling to wait for the async operation to complete. Note, the polling
    /// shouldn't block the thread where the StandardIntegrityManager is running.
    IntegrityDialogResponseCode response_code = INTEGRITY_DIALOG_RESPONSE_UNKNOWN;
    while (error_code == STANDARD_INTEGRITY_NO_ERROR) {
      error_code = StandardIntegrityDialogResponse_getResponseCode(dialog_response, &response_code);
      if(response_code != INTEGRITY_DIALOG_RESPONSE_UNKNOWN){
        break;
      }
    }
    
    /// Free memory
    StandardIntegrityDialogRequest_destroy(dialog_request);
    StandardIntegrityDialogResponse_destroy(dialog_response);
    
    /// Handle response code, call the Integrity API again to confirm that the
    /// verdict issues have been resolved.
  5. প্রদত্ত কার্যকলাপের উপরে ডায়ালগটি প্রদর্শিত হয়। ব্যবহারকারী যখন ডায়ালগটি বন্ধ করে দেন, তখন টাস্কটি একটি প্রতিক্রিয়া কোড দিয়ে সম্পূর্ণ হয়।

  6. (ঐচ্ছিক) আরও কোনও ডায়ালগ প্রদর্শনের জন্য আরেকটি টোকেনের অনুরোধ করুন। যদি আপনি স্ট্যান্ডার্ড অনুরোধ করেন, তাহলে নতুন রায় পেতে আপনাকে টোকেন প্রদানকারীকে আবার উষ্ণ করতে হবে।

ক্লায়েন্ট পক্ষের ব্যতিক্রম ঠিক করার জন্য একটি অখণ্ডতা সংলাপের অনুরোধ করুন

যদি কোনও Integrity API অনুরোধ StandardIntegrityException (Standard API) অথবা IntegrityServiceException (Classic API) এর সাথে ব্যর্থ হয় এবং ব্যতিক্রমটি সংশোধনযোগ্য হয়, তাহলে আপনি ত্রুটিটি ঠিক করতে GET_INTEGRITY অথবা GET_STRONG_INTEGRITY ডায়ালগ ব্যবহার করতে পারেন।

নিম্নলিখিত ধাপগুলি GET_INTEGRITY ডায়ালগ ব্যবহার করে Integrity API দ্বারা রিপোর্ট করা একটি প্রতিকারযোগ্য ক্লায়েন্ট সাইড ত্রুটি ঠিক করার উপায় বর্ণনা করে।

  1. ইন্টিগ্রিটি এপিআই অনুরোধ থেকে আসা ব্যতিক্রমটি সংশোধনযোগ্য কিনা তা পরীক্ষা করুন।

    কোটলিন

    private fun isExceptionRemediable(exception: ExecutionException): Boolean {
      val cause = exception.cause
      if (cause is StandardIntegrityException &amp;&amp; cause.isRemediable) {
          return true
      }
      return false
    }
     

    জাভা

    private boolean isExceptionRemediable(ExecutionException exception) {
      Throwable cause = exception.getCause();
      if (cause instanceof StandardIntegrityException integrityException
    &amp;&amp; integrityException.isRemediable()) {
          return true;
      }
      return false;
    }
     

    স্থানীয়

    bool IsErrorRemediable(StandardIntegrityToken* token) {
      /// Check if the error associated with the token is remediable
      bool isRemediable = false;
      if(StandardIntegrityToken_getIsRemediable(response, &isRemediable) == STANDARD_INTEGRITY_NO_ERROR){
        return isRemediable;
      }
      return false;
    }

  1. যদি ব্যতিক্রমটি সংশোধনযোগ্য হয়, তাহলে ফেরত আসা ব্যতিক্রম ব্যবহার করে GET_INTEGRITY ডায়ালগটি অনুরোধ করুন। ডায়ালগটি প্রদত্ত কার্যকলাপের উপরে প্রদর্শিত হবে এবং ব্যবহারকারী ডায়ালগটি বন্ধ করার পরে ফেরত আসা টাস্কটি একটি প্রতিক্রিয়া কোড দিয়ে সম্পন্ন হবে।

    কোটলিন

    private fun showDialog(exception: StandardIntegrityException) {
      // Create a dialog request
      val standardIntegrityDialogRequest =
          StandardIntegrityDialogRequest.builder()
              .setActivity(activity)
              .setType(IntegrityDialogTypeCode.GET_INTEGRITY)
              .setStandardIntegrityResponse(ExceptionDetails(exception))
              .build()
    
      // Request dialog
      val responseCode: Task<Int> =
            standardIntegrityManager.showDialog(standardIntegrityDialogRequest)
    }
     

    জাভা

    private void showDialog(StandardIntegrityException exception) {
      // Create a dialog request
      StandardIntegrityDialogRequest standardIntegrityDialogRequest =
          StandardIntegrityDialogRequest.builder()
              .setActivity(this.activity)
              .setType(IntegrityDialogTypeCode.GET_INTEGRITY)
              .setStandardIntegrityResponse(new ExceptionDetails(exception))
              .build();
    
      // Request dialog
      Task<Integer> responseCode =
            standardIntegrityManager.showDialog(standardIntegrityDialogRequest);
    }  

    স্থানীয়

    private void showDialogToFixError(StandardIntegrityToken* token) {
      /// If the token request failed, and the underlying error is not fixable
      /// then return early
      if(isErrorRemediable(token)) {
        return;
      }
    
      /// Create dialog request
      StandardIntegrityDialogRequest* dialog_request;
      StandardIntegrityDialogRequest_create(&dialog_request);
      StandardIntegrityDialogRequest_setTypeCode(dialog_request,
                                         kGetIntegrityDialogTypeCode);
      StandardIntegrityDialogRequest_setActivity(dialog_request, activity);
      StandardIntegrityDialogRequest_setStandardIntegrityToken(dialog_request,
                                                      token_response);
    
      /// Call showDialog with the dialog request. The dialog will be shown on
      /// top of the provided activity and complete when the dialog is closed by
      /// the user.
      StandardIntegrityDialogResponse* dialog_response;
      StandardIntegrityErrorCode error_code =
          StandardIntegrityManager_showDialog(dialog_request, &dialog_response);
    
      /// Use polling to wait for the async operation to complete.
      /// Note, the polling shouldn't block the thread where the
      /// StandardIntegrityManager is running.
      IntegrityDialogResponseCode response_code = INTEGRITY_DIALOG_RESPONSE_UNKNOWN;
      while (error_code == STANDARD_INTEGRITY_NO_ERROR) {
          error_code = StandardIntegrityDialogResponse_getResponseCode(response, &response_code);
          if(response_code != INTEGRITY_DIALOG_RESPONSE_UNKNOWN){
            break;
          }
      }
    
      /// Free memory
      StandardIntegrityDialogRequest_destroy(dialog_request);
      StandardIntegrityDialogResponse_destroy(dialog_response);
    
    }
  2. যদি ফেরত দেওয়া রেসপন্স কোডটি সফলতার ইঙ্গিত দেয়, তাহলে পরবর্তী অখণ্ডতা টোকেনের অনুরোধটি কোনও ব্যতিক্রম ছাড়াই সফল হবে। যদি আপনি স্ট্যান্ডার্ড অনুরোধ করেন, তাহলে নতুন রায় পেতে আপনাকে টোকেন প্রদানকারীকে আবার উষ্ণ করতে হবে।

ইন্টিগ্রিটি ডায়ালগ কোড

GET_LICENSED (টাইপ কোড ১)

রায় ইস্যু

এই সংলাপটি দুটি বিষয়ের জন্য উপযুক্ত:

  • অননুমোদিত অ্যাক্সেস : appLicensingVerdict: "UNLICENSED" । এর অর্থ হল ব্যবহারকারীর অ্যাকাউন্টে আপনার অ্যাপের জন্য কোনও এনটাইটেলমেন্ট নেই, যা ব্যবহারকারী যদি এটি সাইডলোড করে থাকেন বা Google Play ব্যতীত অন্য কোনও অ্যাপ স্টোর থেকে কিনে থাকেন তবে ঘটতে পারে।
  • টেম্পারড অ্যাপ : appRecognitionVerdict: "UNRECOGNIZED_VERSION" । এর মানে হল আপনার অ্যাপের বাইনারি পরিবর্তন করা হয়েছে অথবা এটি Google Play দ্বারা স্বীকৃত কোনও সংস্করণ নয়।

প্রতিকার

আপনি GET_LICENSED ডায়ালগটি দেখাতে পারেন যাতে ব্যবহারকারী Google Play থেকে আসল অ্যাপটি কিনতে পারেন। এই একক ডায়ালগটি উভয় পরিস্থিতির সমাধান করে:

  • লাইসেন্সবিহীন ব্যবহারকারীদের জন্য, এটি তাদের একটি Play লাইসেন্স প্রদান করে। এর ফলে ব্যবহারকারী Google Play থেকে অ্যাপ আপডেট পেতে সক্ষম হন।
  • যে ব্যবহারকারীর অ্যাপ ভার্সনটি টেম্পারড , তাদের গুগল প্লে থেকে অপরিবর্তিত অ্যাপটি ইনস্টল করার জন্য এটি নির্দেশিকা প্রদান করে।

ব্যবহারকারী যখন ডায়ালগটি সম্পূর্ণ করেন, তখন পরবর্তী ইন্টিগ্রিটি চেকগুলি appLicensingVerdict: "LICENSED" এবং appRecognitionVerdict: "PLAY_RECOGNIZED" ফেরত দেয়।

উদাহরণ UX

চিত্র ১. GET_LICENSED প্লে ডায়ালগ।

CLOSE_UNKNOWN_ACCESS_RISK (টাইপ কোড 2)

রায় ইস্যু

যখন environmentDetails.appAccessRiskVerdict.appsDetected ফাইলে "UNKNOWN_CAPTURING" অথবা "UNKNOWN_CONTROLLING" লেখা থাকে, তখন এর অর্থ হল ডিভাইসে অন্যান্য অ্যাপ (Google Play দ্বারা ইনস্টল করা হয়নি বা ডিভাইস প্রস্তুতকারকের দ্বারা সিস্টেম পার্টিশনে প্রিলোড করা হয়নি) চলমান রয়েছে যা স্ক্রিন ক্যাপচার করতে পারে বা ডিভাইস নিয়ন্ত্রণ করতে পারে।

প্রতিকার

আপনি CLOSE_UNKNOWN_ACCESS_RISK ডায়ালগটি দেখাতে পারেন যাতে ব্যবহারকারীকে স্ক্রিন ক্যাপচার করতে পারে বা ডিভাইস নিয়ন্ত্রণ করতে পারে এমন সমস্ত অজানা অ্যাপ বন্ধ করতে বলা হয়। ব্যবহারকারী যদি Close all " বোতামে ট্যাপ করেন, তাহলে এই ধরনের সমস্ত অ্যাপ বন্ধ হয়ে যাবে।

উদাহরণ UX

চিত্র ২। নিকট অজানা অ্যাক্সেস ঝুঁকির জন্য ডায়ালগ।

CLOSE_ALL_ACCESS_RISK (টাইপ কোড 3)

রায় ইস্যু

যখন environmentDetails.appAccessRiskVerdict.appsDetected "KNOWN_CAPTURING" , "KNOWN_CONTROLLING" , "UNKNOWN_CAPTURING" অথবা "UNKNOWN_CONTROLLING" এর যেকোনো একটি থাকে, তখন এর অর্থ হল ডিভাইসে এমন কিছু অ্যাপ চলছে যা স্ক্রিন ক্যাপচার করছে বা ডিভাইস নিয়ন্ত্রণ করছে।

প্রতিকার

আপনি CLOSE_ALL_ACCESS_RISK ডায়ালগটি দেখাতে পারেন যাতে ব্যবহারকারীকে স্ক্রিন ক্যাপচার করা বা ডিভাইস নিয়ন্ত্রণ করা সমস্ত অ্যাপ বন্ধ করতে বলা হয়। ব্যবহারকারী যদি " Close all " বোতামে ট্যাপ করেন, তাহলে ডিভাইসে এই ধরণের সমস্ত অ্যাপ বন্ধ হয়ে যাবে।

উদাহরণ UX

চিত্র ৩. সমস্ত অ্যাক্সেস ঝুঁকি বন্ধ করার জন্য ডায়ালগ।

GET_INTEGRITY (টাইপ কোড 4)

রায় ইস্যু

এই সংলাপটি নিম্নলিখিত যেকোনো সমস্যার জন্য উপযুক্ত:

  • দুর্বল ডিভাইসের অখণ্ডতা : যখন deviceRecognitionVerdict MEETS_DEVICE_INTEGRITY থাকে না, তখন ডিভাইসটি একটি আসল এবং প্রত্যয়িত Android ডিভাইস নাও হতে পারে। এটি ঘটতে পারে, উদাহরণস্বরূপ, যদি ডিভাইসের বুটলোডার আনলক করা থাকে বা এর লোড করা Android OS একটি প্রত্যয়িত প্রস্তুতকারকের ছবি না হয়।

  • অননুমোদিত অ্যাক্সেস : appLicensingVerdict: "UNLICENSED" । এর অর্থ হল ব্যবহারকারীর অ্যাকাউন্টে আপনার অ্যাপের জন্য কোনও এনটাইটেলমেন্ট নেই, যা ব্যবহারকারী যদি এটি সাইডলোড করে থাকেন বা Google Play ব্যতীত অন্য কোনও অ্যাপ স্টোর থেকে কিনে থাকেন তবে ঘটতে পারে।

  • টেম্পারড অ্যাপ : appRecognitionVerdict: "UNRECOGNIZED_VERSION" । এর মানে হল আপনার অ্যাপের বাইনারি পরিবর্তন করা হয়েছে অথবা এটি Google Play দ্বারা স্বীকৃত কোনও সংস্করণ নয়।

  • ক্লায়েন্ট সাইড এক্সেপশন : যখন একটি ইন্টিগ্রিটি এপিআই অনুরোধের সময় একটি রিমেডিয়েবল এক্সেপশন দেখা দেয়। রিমেডিয়েবল এক্সেপশন হলো ইন্টিগ্রিটি এপিআই এক্সেপশন যার মধ্যে PLAY_SERVICES_VERSION_OUTDATED , NETWORK_ERROR , PLAY_SERVICES_NOT_FOUND ইত্যাদি ত্রুটি কোড থাকে। ডায়ালগের মাধ্যমে একটি এক্সেপশন ঠিক করা যায় কিনা তা পরীক্ষা করার জন্য আপনি exception.isRemediable() পদ্ধতি ব্যবহার করতে পারেন।

প্রতিকার

GET_INTEGRITY ডায়ালগটি একটি একক, অবিচ্ছিন্ন প্রবাহের মধ্যে একাধিক প্রতিকার পদক্ষেপ পরিচালনা করে ব্যবহারকারীর অভিজ্ঞতাকে সহজতর করার জন্য ডিজাইন করা হয়েছে। এটি ব্যবহারকারীকে বিভিন্ন সমস্যা সমাধানের জন্য একাধিক পৃথক ডায়ালগের সাথে ইন্টারঅ্যাক্ট করতে বাধা দেয়।

যখন আপনি ডায়ালগের অনুরোধ করেন, তখন এটি স্বয়ংক্রিয়ভাবে কোন লক্ষ্যযুক্ত রায়ের সমস্যাগুলি উপস্থিত তা সনাক্ত করে এবং যথাযথ প্রতিকারের পদক্ষেপগুলি প্রদান করে। এর অর্থ হল একটি একক ডায়ালগ অনুরোধ একসাথে একাধিক সমস্যার সমাধান করতে পারে, যার মধ্যে রয়েছে:

  • ডিভাইসের অখণ্ডতা : যদি কোনও ডিভাইসের অখণ্ডতার সমস্যা ধরা পড়ে, তাহলে ডায়ালগটি ব্যবহারকারীকে MEETS_DEVICE_INTEGRITY রায়ের প্রয়োজনীয়তা পূরণের জন্য ডিভাইসের নিরাপত্তা অবস্থা উন্নত করতে নির্দেশ দেবে।
  • অ্যাপ ইন্টিগ্রিটি : যদি অননুমোদিত অ্যাক্সেস বা অ্যাপ টেম্পারিংয়ের মতো সমস্যা ধরা পড়ে, তাহলে ডায়ালগটি ব্যবহারকারীদের প্লে স্টোর থেকে অ্যাপটি কিনতে নির্দেশ দেবে যাতে সেগুলি সমাধান করা যায়।
  • ক্লায়েন্ট-সাইড ব্যতিক্রম : ডায়ালগটি ইন্টিগ্রিটি API ব্যতিক্রমের কারণ হিসেবে চিহ্নিত যেকোনো অন্তর্নিহিত সমস্যা পরীক্ষা করে সমাধানের চেষ্টা করে। উদাহরণস্বরূপ, এটি ব্যবহারকারীকে Google Play পরিষেবার একটি পুরানো সংস্করণ আপডেট করার জন্য অনুরোধ করতে পারে।

উদাহরণ UX

চিত্র ৪. GET_INTEGRITY ডায়ালগ নেটওয়ার্ক ত্রুটি প্রতিকার প্রবাহ

GET_STRONG_INTEGRITY (টাইপ কোড 5)

রায় ইস্যু

এই ডায়ালগটি GET_INTEGRITY যে সকল সমস্যার সমাধান করে সেগুলি সমাধান করার জন্য ডিজাইন করা হয়েছে, এতে MEETS_STRONG_INTEGRITY রায় পেতে ডিভাইসকে বাধাগ্রস্ত করে এমন সমস্যাগুলি সমাধান করার এবং Play Protect রায়ের সমস্যাগুলি সমাধান করার অতিরিক্ত ক্ষমতা রয়েছে।

প্রতিকার

GET_STRONG_INTEGRITY একটি একক, অবিচ্ছিন্ন প্রবাহের মধ্যে একাধিক প্রতিকার পদক্ষেপ পরিচালনা করে ব্যবহারকারীর অভিজ্ঞতাকে সহজতর করার জন্য ডিজাইন করা হয়েছে। ডায়ালগটি স্বয়ংক্রিয়ভাবে প্রযোজ্য অখণ্ডতা সমস্যাগুলির সমাধান পরীক্ষা করে, যার মধ্যে রয়েছে:

  • ডিভাইসের অখণ্ডতা : যদি কোনও ডিভাইসের অখণ্ডতার সমস্যা সনাক্ত করা হয়, তাহলে ডায়ালগটি ব্যবহারকারীকে MEETS_STRONG_INTEGRITY রায়ের প্রয়োজনীয়তা পূরণের জন্য ডিভাইসের নিরাপত্তা অবস্থা উন্নত করার জন্য নির্দেশনা দেবে।
  • প্লে প্রোটেক্ট স্ট্যাটাস : যদি playProtectVerdict কোনও সমস্যা নির্দেশ করে, তাহলে ডায়ালগটি ব্যবহারকারীকে এটি ঠিক করার জন্য নির্দেশ দেবে:

    • যদি Play Protect অক্ষম করা থাকে ( playProtectVerdict == POSSIBLE_RISK ), তাহলে ডায়ালগটি ব্যবহারকারীকে এটি সক্ষম করতে এবং ডিভাইসের সমস্ত অ্যাপ স্ক্যান করতে অনুরোধ করবে।
    • যদি ক্ষতিকারক অ্যাপগুলি সনাক্ত করা হয় ( playProtectVerdict == MEDIUM_RISK অথবা HIGH_RISK ), তাহলে ডায়ালগটি ব্যবহারকারীকে Google Play Protect ব্যবহার করে সেগুলি আনইনস্টল করার নির্দেশ দেবে।
  • অ্যাপ ইন্টিগ্রিটি : যদি অননুমোদিত অ্যাক্সেস বা অ্যাপ টেম্পারিংয়ের মতো সমস্যা ধরা পড়ে, তাহলে ডায়ালগটি ব্যবহারকারীকে সমস্যা সমাধানের জন্য প্লে স্টোর থেকে অ্যাপটি কিনতে অনুরোধ করবে।

  • ক্লায়েন্ট-সাইড ব্যতিক্রম : ডায়ালগটি ইন্টিগ্রিটি API ব্যতিক্রমের কারণ হওয়া যেকোনো অন্তর্নিহিত সমস্যা সমাধানের চেষ্টা করে। উদাহরণস্বরূপ, এটি ব্যবহারকারীকে Google Play পরিষেবাগুলি অক্ষম পাওয়া গেলে সক্ষম করতে অনুরোধ করতে পারে। Remediable ব্যতিক্রমগুলি হল PLAY_SERVICES_VERSION_OUTDATED , NETWORK_ERROR , অথবা PLAY_SERVICES_NOT_FOUND এর মতো ত্রুটি কোড সহ Integrity API ব্যতিক্রম। ডায়ালগ দ্বারা কোনও ত্রুটি সংশোধনযোগ্য কিনা তা পরীক্ষা করার জন্য আপনি exception.isRemediable() পদ্ধতি ব্যবহার করতে পারেন।

উদাহরণ UX

চিত্র ৫। GET_STRONG_INTEGRITY ডায়ালগ প্লে পরিষেবা আপডেট করছে।