- [`10f9e66e`](https://github.com/tauri-apps/plugins-workspace/commit/10f9e66e32141dd35f4bf884fbf9102691187e92) ([#2633](https://github.com/tauri-apps/plugins-workspace/pull/2633) by [@pjf-dev](https://github.com/tauri-apps/plugins-workspace/../../pjf-dev)) Fix biometric plugin ignoring fallback logic when biometry status is unavailable or not enrolled on iOS.
## \[2.2.0]
- [`3a79266b`](https://github.com/tauri-apps/plugins-workspace/commit/3a79266b8cf96a55b1ae6339d725567d45a44b1d) ([#2173](https://github.com/tauri-apps/plugins-workspace/pull/2173) by [@FabianLars](https://github.com/tauri-apps/plugins-workspace/../../FabianLars)) Bumped all plugins to `v2.2.0`. From now, the versions for the Rust and JavaScript packages of each plugin will be in sync with each other.
/// - **Windows / Linux**: This function reads the command line arguments and checks if there's only one value, which must be an URL with scheme matching one of the configured values.
/// Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
/// Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect.
/// Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
/// Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect.
/// - **Windows / Linux**: This function reads the command line arguments and checks if there's only one value, which must be an URL with scheme matching one of the configured values.
/// Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
/// Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect.
/// Note that you must manually check the arguments when registering deep link schemes dynamically with [`Self::register`].
/// Additionally, the deep link might have been provided as a CLI argument so you should check if its format matches what you expect.
if("__TAURI__"inwindow){var__TAURI_PLUGIN_HTTP__=function(e){"use strict";functiont(e,t,r,n){if("function"==typeoft||!t.has(e))thrownewTypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?n:"a"===r?n.call(e):n?n.value:t.get(e)}functionr(e,t,r,n,s){if("function"==typeoft||!t.has(e))thrownewTypeError("Cannot write private member to an object whose class did not declare it");returnt.set(e,r),r}varn,s,i,a;"function"==typeofSuppressedError&&SuppressedError;consto="__TAURI_TO_IPC_KEY__";classc{constructor(e){n.set(this,void0),s.set(this,0),i.set(this,[]),a.set(this,void0),r(this,n,e||(()=>{})),this.id=function(e,t=!1){returnwindow.__TAURI_INTERNALS__.transformCallback(e,t)}((e=>{consto=e.index;if("end"ine)returnvoid(o==t(this,s,"f")?this.cleanupCallback():r(this,a,o));constc=e.message;if(o==t(this,s,"f")){for(t(this,n,"f").call(this,c),r(this,s,t(this,s,"f")+1);t(this,s,"f")int(this,i,"f");){conste=t(this,i,"f")[t(this,s,"f")];t(this,n,"f").call(this,e),deletet(this,i,"f")[t(this,s,"f")],r(this,s,t(this,s,"f")+1)}t(this,s,"f")===t(this,a,"f")&&this.cleanupCallback()}elset(this,i,"f")[o]=c}))}cleanupCallback(){Reflect.deleteProperty(window,`_${this.id}`)}setonmessage(e){r(this,n,e)}getonmessage(){returnt(this,n,"f")}[(n=newWeakMap,s=newWeakMap,i=newWeakMap,a=newWeakMap,o)](){return`__CHANNEL__:${this.id}`}toJSON(){returnthis[o]()}}asyncfunctiond(e,t={},r){returnwindow.__TAURI_INTERNALS__.invoke(e,t,r)}consth="Request cancelled";returne.fetch=asyncfunction(e,t){constr=t?.signal;if(r?.aborted)thrownewError(h);constn=t?.maxRedirections,s=t?.connectTimeout,i=t?.proxy,a=t?.danger;t&&(deletet.maxRedirections,deletet.connectTimeout,deletet.proxy,deletet.danger);consto=t?.headers?t.headersinstanceofHeaders?t.headers:newHeaders(t.headers):newHeaders,f=newRequest(e,t),l=awaitf.arrayBuffer(),u=0!==l.byteLength?Array.from(newUint8Array(l)):null;for(const[e,t]off.headers)o.get(e)||o.set(e,t);const_=(oinstanceofHeaders?Array.from(o.entries()):Array.isArray(o)?o:Object.entries(o)).map((([e,t])=>[e,"string"==typeoft?t:t.toString()]));if(r?.aborted)thrownewError(h);constw=awaitd("plugin:http|fetch",{clientConfig:{method:f.method,url:f.url,headers:_,data:u,maxRedirections:n,connectTimeout:s,proxy:i,danger:a}}),p=()=>d("plugin:http|fetch_cancel",{rid:w});if(r?.aborted)throwp(),newError(h);r?.addEventListener("abort",(()=>{p()}));const{status:y,statusText:m,url:b,headers:g,rid:T}=awaitd("plugin:http|fetch_send",{rid:w}),R=newReadableStream({start:e=>{constt=newc;t.onmessage=t=>{if(r?.aborted)returnvoide.error(h);constn=newUint8Array(t),s=n[n.byteLength-1],i=n.slice(0,n.byteLength-1);1!=s?e.enqueue(i):e.close()},d("plugin:http|fetch_read_body",{rid:T,streamChannel:t}).catch((t=>{e.error(t)}))}}),A=newResponse(R,{status:y,statusText:m});returnObject.defineProperty(A,"url",{value:b}),Object.defineProperty(A,"headers",{value:newHeaders(g)}),A},e}({});Object.defineProperty(window.__TAURI__,"http",{value:__TAURI_PLUGIN_HTTP__})}
if("__TAURI__"inwindow){var__TAURI_PLUGIN_HTTP__=function(e){"use strict";functiont(e,t,r,n){if("function"==typeoft||!t.has(e))thrownewTypeError("Cannot read private member from an object whose class did not declare it");return"m"===r?n:"a"===r?n.call(e):n?n.value:t.get(e)}functionr(e,t,r,n,s){if("function"==typeoft||!t.has(e))thrownewTypeError("Cannot write private member to an object whose class did not declare it");returnt.set(e,r),r}varn,s,i,a;"function"==typeofSuppressedError&&SuppressedError;consto="__TAURI_TO_IPC_KEY__";classc{constructor(e){n.set(this,void0),s.set(this,0),i.set(this,[]),a.set(this,void0),r(this,n,e||(()=>{})),this.id=function(e,t=!1){returnwindow.__TAURI_INTERNALS__.transformCallback(e,t)}((e=>{consto=e.index;if("end"ine)returnvoid(o==t(this,s,"f")?this.cleanupCallback():r(this,a,o));constc=e.message;if(o==t(this,s,"f")){for(t(this,n,"f").call(this,c),r(this,s,t(this,s,"f")+1);t(this,s,"f")int(this,i,"f");){conste=t(this,i,"f")[t(this,s,"f")];t(this,n,"f").call(this,e),deletet(this,i,"f")[t(this,s,"f")],r(this,s,t(this,s,"f")+1)}t(this,s,"f")===t(this,a,"f")&&this.cleanupCallback()}elset(this,i,"f")[o]=c}))}cleanupCallback(){Reflect.deleteProperty(window,`_${this.id}`)}setonmessage(e){r(this,n,e)}getonmessage(){returnt(this,n,"f")}[(n=newWeakMap,s=newWeakMap,i=newWeakMap,a=newWeakMap,o)](){return`__CHANNEL__:${this.id}`}toJSON(){returnthis[o]()}}asyncfunctiond(e,t={},r){returnwindow.__TAURI_INTERNALS__.invoke(e,t,r)}consth="Request cancelled";returne.fetch=asyncfunction(e,t){constr=t?.signal;if(r?.aborted)thrownewError(h);constn=t?.maxRedirections,s=t?.connectTimeout,i=t?.proxy,a=t?.danger;t&&(deletet.maxRedirections,deletet.connectTimeout,deletet.proxy,deletet.danger);consto=t?.headers?t.headersinstanceofHeaders?t.headers:newHeaders(t.headers):newHeaders,f=newRequest(e,t),l=awaitf.arrayBuffer(),u=0!==l.byteLength?Array.from(newUint8Array(l)):null;for(const[e,t]off.headers)o.get(e)||o.set(e,t);const_=(oinstanceofHeaders?Array.from(o.entries()):Array.isArray(o)?o:Object.entries(o)).map((([e,t])=>[e,"string"==typeoft?t:t.toString()]));if(r?.aborted)thrownewError(h);constw=awaitd("plugin:http|fetch",{clientConfig:{method:f.method,url:f.url,headers:_,data:u,maxRedirections:n,connectTimeout:s,proxy:i,danger:a}}),p=()=>d("plugin:http|fetch_cancel",{rid:w});if(r?.aborted)throwp(),newError(h);r?.addEventListener("abort",(()=>{p()}));const{status:y,statusText:m,url:b,headers:g,rid:T}=awaitd("plugin:http|fetch_send",{rid:w}),R=[204,205,304].includes(y)?null:newReadableStream({start:e=>{constt=newc;t.onmessage=t=>{if(r?.aborted)returnvoide.error(h);constn=newUint8Array(t),s=n[n.byteLength-1],i=n.slice(0,n.byteLength-1);1!=s?e.enqueue(i):e.close()},d("plugin:http|fetch_read_body",{rid:T,streamChannel:t}).catch((t=>{e.error(t)}))}}),A=newResponse(R,{status:y,statusText:m});returnObject.defineProperty(A,"url",{value:b}),Object.defineProperty(A,"headers",{value:newHeaders(g)}),A},e}({});Object.defineProperty(window.__TAURI__,"http",{value:__TAURI_PLUGIN_HTTP__})}
- [`c9b21f6f`](https://github.com/tauri-apps/plugins-workspace/commit/c9b21f6f4345806eff5f495885f20dea0082b7d7) ([#2625](https://github.com/tauri-apps/plugins-workspace/pull/2625) by [@lucasfernog](https://github.com/tauri-apps/plugins-workspace/../../lucasfernog)) Export the `LogLevel` type.
- [`9629c2f4`](https://github.com/tauri-apps/plugins-workspace/commit/9629c2f4f90a56b5c2d265d1d13d3af40fc0c525) ([#2600](https://github.com/tauri-apps/plugins-workspace/pull/2600) by [@exoego](https://github.com/tauri-apps/plugins-workspace/../../exoego)) Adds a new varient `TargetKind::Dispatch` that allows you to construct arbitrary log targets
- [`686a839c`](https://github.com/tauri-apps/plugins-workspace/commit/686a839c96fae1b0334f2df9dc76ca5cdbe00dbe) ([#2626](https://github.com/tauri-apps/plugins-workspace/pull/2626) by [@lucasfernog](https://github.com/tauri-apps/plugins-workspace/../../lucasfernog)) Fix iOS app stuck when using the iOS Simulator and the log plugin due to a deadlock when calling os_log too early.
### feat
- [`60fc35d3`](https://github.com/tauri-apps/plugins-workspace/commit/60fc35d35cccaf1654eceb4446ecf0f89dc15502) ([#2576](https://github.com/tauri-apps/plugins-workspace/pull/2576) by [@3lpsy](https://github.com/tauri-apps/plugins-workspace/../../3lpsy)) Add a `tracing` feature to the `log` plugin that emits log messages to the `tracing` system.
## \[2.3.1]
- [`1bb1ced5`](https://github.com/tauri-apps/plugins-workspace/commit/1bb1ced53820127204aa7adf57510c1cbce55e12) ([#2524](https://github.com/tauri-apps/plugins-workspace/pull/2524) by [@elwerene](https://github.com/tauri-apps/plugins-workspace/../../elwerene)) enable TargetKind::LogDir on mobile
- [`c5b0f51c`](https://github.com/tauri-apps/plugins-workspace/commit/c5b0f51cfd911cca9317b59efc718b570980129b) ([#2621](https://github.com/tauri-apps/plugins-workspace/pull/2621) by [@Legend-Master](https://github.com/tauri-apps/plugins-workspace/../../Legend-Master)) Fix `check` and `download` overrides the `accept` header