yandexmobile / metrica-plugin-unity

Unity plugin for Yandex AppMetrica SDK
38 stars 18 forks source link

Запрос к IDFA перестал показываться. #65

Open egorovsa opened 10 months ago

egorovsa commented 10 months ago

Apple M1 Max Unity: 2021.3.32f1 Personal XCODE: Version 15.0.1 (15A507)

Не знаю по каким причинам, запрос к IDFA больше не показывается. Я перепробовал всё, и даже более старые версии Unity. Что-то мне подсказывает что, что-то поменялось в Xcode. Я начал смотреть и дебажить вашу реализацию запроса.

Вот она

/Assets/AppMetrica/Plugins/iOS/YMMBridge.m

void ymm_requestTrackingAuthorization(YMMRequestTrackingAuthorization callbackDelegate, YMMAction actionPtr)
{
    if (@available(iOS 14, *)) {
        void *handle = dlopen("AppTrackingTransparency.framework/AppTrackingTransparency", RTLD_LAZY);
        if (handle != NULL) {
            Class gMMSTrackingManager = NSClassFromString(@"ATTrackingManager");

            if ([gMMSTrackingManager respondsToSelector:@selector(requestTrackingAuthorizationWithCompletionHandler:)]) {
                [gMMSTrackingManager performSelector:@selector(requestTrackingAuthorizationWithCompletionHandler:) withObject:^(YMMTrackingStatus status) {
                    if (callbackDelegate != nil) {
                        callbackDelegate(actionPtr, status);
                    }
                }];
            }
        }
    }
}

и заметил что он не находит библиотеку при попытке динамической загрузки.

void *handle = dlopen("AppTrackingTransparency.framework/AppTrackingTransparency", RTLD_LAZY); ну и дальше собственно ничего не происходит.

Я решил временно для себя вопрос, руками добавил

#import <AppTrackingTransparency/AppTrackingTransparency.h> его же добавил в xcode в UnityFramework -> General -> Framework and Libraries -> AppTrackingTransparency.framework

в вашем коде убрал динамическую загрузку и все начинает работать .

void ymm_requestTrackingAuthorization(YMMRequestTrackingAuthorization callbackDelegate, YMMAction actionPtr)
{
    if (@available(iOS 14, *)) {
        Class gMMSTrackingManager = NSClassFromString(@"ATTrackingManager");

        if ([gMMSTrackingManager respondsToSelector:@selector(requestTrackingAuthorizationWithCompletionHandler:)]) {
            [gMMSTrackingManager performSelector:@selector(requestTrackingAuthorizationWithCompletionHandler:) withObject:^(YMMTrackingStatus status) {
                if (callbackDelegate != nil) {
                    callbackDelegate(actionPtr, status);
                }
            }];
        }
    }
}
egorovsa commented 10 months ago

Мне почему то кажется что Xcode выпилил возможность динамически подключать этот фреймворк потому что он теперь доступен в XCODE. и добавляется через Линковку.

В динамическом подключении мне думается уже нет смысла.

Я так же добавил в юнити при билде автоматическое подключение этого фреймворвка, чтобы при каждом билде его не добавлять руками.

/Assets/Editor/XcodeSwiftVersionPostProcess.cs

using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public static class XcodeSwiftVersionPostProcess
{
    [PostProcessBuild(999)]
    public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
    {
        if (buildTarget == BuildTarget.iOS)
        {
            AddAppTrackingTransparency(path);
        }
    }

    private static void AddAppTrackingTransparency(string path)
    {
        // Путь к папке проекта Xcode
        string projPath = PBXProject.GetPBXProjectPath(path);

        PBXProject proj = new PBXProject();
        proj.ReadFromFile(projPath);

#if UNITY_2019_3_OR_NEWER
        string targetGuid = proj.GetUnityMainTargetGuid();
#else
        string targetGuid = proj.TargetGuidByName(PBXProject.GetUnityTargetName());
#endif

        // Добавить фреймворк AppTrackingTransparency.framework
        proj.AddFrameworkToProject(targetGuid, "AppTrackingTransparency.framework", false);

        // Сохранить изменения в файле проекта
        proj.WriteToFile(projPath);
    }
}