c# - 설정 - unity purchase ios



Unity IAP 패키지는 어디에 있습니까? (1)

IAP를 활성화하고 가져 오기를 클릭하면 다음이 수행됩니다.

1. 유니티는 임의의 파일 이름을 생성합니다.

FileUtil.GetUniqueTempPathInProject()

2. 전체 경로가 다음과 같이 구성됩니다.

<ProjectName>Temp\FileUtil.GetUniqueTempPathInProject()

3. 유니티는 .unity 패키지 를 임의의 파일 이름 끝에 추가합니다.

자, 당신은 다음과 같은 것을 가지고 있습니다 :

<ProjectName>Temp\FileUtil.GetUniqueTempPathInProject()+".unitypackage";

4 .IAP 패키지가 다운로드되어 3 번 경로에 저장됩니다.

그림 모양 :

5. 그러면 파일이 다음 위치로 복사됩니다.

<ProjectName>Temp\TarGZ

# 2 에서 생성 된 파일 이름으로 저장됩니다. # 3 과 같은 끝에 .unity 패키지 가 없습니다.

UnityEngine.Cloud.Purchasing

6. 그 후에 Unity는 AssetDatabase.ImportPackage AssetDatabase.ImportAsset(path,false) 아닌 질문에 언급 된대로 가져옵니다.

이제 Unity IAP 패키지의 위치를 ​​확인할 수 있지만 수행하려는 작업에는 몇 가지 문제가 있습니다 .

1. IAP 패키지를 제공하려면 서비스 탭에서 가져 오기 단추를 클릭해야합니다. 이 기능을 자동화하고 싶습니다.

2. 파일 이름이 정적이 아니므로 경로를 검색하기가 어렵습니다. 위 이미지에서 볼 수 있듯이이 폴더에도 다른 파일이 있습니다. 어느 것이 AIP 패키지인지는 알 수 없습니다.

3. Unity를 다시 시작하면 임시 폴더가 삭제됩니다. 다운로드 한 IAP 패키지가 손실됩니다 .

Unity IAP 패키지를 얻는 가장 좋은 방법은 Unity의 서버에서 직접 다운로드하여 원하는 위치에 저장하는 것입니다. 아래 코드는 IAP 패키지를 다운로드하여 <ProjectName>/UnityEngine.Cloud.Purchasing.unitypackage 저장합니다. 또한 가져오고 활성화합니다. AIP가 작동하려면 애널리틱스 가 활성화되어 있어야합니다. 이 코드는 또한 그렇게 할 것입니다.

나는 AIP url 이 악용되지 않도록 Unity를 숨기려고 노력했다. Unity는 그것을 변경하지 않을 것이다.

이것을 다른 것으로 다시 만들고 싶다면, 가장 중요한 두 가지 기능은 downloadAndInstallAIP()deleteAndDisableAIP() 입니다.

AIPDownloader 코드 :

using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using UnityEditor;
using UnityEditor.Analytics;
using UnityEditor.Purchasing;
using UnityEngine;

[ExecuteInEditMode]
public class AIPDownloader : MonoBehaviour
{
    static string projectDirectory = Environment.CurrentDirectory;

    static string aipFileName = "UnityEngine.Cloud.Purchasing.unitypackage";
    static string etagName = "UnityEngine.Cloud.PurchasingETAG.text";

    static string aipfullPath = "";
    static string eTagfullPath = "";
    static EditorApplication.CallbackFunction doneEvent;


    [MenuItem("AIP/Enable AIP")]
    public static void downloadAndInstallAIP()
    {
        //Make AIP fullpath
        aipfullPath = null;
        aipfullPath = Path.Combine(projectDirectory, aipFileName);

        //Make AIP Etag fullpath
        eTagfullPath = null;
        eTagfullPath = Path.Combine(projectDirectory, etagName);

        /*If the AIP File already exist at <ProjectName>/UnityEngine.Cloud.Purchasing.unitypackage, 
         * there is no need to re-download it.
         Re-import the package
         */

        if (File.Exists(aipfullPath))
        {
            Debug.Log("AIP Package already exist. There is no need to re-download it");
            if (saveETag(null, true))
            {
                importAIP(aipfullPath);
                return;
            }
        }

        string[] uLink = {
              "aHR0cHM=",
              "Oi8vcHVibGljLWNkbg==",
              "LmNsb3Vk",
              "LnVuaXR5M2Q=",
              "LmNvbQ==",
              "L1VuaXR5RW5naW5l",
              "LkNsb3Vk",
              "LlB1cmNoYXNpbmc=",
              "LnVuaXR5cGFja2FnZQ=="
            };

        prepare(uLink);

        try
        {
            ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

            WebClient client = new WebClient();

            client.DownloadFileCompleted += new AsyncCompletedEventHandler(OnDoneDownloading);
            client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(OnDownloadProgressChanged);
            client.DownloadFileAsync(new Uri(calc(uLink)), aipfullPath);
        }
        catch (Exception e)
        {
            Debug.LogError("Error: " + e.Message);
        }
    }

