Aracılığıyla paylaş


App Center Kilitleniyor (Unity)

Önemli

Visual Studio App Center 31 Mart 2025'te kullanımdan kaldırılıyor. Tamamen kullanımdan kaldırılana kadar Visual Studio App Center'ı kullanmaya devam edebilirsiniz ancak geçiş yapmayı düşünebileceğiniz birkaç önerilen alternatif vardır.

Destek zaman çizelgeleri ve alternatifleri hakkında daha fazla bilgi edinin.

App Center Kilitlenmeleri, uygulamanızın her kilitlenmesinde otomatik olarak bir kilitlenme günlüğü oluşturur ve cihaz depolama alanına bir günlük ekler. Kullanıcı uygulamayı yeniden başlattığında SDK kilitlenme raporunu App Center'a gönderir. Kilitlenmeleri toplamak hem beta hem de canlı uygulamalarda, yani Google Play'e gönderilen kilitlenmelerde çalışır. Kilitlenme günlükleri, kilitlenmeyi düzeltmenize yardımcı olacak değerli bilgiler içerir.

Uygulamanızda SDK'yı henüz ayarlamadıysanız Unity Başlarken bölümündeki yönergeleri izleyin.

iOS'ta kilitlenme günlükleri Sembolikleştirme gerektirir. Simgeselleştirmeyi etkinleştirmek için, uygulamanız için sembolleri nasıl sağlayabileceğinizi açıklayan App Center Tanılama belgelerine bakın.

Önemli

Unity için Crashes SDK'sı UWP'yi desteklemez. Bu sayfadaki yönergeler yalnızca Android ve iOS'yi kapsar.

Not

Hata ayıklayıcısını eklediyseniz SDK hiçbir kilitlenme günlüğünü iletmez. Uygulamayı kilitlediğinizde hata ayıklayıcının bağlı olmadığından emin olun.

Not

PlayerSettings'te etkinleştirdiyseniz Enable CrashReport API SDK kilitlenme günlüklerini toplamaz.

Test kilitlenmesi oluşturma

App Center Kilitlenmeleri, SDK'nın kolay testine yönelik bir test kilitlenmesi oluşturmak için size bir API sağlar. Bu API hata ayıklama ve sürüm yapılandırmalarını denetler. Bu nedenle, yalnızca hata ayıklarken kullanabilirsiniz çünkü sürüm uygulamalarında çalışmaz.

Crashes.GenerateTestCrash();

Not

Bu yöntem yalnızca Geliştirme Derlemesi ayarı açık durumdayken çalışır.

Önceki kilitlenme hakkında daha fazla bilgi edinin

App Center Kilitlenmeleri, uygulamanızın kilitlenmesi durumunda size daha fazla bilgi veren iki API'ye sahiptir.

Uygulama önceki oturumda yetersiz bellek uyarısı mı almış?

SDK'yı başlattıktan sonra, uygulamanın önceki oturumda bellek uyarısı aldığını kontrol edebilirsiniz:

bool hadLowMemoryWarning = Crashes.HasReceivedMemoryWarningInLastSessionAsync().Result;

Not

Bu yöntem içinde Awake()çalışmaz.

Not

Bazı durumlarda, belleği düşük olan bir cihaz olay gönderemez.

Uygulama önceki oturumda kilitleniyor mu?

SDK'yı başlattıktan sonra uygulamanın önceki başlatmada kilitlenip kilitlenmediğini kontrol edebilirsiniz:

bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();

Kilitlenme gerçekleştikten sonra uygulamanızın davranışını veya kullanıcı arabirimini ayarlamak istiyorsanız arama HasCrashedInLastSessionAsync yararlı olur. Bazı geliştiriciler, kullanıcılarından özür dilemek için ek kullanıcı arabirimi gösterir veya kilitlenme gerçekleştikten sonra iletişim kurmak ister.

Son kilitlenmeyle ilgili ayrıntılar

Uygulamanız daha önce kilitlendiyse son kilitlenmeyle ilgili ayrıntıları alabilirsiniz.

ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();

Bu API için en yaygın kullanım örneği, kullanıcının özel Kilitlenme temsilcisini veya dinleyicisini uyguladığı durumlardır.

App Center Kilitlenmeleri kullanımınızı özelleştirme

App Center Kilitlenmeleri, geliştiricilerin App Center'a kilitlenme günlükleri göndermeden önce ve gönderdiklerinde ek eylemler gerçekleştirmesi için geri aramalar sağlar.

Not

