유료 앱으로 출시하고 싶은 앱이 있습니다. 5 일이라는 시간 제한이있는 “체험판”버전 인 다른 버전을 갖고 싶습니다.
어떻게하면 되나요?
답변
현재 대부분의 개발자는 다음 세 가지 기술 중 하나를 사용하여이를 수행합니다.
첫 번째 접근 방식은 쉽게 우회 할 수 있습니다. 앱을 처음 실행할 때 날짜 / 시간을 파일, 데이터베이스 또는 공유 기본 설정에 저장하고 그 후 앱을 실행할 때마다 평가 기간이 종료되었는지 확인합니다. 제거하고 다시 설치하면 사용자가 다른 평가 기간을 가질 수 있기 때문에 우회하기 쉽습니다.
두 번째 접근 방식은 우회하기가 더 어렵지만 여전히 우회 할 수 있습니다. 하드 코딩 된 시한 폭탄을 사용하십시오. 기본적으로이 접근 방식을 사용하면 평가판의 종료 날짜를 하드 코딩하고 앱을 다운로드하고 사용하는 모든 사용자가 동시에 앱을 사용할 수 없게됩니다. 구현하기 쉽고 대부분의 경우 세 번째 기술의 문제를 겪고 싶지 않았기 때문에이 접근 방식을 사용했습니다. 사용자는 휴대폰에서 수동으로 날짜를 변경하여이를 피할 수 있지만 대부분의 사용자는 이러한 작업을 수행하는 데 어려움을 겪지 않습니다.
세 번째 기술은 당신이하고 싶은 일을 진정으로 성취 할 수있는 유일한 방법입니다. 서버를 설정해야하며 애플리케이션이 시작될 때마다 앱이 전화기 고유 식별자 를 서버로 보냅니다. 서버에 해당 전화 ID에 대한 항목이 없으면 새 항목을 만들고 시간을 기록합니다. 서버에 전화 ID에 대한 항목이있는 경우 평가 기간이 만료되었는지 간단한 확인을 수행합니다. 그런 다음 평가판 만료 확인 결과를 애플리케이션에 다시 전달합니다. 이 접근 방식은 피할 수 없어야하지만 웹 서버 등을 설정해야합니다.
항상 onCreate에서 이러한 검사를 수행하는 것이 좋습니다. 만료가 끝나면 앱의 정식 버전에 대한 시장 링크 가 포함 된 AlertDialog가 팝업 됩니다. “확인”버튼 만 포함하고 사용자가 “확인”을 클릭하면 “finish ()”를 호출하여 활동을 종료합니다.
답변
Android Studio 프로젝트에 간단히 드롭 할 수 있는 Android 평가판 SDK 를 개발했으며 오프라인 유예 기간을 포함하여 모든 서버 측 관리를 처리합니다.
사용하려면 간단히
메인 모듈에 라이브러리 추가 build.gradle
dependencies {
compile 'io.trialy.library:trialy:1.0.2'
}
주요 활동의 onCreate()
방법으로 라이브러리 초기화
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Initialize the library and check the current trial status on every launch
Trialy mTrialy = new Trialy(mContext, "YOUR_TRIALY_APP_KEY");
mTrialy.checkTrial(TRIALY_SKU, mTrialyCallback);
}
콜백 핸들러를 추가합니다.
private TrialyCallback mTrialyCallback = new TrialyCallback() {
@Override
public void onResult(int status, long timeRemaining, String sku) {
switch (status){
case STATUS_TRIAL_JUST_STARTED:
//The trial has just started - enable the premium features for the user
break;
case STATUS_TRIAL_RUNNING:
//The trial is currently running - enable the premium features for the user
break;
case STATUS_TRIAL_JUST_ENDED:
//The trial has just ended - block access to the premium features
break;
case STATUS_TRIAL_NOT_YET_STARTED:
//The user hasn't requested a trial yet - no need to do anything
break;
case STATUS_TRIAL_OVER:
//The trial is over
break;
}
Log.i("TRIALY", "Trialy response: " + Trialy.getStatusMessage(status));
}
};
평가판을 시작하려면 mTrialy.startTrial("YOUR_TRIAL_SKU", mTrialyCallback);
앱 키로 전화하면 평가판 SKU는 Trialy 개발자 대시 보드 에서 찾을 수 있습니다 .
답변
이것은 오래된 질문이지만 어쨌든 누군가에게 도움이 될 것입니다.
가장 단순한 접근 방식 ( 앱을 제거 / 재설치하거나 사용자가 기기의 날짜를 수동으로 변경 하면 실패 함) 을 사용하려는 경우 다음과 같이 할 수 있습니다.
private final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
private final long ONE_DAY = 24 * 60 * 60 * 1000;
@Override
protected void onCreate(Bundle state){
SharedPreferences preferences = getPreferences(MODE_PRIVATE);
String installDate = preferences.getString("InstallDate", null);
if(installDate == null) {
// First run, so save the current date
SharedPreferences.Editor editor = preferences.edit();
Date now = new Date();
String dateString = formatter.format(now);
editor.putString("InstallDate", dateString);
// Commit the edits!
editor.commit();
}
else {
// This is not the 1st run, check install date
Date before = (Date)formatter.parse(installDate);
Date now = new Date();
long diff = now.getTime() - before.getTime();
long days = diff / ONE_DAY;
if(days > 30) { // More than 30 days?
// Expired !!!
}
}
...
}
답변
이 질문과 snctln 의 답변은 저의 학사 논문으로 방법 3을 기반으로 한 솔루션을 작업하도록 영감을주었습니다. 나는 현재 상태가 생산적인 사용을위한 것이 아니라는 것을 알고 있지만 그것에 대해 어떻게 생각하는지 듣고 싶습니다! 그런 시스템을 사용 하시겠습니까? 클라우드 서비스로 보시겠습니까 (서버 구성에 문제가 없음)? 보안 문제 또는 안정성 이유가 걱정 되십니까?
학사 과정을 마치는 즉시 소프트웨어 작업을 계속하고 싶습니다. 이제 여러분의 피드백이 필요합니다!
소스 코드는 GitHub https://github.com/MaChristmann/mobile-trial에서 호스팅됩니다.
시스템에 대한 몇 가지 정보 :-시스템에는 Android 라이브러리, node.js 서버 및 여러 평가판 앱 및 게시자 / 개발자 계정을 관리하기위한 구성 기의 세 부분이 있습니다.
-
시간 기반 평가판 만 지원하며 전화 ID가 아닌 사용자 (Play 스토어 또는 기타) 계정을 사용합니다.
-
Android 라이브러리의 경우 Google Play 라이선스 확인 라이브러리를 기반으로합니다. node.js 서버에 연결하도록 수정했으며 추가로 라이브러리는 사용자가 시스템 날짜를 변경했는지 인식하려고 시도합니다. 또한 검색된 평가판 라이센스를 AES 암호화 된 공유 기본 설정에 캐시합니다. 구성자를 사용하여 캐시의 유효 시간을 구성 할 수 있습니다. 사용자가 “데이터를 지우는”경우 라이브러리는 서버 측 검사를 강제합니다.
-
서버는 https를 사용하고 있으며 라이센스 확인 응답에 디지털 서명도합니다. CRUD 평가판 앱 및 사용자 (게시자 및 개발자)를위한 API도 있습니다. Licensing Verfication Library 개발자와 유사한 개발자는 테스트 결과와 함께 평가판 앱에서 동작 구현을 테스트 할 수 있습니다. 따라서 구성자에서 라이센스 응답을 “라이센스 있음”, “라이센스 없음”또는 “서버 오류”로 명시 적으로 설정할 수 있습니다.
-
새로운 기능으로 앱을 업데이트하는 경우 모든 사람이 다시 시도 할 수 있기를 원할 수 있습니다. 구성 관리자에서이를 트리거해야하는 버전 코드를 설정하여 만료 된 라이선스가있는 사용자의 평가판 라이선스를 갱신 할 수 있습니다. 예를 들어 사용자가 버전 코드 3에서 앱을 실행하고 있고 버전 코드 4의 기능을 사용해 보길 원합니다. 그가 앱을 업데이트하거나 다시 설치하면 서버가 마지막으로 시도한 버전을 알고 있기 때문에 전체 평가 기간을 다시 사용할 수 있습니다. 시각.
-
모든 것은 Apache 2.0 라이선스하에 있습니다.
답변
이를 수행하는 가장 쉽고 가장 좋은 방법은 BackupSharedPreferences를 구현하는 것입니다.
앱을 제거하고 다시 설치하더라도 기본 설정은 유지됩니다.
설치 날짜를 기본 설정으로 저장하기 만하면됩니다.
이론은 다음과 같습니다.
http://developer.android.com/reference/android/app/backup/SharedPreferencesBackupHelper.html
답변
접근 방식 4 : 애플리케이션 설치 시간을 사용합니다.
API 레벨 9 (Android 2.3.2, 2.3.1, Android 2.3, GINGERBREAD)부터 .NET Framework에는 firstInstallTime 및 lastUpdateTime 이 PackageInfo
있습니다.
자세히 알아보기 :
Android에서 앱 설치 시간을 얻는 방법
답변
이제 최신 버전의 Android 무료 평가판 구독이 추가되었으므로 무료 평가판 기간 동안 앱 내에서 구독을 구매 한 후에 만 앱의 모든 기능을 잠금 해제 할 수 있습니다. 이렇게하면 사용자가 평가 기간 동안 앱을 사용할 수 있으며, 평가 기간 후에도 앱이 제거되면 구독 금액이 귀하에게 이체됩니다. 나는 시도하지 않았지만 아이디어를 공유했습니다.