Google Play Store에서 Huawei Store로 마이그레이션. 코드가 변경 되었습니까?

Nov 17 2020

Google Play 스토어에 애플리케이션이 있습니다. 화웨이 스토어에도 공개 할 예정입니다.

Huawei SDK 및 기본 지침 단계 (프로젝트 agconnect-services.json 등에 추가)를 사용하여 앱을 다시 빌드하는 것 외에도 코드 수준에서 변경해야하는 다른 것이 있습니까?

모든 API가 작동합니까? 특히 인앱 구매와 관련된 것?

감사

답변

2 shirley Nov 17 2020 at 11:39

먼저 사용중인 GMS Kit를 확인하시면 해당 HMS Kit를 제공해 드릴 수 있습니다. 이 답변 도 참조 할 수 있습니다 .

코드 수준에서 다음을 수행하려는 경우 :

  1. G2H 솔루션 사용 : GMS 코드를 HMS 코드로 직접 대체합니다. HMS 인터페이스의 이름은 GMS 인터페이스와 다르지만 인터페이스의 의미는 동일합니다. API 문서를 참조하여 인터페이스 이름을 변경할 수 있습니다 .
  2. 사용 G + H 용액 : HMS + GMS 적응 계층 코드는 일본어 로직 코드에 추가한다. 다음 코드를 추가하여 GMS API 또는 HMS API를 사용할 수 있는지 확인하고 사용 가능한 API를 호출합니다.
public boolean  isGMS(){
    return GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) == com.google.android.gms.common.ConnectionResult.SUCCESS;
}
public boolean  isHMS(){
    return HuaweiApiAvailability.getInstance().isHuaweiMobileServicesAvailable(this) == com.huawei.hms.api.ConnectionResult.SUCCESS;
}

호출하는 코드의 논리 :

If ( isGMS() ) {
//GMS code
}else if ( isHMS() ){
//HMS code
}

HMS는 GMS와 유사한 인터페이스를 제공합니다. 다음은 IAP 문서 와 Github 입니다.

HMS ToolKit 을 사용 하여 G2H / G + H를 구현할 수도 있습니다 .

최신 정보:

다음 코드를 사용하여 productId를 얻을 수 있습니다.

PurchaseResultInfo buyResultInfo = Iap.getIapClient(this).parsePurchaseResultInfoFromIntent(data); 

getInAppPurchaseData () 메소드가 호출을 통해 buyResultInfo에 의해 선언 된 객체 PurchaseResultInfo . getInAppPurchaseData 메서드가 성공적으로 호출 된 후 InAppPurchaseData 를 얻을 수 있습니다 .

현재 트랜잭션의 제품 ID는 InAppPurchaseData에 저장됩니다 . 참조 : 여기 .

odysseasg Nov 26 2020 at 08:56

@shirley, 예, 실제로도 찾았습니다.

다음 코드는 모든 기기의 Cloud Debugging에서 잘 작동하지만 검토 용으로는 작동하지 않습니다. 따라서 앱이 거부됩니다.

내부 활동 수업 :

private IapClient mIAPClient;

활동 생성시 :

mIAPClient = Iap.getIapClient(this);

사용자가 인앱 구매를 트리거하는 버튼을 클릭하면 :

private void launchPurchase(String purchased_sku) {
    IapRequestHelper.createPurchaseIntent(mIAPClient, purchased_sku, IapClient.PriceType.IN_APP_NONCONSUMABLE, new IapApiCallback<PurchaseIntentResult>() {
        @Override
        public void onSuccess(PurchaseIntentResult result) {
            if (result == null) {
                Log.e(Constants.TAG, "result is null");
                return;
            }
            // you should pull up the page to complete the payment process
            IapRequestHelper.startResolutionForResult(StoreActivity.this, result.getStatus(), Constants.REQ_CODE_BUY);
        }

        @Override
        public void onFail(Exception e) {
            int errorCode = ExceptionHandle.handle(StoreActivity.this, e);
            if (errorCode != ExceptionHandle.SOLVED) {
                Log.i(Constants.TAG, "createPurchaseIntent, returnCode: " + errorCode);
                // handle error scenarios
                switch (errorCode) {
                    case OrderStatusCode.ORDER_PRODUCT_OWNED:
                        Log.i(Constants.TAG, "createPurchaseIntent, returned ORDER_PRODUCT_OWNED");
                        break;
                    default:
                        break;
                }
            }
        }
    });
}

위는 예외 onFail (Exception e)를 포착합니다. ExceptionHandle에서 errorCode를 얻으려고 시도하는 동안 아무것도 얻지 못합니다.

public static int handle(Activity activity, Exception e) {

    if (e instanceof IapApiException) {
        IapApiException iapApiException = (IapApiException) e;
        Log.i(TAG, "returnCode: " + iapApiException.getStatusCode());
        switch (iapApiException.getStatusCode()) {
            case OrderStatusCode.ORDER_STATE_CANCEL:
                Toast.makeText(activity, "Order has been canceled!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_STATE_PARAM_ERROR:
                Toast.makeText(activity, "Order state param error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_STATE_NET_ERROR:
                Toast.makeText(activity, "Order state net error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_VR_UNINSTALL_ERROR:
                Toast.makeText(activity, "Order vr uninstall error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_HWID_NOT_LOGIN:
                IapRequestHelper.startResolutionForResult(activity, iapApiException.getStatus(), Constants.REQ_CODE_LOGIN);
                return SOLVED;
            case OrderStatusCode.ORDER_PRODUCT_OWNED:
                Toast.makeText(activity, "Product already owned error!", Toast.LENGTH_SHORT).show();
                return OrderStatusCode.ORDER_PRODUCT_OWNED;
            case OrderStatusCode.ORDER_PRODUCT_NOT_OWNED:
                Toast.makeText(activity, "Product not owned error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_PRODUCT_CONSUMED:
                Toast.makeText(activity, "Product consumed error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_ACCOUNT_AREA_NOT_SUPPORTED:
                Toast.makeText(activity, "Order account area not supported error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
            case OrderStatusCode.ORDER_NOT_ACCEPT_AGREEMENT:
                Toast.makeText(activity, "User does not agree the agreement", Toast.LENGTH_SHORT).show();
                return SOLVED;
            default:
                // handle other error scenarios
                Toast.makeText(activity, "Order unknown error!", Toast.LENGTH_SHORT).show();
                return SOLVED;
        }
    } else {
        Toast.makeText(activity, "external error", Toast.LENGTH_SHORT).show();
        Log.e(TAG, e.getMessage());
        return SOLVED;
    }
}

리뷰 거부에 첨부 된 동영상에서 "주문 알 수없는 오류!"라는 메시지와 함께 건배합니다. 표시됩니다.

하지만 Cloud Debugging의 동일한 APK가 작동합니다.

내 코드에 어떤 문제가 있습니까?