App Center başlamadan önce geri çağırmayı ayarlayın; örneğin yöntemde Awake , App Center başlangıçtan hemen sonra kilitlenmeleri işlemeye başladığından.

Kilitlenme işlenmeli mi?

Belirli bir kilitlenmenin işlenmesi gerekip gerekmediğine karar vermek istiyorsanız aşağıdaki geri aramayı ayarlayın. Örneğin, yoksaymak ve App Center'a göndermek istemediğiniz bir sistem düzeyinde kilitlenme olabilir.

Crashes.ShouldProcessErrorReport = (ErrorReport report) =>
{
     // Check the report in here and return true or false depending on the ErrorReport.
    return true;
};

Kullanıcı gizliliği sizin için önemliyse, App Center'a kilitlenme raporu göndermeden önce kullanıcı onayı almak isteyebilirsiniz. SDK, App Center Kilitlenmeleri'ne kilitlenme raporlarını göndermeden önce kullanıcı onayını beklemesini bildiren bir geri arama sunar.

Kodunuz bu geri çağırmayı kullanıyorsa, kullanıcının onayını almak sizin sorumluluğunuzdadır. Seçeneklerden biri, aşağıdaki seçeneklerden birini içeren bir iletişim kutusu istemidir: Her Zaman Gönder, Gönder ve Gönderme. Girişe bağlı olarak App Center Kilitlenmesi'ne ne yapması gerektiğini söyleyeceksiniz ve kilitlenme buna göre işlenir.

Not

SDK bunun için bir iletişim kutusu görüntülemez, uygulamanın kullanıcı onayı istemek için kendi kullanıcı arabirimini sağlaması gerekir.

Aşağıdaki geri arama, SDK'ya kilitlenmeleri göndermeden önce kullanıcı onayını beklemesini nasıl söyleyeceğinizi gösterir:

Crashes.ShouldAwaitUserConfirmation = () =>
{
    // Build your own UI to ask for user consent here. SDK doesn't provide one by default.

    // Return true if you built a UI for user consent and are waiting for user input on that custom UI, otherwise false.
    return true;
};

Geri arama döndürürse true, kullanıcı iznini almanız ve aşağıdaki API'yi kullanarak sonucu SDK'ya iletin:

// Depending on the user's choice, call Crashes.NotifyUserConfirmation() with the right value.
Crashes.NotifyUserConfirmation(UserConfirmation.DontSend);
Crashes.NotifyUserConfirmation(UserConfirmation.Send);
Crashes.NotifyUserConfirmation(UserConfirmation.AlwaysSend);

Örnek olarak özel iletişim kutusu örneğimize başvurabilirsiniz.

Kilitlenme günlüğünün gönderme durumu hakkında bilgi alma

Bazen uygulamanızın kilitlenme durumunu bilmek istersiniz. Yaygın bir kullanım örneği, kullanıcıya uygulamanın kilitlenme raporu gönderdiğini bildiren bir kullanıcı arabirimi görüntülemektir. Başka bir senaryo, kilitlenme günlüklerinin yeniden başlatma işleminden kısa süre sonra gönderildiğinden emin olmak için uygulamanın davranışını ayarlamak istemenizdir. App Center Kilitlenmeleri, gerçekleşen durumlarla ilgili bildirim almak için yapabileceğiniz üç farklı geri arama sağlar:

SDK bir kilitlenme günlüğü göndermeden önce aşağıdaki geri arama çağrılır

Crashes.SendingErrorReport += (errorReport) =>
{
    // Your code, e.g. to present a custom UI.
};

Uç noktada ağ sorunları veya kesinti olması ve uygulamayı yeniden başlatmanız durumunda işlem SendingErrorReport yeniden başlatıldıktan sonra yeniden tetikleniyor.

SDK başarılı bir şekilde bir kilitlenme günlüğü gönderdikten sonra aşağıdaki geri arama çağrılır

Crashes.SentErrorReport += (errorReport) =>
{
    // Your code, e.g. to hide the custom UI.
};

SDK bir kilitlenme günlüğü gönderemezse aşağıdaki geri arama çağrılır

Crashes.FailedToSendErrorReport += (errorReport, exception) =>
{
    // Your code goes here.
};

Alma FailedToSendErrorReport , 4xx kodu gibi kurtarılamaz bir hata oluştuğu anlamına gelir. Örneğin, 401 yanlış olduğu anlamına gelir appSecret .

Bu geri arama bir ağ sorunuysa tetiklenmemiştir. Bu durumda SDK yeniden denemeye devam eder (ve ağ bağlantısı kapalıyken yeniden denemeleri duraklatır).

