앱 영수증은 장치 로컬 저장소에 저장되며 아래의 방법으로 읽어올 수 있습니다.
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
string receipt = builder.Configure<IAppleConfiguration>().appReceipt;
앱 내 구매가 장치 설정으로 제한되어 있을 수도 있으며 아래의 방법으로 확인할 수 있습니다.
var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance());
bool canMakePayments = builder.Configure<IAppleConfiguration>().canMakePayments;
Apple 플랫폼의 경우 사용자가 비밀번호를 입력해야만 이전 거래 내역을 검색해서 가져올 수 있으므로 애플리케이션 내에 해당 과정을 진행할 수 있는 버튼이 제공되어야 합니다. 이 과정 동안 IStoreListener
의 ProcessPurchase
메서드가 사용자가 소유하고 있는 각각의 항목에 대해 호출됩니다.
/// <summary>
/// Your IStoreListener implementation of OnInitialized.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
extensions.GetExtension<IAppleExtensions> ().RestoreTransactions (result => {
if (result) {
// This does not mean anything was restored,
// merely that the restoration process succeeded.
} else {
// Restoration failed.
}
});
}
Apple은 로컬 저장소에 영수증이 현재 캐시되어 있지 않은 경우 일반적으로 사용하는 새로 앱 영수증을 서버에서 페치하는 메커니즘을 제공합니다. SKReceiptRefreshRequest.
이 경우 사용자가 비밀번호를 입력해야 한다는 점을 참고해야 합니다.
Unity IAP에서는 다음과 같은 방법으로 이 메서드를 사용할 수 있습니다.
/// <summary>
/// Your IStoreListener implementation of OnInitialized.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
extensions.GetExtension<IAppleExtensions> ().RefreshAppReceipt (receipt => {
// This handler is invoked if the request is successful.
// Receipt will be the latest app receipt.
Console.WriteLine(receipt);
},
() => {
// This handler will be invoked if the request fails,
// such as if the network is unavailable or the user
// enters the wrong password.
});
}
iOS 8에서는 새로운 보호자 관리 기능인 구매 허가를 도입했습니다.
구매 허가 기능을 통해 애플리케이션 내 구매가 부모 승인 이전까지 지연됩니다. 아래와 같은 방법으로 Unity IAP에서 애플리케이션에 선택한 경우 알림을 보내도록 설정할 수 있습니다.
/// <summary>
/// This will be called when Unity IAP has finished initialising.
/// </summary>
public void OnInitialized(IStoreController controller, IExtensionProvider extensions)
{
extensions.GetExtension<IAppleExtensions>().RegisterPurchaseDeferredListener(product => {
Console.WriteLine(product.definition.id);
});
}
구매가 승인 또는 거부된 경우 스토어 리스너의 일반 ProcessPurchase/OnPurchaseFailed 메서드가 호출됩니다.
Apple 스토어에서 테스트를 진행하려면 iTunes Connect에서 생성할 수 있는 iTunes Connect 테스트 계정을 사용해야 합니다.
iOS 장치나 노트북에서 앱 스토어 로그아웃을 한 후 애플리케이션을 실행하고 구매나 거래 복원 시도를 하면 로그인 화면이 나타납니다.
NoProductsAvailable
초기화 오류가 발생하는 경우 다음의 사항을 확인해야 합니다.
데스크톱 Mac 빌드를 빌드하는 경우 Unity 빌드 설정에서 Mac App Store validation
를 선택해야 합니다.
앱을 빌드한 이후 앱의 info.plist 파일을 번들 식별자와 버전 문자열에 업데이트해야 합니다. .app
파일을 마우스 오른쪽 버튼으로 클릭한 후 show package contents
를 클릭한 다음 info.plist
파일을 위치시킨 후 CFBundleIdentifier
문자열을 애플리케이션 번들 식별자에 업데이트해야 합니다.
애플리케이션을 서명, 패키지, 설치해야 합니다. OSX 터미널에서 다음 커맨드를 실행해야 합니다.
codesign -f --deep -s "3rd Party Mac Developer Application: " your.app/Contents/Plugins/unitypurchasing.bundle
codesign -f --deep -s "3rd Party Mac Developer Application: " your.app
productbuild --component your.app /Applications --sign "3rd Party Mac Developer Installer: " your.pkg
번들을 서명하기 위해, 우선 Contents.meta 파일이 존재하는 경우 제거해야 합니다. your.app/Contents/Plugins/unitypurchasing.bundle/Contents.meta
경로에 있습니다.
패키지를 올바르게 설치하려면 새로 생성된 패키지를 실행하기 이전 언패키지된 .app 파일을 삭제해야 합니다.
그 다음, 앱을 Applications 폴더에서 실행해야 합니다. 처음 실행하면 iTunes 계정 정보를 입력하라는 창이 나타날 것이며, 여기에는 iTunes Connect 테스트 사용자 계정 로그인 정보를 입력해야 합니다. 이제 샌드박스 환경에서 테스트 구매를 진행할 수 있습니다.