2012-05-16 1 views
9

다양한 자동 갱신 구독에 대한 iOS 앱의 인앱 구매를 구현 중입니다. 지불이 완료되면 거래 정보를 서버 (클라우드)로 보내 정보를 기록하여 일정 간격으로 영수증을 확인하여 구독이 유효한지, 취소/환불 또는 갱신되지 않았는지 확인해야합니다. 우리는 인앱 구매 가이드와 공유 비밀을 통해 정해진 간격으로 서버에서 JSON 호출을 만들려고합니다. 그러나 아직까지는 그렇게하지 못했지만 구매하기 전에 관련 데이터를 가져야합니다. 즉, NSData 객체 인 TransactionReceipt입니다.NSData with base64encoded 및 C#의 바이트 배열

우리는 TransactionReceipt에 대한 우리의 웹 서비스에 두 개의 매개 변수를 보내고 싶습니다 (구입 한 ProductID와 같은 다른 항목들 중에서). 이것을 JSON 요청에서 검증을 위해 보내야한다고 생각하는 base64 인코딩 된 값으로 보내려고합니다. 그러면 SQL Server에이 값을 저장합니다.

HOw, MonoTouch/C#을 사용하여 NSData "TransactionReceipt"를 base64 인코딩 및 바이트 []로 변환 할 수 있습니까?

감사합니다.

답변

6

Stream 또는 BytesLength 속성을 사용하여 NSData에서 데이터를 가져 오는 두 가지 쉬운 방법이 있습니다.

public byte[] ToByte (NSData data) 
{ 
    MemoryStream ms = new MemoryStream(); 
    data.AsStream().CopyTo (ms); 
    return ms.ToArray(); 
} 

BytesLength 버전은 다음과 같습니다 :

public byte[] ToByte (NSData data) 
{ 
    byte[] result = new byte[data.Length]; 
    Marshal.Copy (data.Bytes, result, 0, (int) data.Length); 
    return result; 
} 

base64로 출력 문자열을 얻기가 동일한 남아 : 같은 스트림 버전이 보일 것 너무 작동

public string ToBase64String (NSData data) 
{ 
    return Convert.ToBase64String (ToByte (data)); 
} 
+0

최상위 ToByte 메서드를 사용하려고 할 때이 오류가 발생했습니다. // 메시지 : NSMutableData의 래퍼가 지원되지 않음 대신 new UnmanagedMemoryStream ((Byte *) mutableData.Bytes, mutableData.Length)을 호출하십시오. // 예외 : 래퍼 NSMutableData가 지원되지 않으므로 대신에 새로운 UnmanagedMemoryStream (Byte *) mutableData.Bytes, mutableData.Length를 호출하십시오 ::: MonoTouch.Foundation.NSData.AsStream() [0x0002f] in/Developer/MonoTouch/Source/monotouch/src /shared/Foundation/NSData.cs:144 – Neal

+0

'NSData'가 모두 변경 가능하지는 않고 'AsStream'이이를 확인하지는 않습니다 : https://github.com/mono/maccore/blob/master/src/Foundation/NSData .cs # L136 제안 된 코드를 사용해 볼 수 있습니다 (예 : 'UnmanagedMemoryStream') 또는 내가 제공 한'ToByte'의 두번째 버전 ('Marshal'을 사용하고 데이터를 복사합니다). – poupou

0

:

string yourDataInBase64 = Convert.ToBase64String(yourData.ToArray());