Kilitlenme veya işlenmeyen özel durum raporuna ek ekleme

ayrıca isteğe bağlı olarak kilitlenmeye veya işlenmeyen özel durum raporuna ikili ve metin ekleri ekleyebilirsiniz. SDK, bunları App Center portalında görebilmeniz için raporla birlikte gönderir. Aşağıdaki geri arama, depolanan raporu göndermeden hemen önce çağrılacaktır. Kilitlenmeler için bir sonraki uygulama başlatmada gerçekleşir. İşlenmeyen özel durumlar için ekleri göndermeyi kabul etmeniz gerekir. Minidump dosyaları için ayrılmış bir ad olduğundan ek dosyasının adlandırılmadığındanminidump.dmp emin olun. Aşağıda rapora metin ve resim ekleme örneği verilmiştir:

Crashes.GetErrorAttachments = (ErrorReport report) =>
{
    // Your code goes here.
    return new ErrorAttachmentLog[]
    {
        ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
        ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
    };
};

Kilitlenmeler, özelliğine sahip raporlarda işlenmeyen IsCrash özel durumlardan ayırt edilir. Özelliği kilitlenmeler için true, aksi takdirde false olur.

Not

Boyut sınırı şu anda 7 MB olan ekler içindir. Daha büyük bir ek göndermeye çalışmak bir hatayı tetikler.

Not

GetErrorAttachments ana iş parçacığında çağrılır ve çalışmayı çerçeveler arasında bölmez. Oyun döngüsünün engellenmesini önlemek için bu geri çağırmada uzun süre çalışan görevler gerçekleştirmeyin.

Çalışma zamanında App Center Kilitlenmelerini etkinleştirme veya devre dışı bırakma

Çalışma zamanında App Center Kilitlenmelerini etkinleştirebilir ve devre dışı bırakabilirsiniz. Devre dışı bırakırsanız SDK, uygulama için kilitlenme bildirimi gerçekleştirmez.

Crashes.SetEnabledAsync(false);

App Center Kilitlenmelerini yeniden etkinleştirmek için aynı API'yi kullanın ancak parametre olarak geçirin true .

Crashes.SetEnabledAsync(true);

Diğer API çağrılarını (örneğin IsEnabledAsync) tutarlı hale getirmek için bu çağrıyı beklemeniz gerekmez.

Durum, uygulama başlatmaları arasında cihazın depolama alanında kalıcı hale geldi.

App Center Kilitlenmelerinin etkinleştirilip etkinleştirilmediğini denetleyin

App Center Kilitlenmelerinin etkinleştirilip etkinleştirilmediğini de de de kontrol edebilirsiniz:

bool isEnabled = await Crashes.IsEnabledAsync();

Unity'de İşlenen Özel Durumlar

App Center ayrıca Unity'de işlenen özel durumları kullanarak hataları izlemenize de olanak tanır. Bunu yapmak için yöntemini kullanın TrackError :

try {
    // your code goes here.
} catch (Exception exception) {
    Crashes.TrackError(exception);
}

Hatanız hakkında daha fazla bağlam için, bu hataya özellikler de ekleyebilirsiniz. Özellikleri dizelerin sözlüğü olarak geçirin. Bu adım isteğe bağlıdır.

try {
    // your code goes here.
} catch (Exception exception) {
    var properties = new Dictionary<string, string>
    {
        { "Category", "Music" },
        { "Wifi", "On" }
    };
    Crashes.TrackError(exception, properties);
}

İsterseniz işlenen hata raporuna ikili ve metin ekleri de ekleyebilirsiniz. Aşağıdaki örnekte gösterildiği gibi ekleri bir nesne dizisi ErrorAttachmentLog olarak geçirin.

try {
    // your code goes here.
} catch (Exception exception) {
    var attachments = new ErrorAttachmentLog[]
    {
        ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
        ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
    };
    Crashes.TrackError(exception, attachments: attachments);
}

Unity'de İşlenmeyen Özel Durumlar

İşlenmeyen özel durumları bildirme

Varsayılan olarak, App Center SDK'sı uygulamanızda önemli bir kilitlenmeye neden olmayan işlenmeyen özel durumları bildirmez. Bu işlevi etkinleştirmek için aşağıdaki yöntemi çağırın:

Crashes.ReportUnhandledExceptions(true);