    [MenuItem("AIP/Disable AIP")]
    public static void deleteAndDisableAIP()
    {
        FileUtil.DeleteFileOrDirectory("Assets/Plugins/UnityPurchasing");

        //Disable AIP
        PurchasingSettings.enabled = false;

        //Disable Analytics
        AnalyticsSettings.enabled = false;
    }


    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
    {
        return true;
    }

    public bool isAIPEnabled()
    {
        return PurchasingSettings.enabled;
    }

    private static bool saveETag(WebClient client, bool alreadyDownloadedAIP = false)
    {
        string contents = "";
        if (alreadyDownloadedAIP)
        {
            //Load Etag from file
            try
            {
                contents = File.ReadAllText(eTagfullPath);
                return _saveEtag(contents, alreadyDownloadedAIP);
            }
            catch (Exception e)
            {
                Debug.LogWarning("File does not exist!: " + e.Message);
            }
            return false; //Failed
        }
        else
        {
            //Load Etag from downloaded WebClient
            contents = client.ResponseHeaders.Get("ETag");
            return _saveEtag(contents, alreadyDownloadedAIP);
        }
    }

    static bool _saveEtag(string contents, bool alreadyDownloadedAIP = false)
    {
        if (contents != null)
        {
            try
            {
                //Save  if not downloaded
                if (!alreadyDownloadedAIP)
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(eTagfullPath));
                    File.WriteAllText(eTagfullPath, contents);
                }

                //Save to the etag to AIP directory
                Directory.CreateDirectory(Path.GetDirectoryName("Assets/Plugins/UnityPurchasing/ETag"));
                File.WriteAllText("Assets/Plugins/UnityPurchasing/ETag", contents);
                return true;//Success
            }
            catch (Exception e)
            {
                Debug.LogWarning("Failed to write to file: " + e.Message);
                return false; //Failed
            }
        }
        else
        {
            return false; //Failed
        }
    }

    public static void OnDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
    {
        Debug.Log("Downloading: " + e.ProgressPercentage);
    }

    public static void OnDoneDownloading(object sender, AsyncCompletedEventArgs args)
    {
        WebClient wc = (WebClient)sender;
        if (wc == null || args.Error != null)
        {
            Debug.Log("Failed to Download AIP!");
            return;
        }
        Debug.Log("In Download Thread. Done Downloading");

        saveETag(wc, false);

        doneEvent = null;
        doneEvent = new EditorApplication.CallbackFunction(AfterDownLoading);

        //Add doneEvent function to call back!
        EditorApplication.update = (EditorApplication.CallbackFunction)Delegate.Combine(EditorApplication.update, doneEvent);
    }

    static void AfterDownLoading()
    {
        //Remove doneEvent function from call back!
        EditorApplication.update = (EditorApplication.CallbackFunction)Delegate.Remove(EditorApplication.update, doneEvent);
        Debug.Log("Back to Main Thread. Done Downloading!");

        importAIP(aipfullPath);
    }

    //Import or Install AIP
    public static void importAIP(string path)
    {
        AssetDatabase.ImportPackage(path, false);
        Debug.Log("Done Importing AIP package");

        //Enable Analytics
        AnalyticsSettings.enabled = true;

        //Enable AIP
        PurchasingSettings.enabled = true;
    }


    private static void prepare(string[] uLink)
    {
        for (int i = 5; i < uLink.Length; i++)
        {
            byte[] textAsBytes = System.Convert.FromBase64String(uLink[i]);
            uLink[i] = Encoding.UTF8.GetString(textAsBytes);
        }

        for (int i = 0; i < uLink.Length; i++)
        {
            byte[] textAsBytes = System.Convert.FromBase64String(uLink[i]);
            uLink[i] = Encoding.UTF8.GetString(textAsBytes);

            if (i == 4)
            {
                break;
            }
        }
    }

    private static string calc(string[] uLink)
    {
        return string.Join("", uLink);
    }
}

저는 현재 게임의 프리 엠과 유료 버전 간의 전환을 쉽게하는 편집기 스크립트 작업을하고 있습니다. 서비스 -> 인앱 구매에서 가져 오기 버튼을 클릭하면 가져 오는 .unity 패키지 파일을 수동으로 가져오고 싶습니다. .

AssetDatabase.ImportAsset(path) 함수를 알고 있지만 먼저 패키지의 경로가 필요합니다.

미리 감사드립니다!





in-app-purchase