İş profilleri

Android platformu, cihazların iş profillerine (bazen yönetilen profil olarak da adlandırılır) sahip olmasına izin verir. İş profili BT yöneticisi tarafından kontrol edilir ve bu profilde kullanılabilen işlevler, kullanıcının birincil profilindeki işlevlerden ayrı olarak ayarlanır. Kuruluşlar bu yaklaşım sayesinde, bir yandan kullanıcıların kişisel uygulamalarını ve profillerini kullanırken bir yandan da şirkete özel uygulama ve verilerin bir kullanıcının cihazında çalıştığı ortamı kontrol edebiliyor.

Bu derste, iş profili olan bir cihazda uygulamanızın güvenli bir şekilde çalışması için uygulamanızı nasıl değiştireceğiniz gösterilmektedir. Uygulama geliştirmeyle ilgili sıradan en iyi uygulamalar dışında bir şey yapmanıza gerek yoktur. Ancak bu en iyi uygulamalardan bazıları, özellikle iş profili olan cihazlarda önemli hale gelir. Bu belge, bilmeniz gereken konuları vurgular.

Genel bakış

Kullanıcılar genellikle kişisel cihazlarını kurumsal bir ortamda kullanmak ister. Bu durum, kurumların bir ikilemde kalmasına yol açabilir. Kullanıcı kendi cihazını kullanabiliyorsa kuruluş, gizli bilgilerin (çalışan e-postaları ve kişileri gibi) kuruluş tarafından kontrol edilmeyen bir cihazda bulunduğundan endişe etmek zorundadır.

Android 5.0 (API düzeyi 21), bu durumu düzeltmek için kuruluşların iş profilleri oluşturmasına olanak tanır. Cihazın iş profili varsa profilin ayarları BT yöneticisinin kontrolü altındadır. BT yöneticisi, bu profil için hangi uygulamalara izin verileceğini seçebilir ve profilde yalnızca hangi cihaz özelliklerinin kullanılabileceğini denetleyebilir.

Bir cihazın iş profili varsa uygulamanın çalıştığı profilden bağımsız olarak, bu cihazda çalışan uygulamalar bundan etkilenir:

  • Varsayılan olarak çoğu amaç bir profilden diğerine geçmez. Profilde çalışan bir uygulama bir niyet tetiklerse söz konusu profilde amaç için işleyici yoktur ve profil kısıtlamaları nedeniyle amacın diğer profile geçmesine izin verilmezse istek başarısız olur ve uygulama beklenmedik bir şekilde kapanabilir.
  • Profil BT yöneticisi, iş profilinde hangi sistem uygulamalarının kullanılabileceğini sınırlayabilir. Bu kısıtlama, iş profilinde bazı yaygın amaçlar için işleyici olmamasına da neden olabilir.
  • Kişisel profiller ve iş profilleri ayrı depolama alanlarına sahip olduğundan, bir profilde geçerli olan bir dosya URI'si diğer profilde geçerli olmaz. Bir profilde tetiklenen herhangi bir niyet diğerinde işlenebilir (profil ayarlarına bağlı olarak), bu nedenle amaçlara dosya URI'leri eklemek güvenli değildir.

Başarısız intent'leri önleyin

İş profili olan bir cihazda, amaçların bir profilden diğerine geçip geçemeyeceğiyle ilgili kısıtlamalar vardır. Çoğu durumda, bir amaç tetiklendiğinde tetiklendiği profilde yürütülür. Bu profilde amaç için işleyici yoksa amaç işlenmez ve bunu tetikleyen uygulama, diğer profilde amaç için bir işleyici olsa bile beklenmedik bir şekilde kapanabilir.

Profil yöneticisi, hangi amaçların bir profilden diğerine geçmesine izin verileceğini seçebilir. Bu kararı BT yöneticisi verdiğinden hangi amaçların bu sınırı aşmasına izin verildiğini önceden bilmenin bir yolu yoktur. Bu politikayı BT yöneticisi belirler ve istediği zaman değiştirebilir.

Uygulamanız bir etkinlik başlatmadan önce uygun bir çözüm olduğunu doğrulamanız gerekir. Intent.resolveActivity() numaralı telefonu arayarak kabul edilebilir bir çözüm olduğunu doğrulayabilirsiniz. Amacı çözümlemenin bir yolu yoksa yöntem null değerini döndürür. Yöntem null olmayan bir değer döndürürse amacı çözmenin en az bir yolu vardır ve niyeti tetiklemek güvenli bir yöntemdir. Bu durumda, geçerli profilde bir işleyici olduğu veya amacın diğer profildeki bir işleyiciye geçmesine izin verildiği için niyet çözümlenebilir olabilir. (Amaçları çözümleme hakkında daha fazla bilgi için Genel Amaçlar konusuna bakın.)