Bu API'yi çağırdıktan sonra, App Center daha önce bahsedilen işlenen özel durumlara benzer şekilde, işlenmeyen tüm özel durumları App Center portalında Sorunlar olarak günlüğe kaydeder. Bu işlevi devre dışı bırakmak için parametresiyle aynı API'yi false geçirin.

Crashes.ReportUnhandledExceptions(false);

Not

App Center SDK'sı tarafından algılanan bazı işlenmeyen özel durumlar App Center kullanıcı arabiriminde hata olarak görünür. Bunun nedeni Unity'nin varsayılan olarak işlenmeyen özel durumları yakalaması, uygulamanın çıkmaması ve kilitlenme olarak kabul edilmemesidir.

İşlenmeyen özel durum raporuna ek ekleme

App Center SDK'sı varsayılan olarak işlenmeyen özel durumlarda ekleri etkinleştirmez. Bu işlevi etkinleştirmek için yönteminin enableAttachmentsCallback boole parametresini ReportUnhandledExceptions olarak trueayarlayın:

Crashes.ReportUnhandledExceptions(true, true);

Ardından , GetErrorAttachments geri çağırmasını uygulayarak isteğe bağlı olarak işlenmeyen bir özel durum raporuna ek ekleyebilirsiniz.

NDK kilitlenmelerini bildirme

Kilitlenmeleri raporlama

App Center'da düzgün kilitlenme raporları almak için, önce yukarıda listelenen yönergeleri izleyerek App Center Crashes SDK'sının ayarlandığından emin olun.

Kesme çubuğu kitaplığını oluşturma

Ardından, Resmi Android BENIOKU için Google Breakpad'de listelenen yönergeleri izleyerek Google Breakpad'i dahil etmeli ve derlemelisiniz. Unity'de kullanmak için ikili dosyasını uygulamanızla birlikte ekleyin.

Not

App Center SDK'sı, Google Breakpad'i varsayılan olarak paketlemez.

Özel durum işleyicisini ekleme

Google Breakpad'i ekledikten sonra NDK Kilitlenme İşleyicisi'ni ekleyin:

/* Attach NDK Crash Handler. */
var minidumpDir = Crashes.GetMinidumpDirectoryAsync();
setupNativeCrashesListener(minidumpDir.Result);

...

[DllImport("YourLib")]
private static extern void setupNativeCrashesListener(string path);

yöntemi setupNativeCrashesListener , C/C++'da uygulamanız gereken yerel bir yöntemdir:

#include <android/log.h>
#include "google-breakpad/src/client/linux/handler/exception_handler.h"
#include "google-breakpad/src/client/linux/handler/minidump_descriptor.h"

static google_breakpad::ExceptionHandler exception_handler(google_breakpad::MinidumpDescriptor(), NULL, dumpCallback, NULL, true, -1);

/**
 * Registers breakpad as the exception handler for NDK code.
 * @param path minidump directory path returned from Crashes.GetMinidumpDirectoryAsync()
 */
extern "C" void setupNativeCrashesListener(const char *path) {
    google_breakpad::MinidumpDescriptor descriptor(path);
    exception_handler.set_minidump_descriptor(descriptor);
}

dumpCallback Sorun giderme için nerede kullanılır:

/*
 * Triggered automatically after an attempt to write a minidump file to the breakpad folder.
 */
static bool dumpCallback(const google_breakpad::MinidumpDescriptor &descriptor,
                         void *context,
                         bool succeeded) {

    /* Allow system to log the native stack trace. */
    __android_log_print(ANDROID_LOG_INFO, "YourLogTag",
                        "Wrote breakpad minidump at %s succeeded=%d\n", descriptor.path(),
                        succeeded);
    return false;
}

Bu yöntemler düzgün bir şekilde ayarlandıktan sonra uygulama, minidump'ı yeniden başlatıldıktan sonra otomatik olarak App Center'a gönderir. Sorun gidermek için ayrıntılı günlükleri kullanarak uygulama yeniden başlatıldıktan sonra minidumların gönderilip gönderilmediğini de kontrol edebilirsiniz.

Not

App Center minidump ekleri için ayrılmış adı minidump.dmp kullanır. Düzgün şekilde işleyebilmemiz için, minidump dosyası olmadığı sürece ekinize farklı bir ad verdiğinizden emin olun.

Uyarı

Breakpad'de x86 öykünücülerinde kilitlenmeleri yakalamayı imkansız hale getiren bilinen bir hata vardır.

Simgeselleştirme

Kilitlenmelerin işlenmesiyle ilgili daha fazla bilgi için Tanılama belgelerine bakın.