pub struct LAEnvironmentMechanismBiometry { /* private fields */ }Expand description
Biometric LAEnvironment mechanism details.
Implementations§
Source§impl LAEnvironmentMechanismBiometry
impl LAEnvironmentMechanismBiometry
Sourcepub fn is_usable(&self) -> Result<bool>
pub fn is_usable(&self) -> Result<bool>
Whether the mechanism is currently usable for authentication.
§Errors
Returns an error if the Swift bridge rejects the request.
Examples found in repository?
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}Sourcepub fn localized_name(&self) -> Result<String>
pub fn localized_name(&self) -> Result<String>
Localized display name such as Touch ID or Face ID.
§Errors
Returns an error if the Swift bridge rejects the request.
Sourcepub fn icon_system_name(&self) -> Result<String>
pub fn icon_system_name(&self) -> Result<String>
SF Symbol name representing this mechanism.
§Errors
Returns an error if the Swift bridge rejects the request.
Examples found in repository?
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}Sourcepub fn biometry_type(&self) -> Result<BiometryType>
pub fn biometry_type(&self) -> Result<BiometryType>
Hardware biometry type supported by the device.
§Errors
Returns an error if the Swift bridge rejects the request.
Examples found in repository?
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}Sourcepub fn is_enrolled(&self) -> Result<bool>
pub fn is_enrolled(&self) -> Result<bool>
Whether the user has enrolled this biometric mechanism.
§Errors
Returns an error if the Swift bridge rejects the request.
Examples found in repository?
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}Sourcepub fn is_locked_out(&self) -> Result<bool>
pub fn is_locked_out(&self) -> Result<bool>
Whether the biometric mechanism is locked out.
§Errors
Returns an error if the Swift bridge rejects the request.
Sourcepub fn state_hash(&self) -> Result<Vec<u8>>
pub fn state_hash(&self) -> Result<Vec<u8>>
Application-specific biometric enrollment hash.
§Errors
Returns an error if the Swift bridge rejects the request.
Sourcepub fn built_in_sensor_inaccessible(&self) -> Result<bool>
pub fn built_in_sensor_inaccessible(&self) -> Result<bool>
Whether the built-in biometric sensor is inaccessible.
§Errors
Returns an error if the Swift bridge rejects the request.