Örneğin, uygulamanızın zamanlayıcı ayarlaması gerekiyorsa ACTION_SET_TIMER amacı için geçerli bir işleyici olup olmadığını kontrol etmesi gerekir. Uygulama amacı çözemezse uygun bir işlem yapması (hata mesajı gösterme gibi) gerekir.

Kotlin

fun startTimer(message: String, seconds: Int) {

    // Build the "set timer" intent
    val timerIntent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(packageManager) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent)

    }
}

Java

public void startTimer(String message, int seconds) {

    // Build the "set timer" intent
    Intent timerIntent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(getPackageManager()) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent);

    }
}

Profiller arasında dosya paylaşma

Bazen bir uygulamanın kendi dosyalarına erişmesi için başka uygulamalara erişim sağlaması gerekir. Örneğin, bir resim galerisi uygulaması, resimlerini resim düzenleyicilerle paylaşmak isteyebilir. Bir dosyayı normalde iki şekilde paylaşabilirsiniz: dosya URI'si veya içerik URI'si.

Dosya URI'si, file: önekiyle başlar ve dosyanın cihazın depolama alanındaki mutlak yolu gelir. Bununla birlikte, iş profili ve kişisel profil ayrı depolama alanları kullandığından, bir profilde geçerli olan bir dosya URI'si diğer profilde geçerli olmaz. Bu durum, bir amaca bir dosya URI'si eklerseniz ve amaç diğer profilde işlenirse işleyici dosyaya erişemez.

Bunun yerine, dosyaları içerik URI'leriyle paylaşmanız gerekir. İçerik URI'leri dosyayı daha güvenli ve paylaşılabilir bir şekilde tanımlar. İçerik URI'si, dosya yolunun yanı sıra dosyayı sağlayan yetkiliyi ve dosyayı tanımlayan bir kimlik numarasını içerir. FileProvider kullanarak herhangi bir dosya için içerik kimliği oluşturabilirsiniz. Daha sonra, bu içerik kimliğini diğer uygulamalarla (diğer profilde bile) paylaşabilirsiniz. Alıcı, asıl dosyaya erişmek için Content ID'yi kullanabilir.

Örneğin, belirli bir dosya URI'si için içerik URI'sini şu şekilde alırsınız:

Kotlin

// Open File object from its file URI
val fileToShare = File(fileUriToShare)

val contentUriToShare: Uri = FileProvider.getUriForFile(
        context,
        "com.example.myapp.fileprovider",
        fileToShare
)

Java

// Open File object from its file URI
File fileToShare = new File(fileUriToShare);

Uri contentUriToShare = FileProvider.getUriForFile(getContext(),
        "com.example.myapp.fileprovider", fileToShare);

getUriForFile() yöntemini çağırırken dosya sağlayıcı yetkisini (bu örnekte "com.example.myapp.fileprovider") eklemeniz gerekir. Bu yetki, uygulama manifestinizin <provider> öğesinde belirtilir. İçerik URI'leriyle dosya paylaşma hakkında daha fazla bilgi için Dosya Paylaşma bölümüne bakın.

Bildirimleri dinleyin

Uygulamalar, bildirimlerde yapılan değişikliklerle ilgili sistemden geri çağırmaları almak için genellikle bir NotificationListenerService alt sınıfı sağlar. İş profili olan cihazlar, NotificationListenerService uygulamasının uygulamanızla çalışma şeklini etkileyebilir.

İş profilinde

İş profilinde çalışan bir uygulamadan NotificationListenerService kullanamazsınız. Uygulamanız bir iş profilinde çalışırken sistem, uygulamanızın NotificationListenerService özelliğini yoksayar. Ancak, kişisel profilde çalışan uygulamalar bildirimleri dinleyebilir.

Kişisel profilde

Uygulamanız kişisel profilde çalıştığında, iş profilinde çalışan uygulamalarla ilgili bildirim alamayabilirsiniz. Varsayılan olarak tüm kişisel profil uygulamaları geri çağırmaları alır ancak BT yöneticisi, bildirim değişikliklerini dinlemesine izin verdiği bir veya daha fazla kişisel profil uygulamasını izin verilenler listesine ekleyebilir. Daha sonra sistem, izin verilenler listesinde olmayan uygulamaları engeller. Android 8.0 (API düzeyi 26) veya sonraki sürümlerde, bir iş profilini yöneten cihaz politikası denetleyicisi (DPC), uygulamanızın DevicePolicyManager yöntemini setPermittedCrossProfileNotificationListeners() kullanarak iş profili bildirimlerini dinlemesini engelleyebilir. Uygulamanız, kişisel profilde yayınlanan bildirimlerle ilgili geri aramalar almaya devam etmektedir.

Uygulamanızı iş profilleriyle uyumluluk açısından test edin

Uygulamanızın iş profili olan bir cihazda başarısız olmasına neden olacak sorunları tespit etmek için uygulamanızı iş profili ortamında test etmeniz gerekir. Özellikle, bir iş profili cihazında test etmek, uygulamanızın niyetleri doğru bir şekilde işlediğinden emin olmanın iyi bir yoludur: işlenemeyen niyetleri tetiklememek, profiller arası çalışmayan URI'lar eklemek vb.

Android 5.0 (API düzeyi 21) ve sonraki sürümleri çalıştıran Android cihazlarda iş profili oluşturmak için kullanabileceğiniz örnek bir uygulama olan TestDPC'yi sunduk. Bu uygulama, uygulamanızı iş profili ortamında test etmeniz için basit bir yol sunar. Bu uygulamayı, iş profilini aşağıdaki şekilde yapılandırmak için de kullanabilirsiniz:

  • Yönetilen profilde hangi varsayılan uygulamaların kullanılabileceğini belirtme
  • Bir profilden diğerine geçişine izin verilen niyetleri yapılandırın

Bir uygulamayı iş profili olan bir cihaza USB kablosu üzerinden manuel olarak yüklerseniz, uygulama hem kişisel profile hem de iş profiline yüklenir. Uygulamayı yükledikten sonra aşağıdaki koşullar altında test edebilirsiniz:

  • Bir niyet normalde varsayılan bir uygulama (örneğin, kamera uygulaması) tarafından işleniyorsa söz konusu varsayılan uygulamayı iş profilinde devre dışı bırakmayı deneyin ve uygulamanın bunu gerektiği gibi işlediğini doğrulayın.
  • Başka bir uygulama tarafından işlenmesini bekleyen bir intent'i tetiklerseniz söz konusu niyetin bir profilden diğerine geçiş iznini etkinleştirmeyi ve devre dışı bırakmayı deneyin. Uygulamanın her iki koşulda da düzgün şekilde çalıştığını doğrulayın. Niyetin profiller arasında geçiş yapmasına izin verilmiyorsa hem uygulamanın profilinde uygun bir işleyici olduğunda hem de olmadığında uygulamanın davranışını doğrulayın. Örneğin, uygulamanız haritayla ilgili bir amacı tetiklerse aşağıdaki senaryolardan her birini deneyin:
    • Cihaz, harita amaçlarının bir profilden diğerine geçmesine izin verir ve diğer profilde uygun bir işleyici vardır (uygulamanın çalışmadığı profil)
    • Cihaz, harita amaçlarının profiller arasında geçiş yapmasına izin vermez, ancak uygulamanın profilinde uygun bir işleyici vardır
    • Cihaz, harita amaçlarının profiller arasında geçiş yapmasına izin vermez ve cihazın profilinde harita amaçları için uygun bir işleyici yoktur
  • Bir amaca içerik eklerseniz niyetin hem uygulamanın profilinde işlendiğinde hem de profiller arasında kesiştiğinde düzgün bir şekilde davrandığını doğrulayın.

İş profillerinde test yapma: ipuçları ve püf noktaları

Bir iş profili cihazında test yaparken faydalı bulabileceğiniz birkaç püf noktası vardır.

  • Daha önce de belirtildiği gibi, bir uygulamayı iş profili cihazına başka cihazdan yüklediğinizde, uygulama her iki profile de yüklenir. İsterseniz uygulamayı bir profilden silip diğer profilde bırakabilirsiniz.
  • Android Debug Bridge (adb) kabuğunda bulunan etkinlik yöneticisi komutlarının çoğu, hangi kullanıcı olarak çalıştırılacağını belirtmenizi sağlayan --user işaretini destekler. Bir kullanıcı belirterek, yönetilmeyen birincil kullanıcı olarak mı yoksa iş profili olarak mı çalıştırılacağını seçebilirsiniz. Daha fazla bilgi için ADB Kabuk Komutları bölümünü inceleyin.
  • Bir cihazdaki etkin kullanıcıları bulmak için adb paket yöneticisinin list users komutunu kullanın. Çıkış dizesindeki ilk sayı, --user işaretiyle birlikte kullanabileceğiniz kullanıcı kimliğidir. Daha fazla bilgi için ADB Kabuk Komutları bölümüne bakın.

Örneğin, bir cihazdaki kullanıcıları bulmak için şu komutu çalıştırırsınız:

$ adb shell pm list users
UserInfo{0:Drew:13} running
UserInfo{10:Work profile:30} running

Bu durumda, birincil kullanıcı("Drew") 0 kullanıcı kimliğine, iş profilinin kullanıcı kimliği ise 10'dur. İş profilinde bir uygulama çalıştırmak için şunun gibi bir komut kullanmanız gerekir:

$ adb shell am start --user 10 \
-n "com.example.myapp/com.example.myapp.testactivity" \
-a android.intent.action.MAIN -c android.intent.category.LAUNCHER