1
0
mirror of https://github.com/bitwarden/mobile synced 2026-01-06 10:34:07 +00:00

[PM-1129] iOS 16 Third-Party 2FA OTP handling (#2409)

* [EC-980] Added iOS otpauth handler (#2370)

* EC-980 added Bitwarden as otpauth scheme handler

* EC-980 Fix format

* [EC-981] OTP handling - Set to selected cipher (#2404)

* EC-981 Started adding OTP to existing cipher. Reused AutofillCiphersPage for the cipher selection and refactored it so that we have more code reuse

* EC-981 Fix navigation on otp handling

* EC-981 Fix formatting

* EC-981 Added otp cipher selection callout and add close toolbar item when needed

* PM-1131 implemented cipher creation from otp handling flow with otp key filled (#2407)

* PM-1133 Updated empty states for search and cipher selection on otp flow (#2408)
This commit is contained in:
Federico Maccaroni
2023-03-09 11:16:48 -03:00
committed by GitHub
parent 4d2b53c809
commit a18f74a72a
34 changed files with 1277 additions and 630 deletions

View File

@@ -43,6 +43,8 @@ namespace Bit.iOS
private IStateService _stateService;
private IEventService _eventService;
private LazyResolve<IDeepLinkContext> _deepLinkContext = new LazyResolve<IDeepLinkContext>();
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
Forms.Init();
@@ -239,7 +241,7 @@ namespace Bit.iOS
public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
return Xamarin.Essentials.Platform.OpenUrl(app, url, options);
return _deepLinkContext.Value.OnNewUri(url) || Xamarin.Essentials.Platform.OpenUrl(app, url, options);
}
public override bool ContinueUserActivity(UIApplication application, NSUserActivity userActivity,

View File

@@ -29,6 +29,14 @@
<key>CFBundleURLName</key>
<string>com.8bit.bitwarden.url</string>
</dict>
<dict>
<key>CFBundleURLName</key>
<string>com.8bit.bitwarden</string>
<key>CFBundleURLSchemes</key>
<array>
<string>otpauth</string>
</array>
</dict>
</array>
<key>CFBundleLocalizations</key>
<array>

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,25 @@
{
"images" : [
{
"filename" : "Empty-items-state.pdf",
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "Empty-items-state-dark.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

View File

@@ -1,528 +1,608 @@
{
"images": [
"images" : [
{
"filename": "ic_warning-1.pdf",
"idiom": "universal"
"filename" : "ic_warning-1.pdf",
"idiom" : "universal"
},
{
"scale": "1x",
"idiom": "universal"
},
{
"scale": "2x",
"idiom": "universal"
},
{
"scale": "3x",
"idiom": "universal"
},
{
"idiom": "iphone"
},
{
"scale": "1x",
"idiom": "iphone"
},
{
"scale": "2x",
"idiom": "iphone"
},
{
"subtype": "retina4",
"scale": "2x",
"idiom": "iphone"
},
{
"scale": "3x",
"idiom": "iphone"
},
{
"idiom": "ipad"
},
{
"scale": "1x",
"idiom": "ipad"
},
{
"scale": "2x",
"idiom": "ipad"
},
{
"idiom": "watch"
},
{
"scale": "2x",
"idiom": "watch"
},
{
"screenWidth": "{130,145}",
"scale": "2x",
"idiom": "watch"
},
{
"screenWidth": "{146,165}",
"scale": "2x",
"idiom": "watch"
},
{
"idiom": "mac"
},
{
"scale": "1x",
"idiom": "mac"
},
{
"scale": "2x",
"idiom": "mac"
},
{
"idiom": "car"
},
{
"scale": "2x",
"idiom": "car"
},
{
"scale": "3x",
"idiom": "car"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom": "universal"
"idiom" : "universal"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "dark"
}
],
"scale": "1x",
"idiom": "universal"
"idiom" : "universal"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "universal"
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "3x",
"idiom": "universal"
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom": "iphone"
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "1x",
"idiom": "iphone"
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "2x",
"idiom": "iphone"
"idiom" : "universal",
"scale" : "2x"
},
{
"subtype": "retina4",
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "dark"
}
],
"scale": "2x",
"idiom": "iphone"
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "3x",
"idiom": "iphone"
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom": "ipad"
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "dark"
}
],
"scale": "1x",
"idiom": "ipad"
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "ipad"
"idiom" : "iphone"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom": "watch"
"idiom" : "iphone"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "dark"
}
],
"scale": "2x",
"idiom": "watch"
"idiom" : "iphone"
},
{
"screenWidth": "{130,145}",
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "watch"
"idiom" : "iphone",
"scale" : "1x"
},
{
"screenWidth": "{146,165}",
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "2x",
"idiom": "watch"
"idiom" : "iphone",
"scale" : "1x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom": "mac"
"idiom" : "iphone",
"scale" : "1x"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "1x",
"idiom": "mac"
"idiom" : "iphone",
"scale" : "2x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "2x",
"idiom": "mac"
"idiom" : "iphone",
"scale" : "2x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom": "car"
"idiom" : "iphone",
"scale" : "2x"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "dark"
}
],
"scale": "2x",
"idiom": "car"
"idiom" : "iphone",
"scale" : "3x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "dark"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "3x",
"idiom": "car"
"idiom" : "iphone",
"scale" : "3x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom": "universal"
"idiom" : "iphone",
"scale" : "3x"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "1x",
"idiom": "universal"
"idiom" : "iphone",
"scale" : "1x",
"subtype" : "retina4"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "2x",
"idiom": "universal"
"idiom" : "iphone",
"scale" : "1x",
"subtype" : "retina4"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "dark"
}
],
"scale": "3x",
"idiom": "universal"
"idiom" : "iphone",
"scale" : "1x",
"subtype" : "retina4"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"idiom": "iphone"
"idiom" : "iphone",
"scale" : "2x",
"subtype" : "retina4"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "1x",
"idiom": "iphone"
"idiom" : "iphone",
"scale" : "2x",
"subtype" : "retina4"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "dark"
}
],
"scale": "2x",
"idiom": "iphone"
"idiom" : "iphone",
"scale" : "2x",
"subtype" : "retina4"
},
{
"subtype": "retina4",
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "iphone"
"idiom" : "iphone",
"scale" : "3x",
"subtype" : "retina4"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "3x",
"idiom": "iphone"
"idiom" : "iphone",
"scale" : "3x",
"subtype" : "retina4"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom": "ipad"
"idiom" : "iphone",
"scale" : "3x",
"subtype" : "retina4"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "1x",
"idiom": "ipad"
"idiom" : "ipad"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "2x",
"idiom": "ipad"
"idiom" : "ipad"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom": "watch"
"idiom" : "ipad"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"scale": "2x",
"idiom": "watch"
"idiom" : "ipad",
"scale" : "1x"
},
{
"screenWidth": "{130,145}",
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "2x",
"idiom": "watch"
"idiom" : "ipad",
"scale" : "1x"
},
{
"screenWidth": "{146,165}",
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "dark"
}
],
"scale": "2x",
"idiom": "watch"
"idiom" : "ipad",
"scale" : "1x"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"idiom": "mac"
"idiom" : "ipad",
"scale" : "2x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "1x",
"idiom": "mac"
"idiom" : "ipad",
"scale" : "2x"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "dark"
}
],
"scale": "2x",
"idiom": "mac"
"idiom" : "ipad",
"scale" : "2x"
},
{
"appearances": [
{
"appearance": "luminosity",
"value": "light"
}
],
"idiom": "car"
"idiom" : "car"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "light"
}
],
"scale": "2x",
"idiom": "car"
"idiom" : "car"
},
{
"appearances": [
"appearances" : [
{
"appearance": "luminosity",
"value": "light"
"appearance" : "luminosity",
"value" : "dark"
}
],
"scale": "3x",
"idiom": "car"
"idiom" : "car"
},
{
"idiom" : "car",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom" : "car",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "car",
"scale" : "2x"
},
{
"idiom" : "car",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom" : "car",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "car",
"scale" : "3x"
},
{
"idiom" : "mac"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom" : "mac"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "mac"
},
{
"idiom" : "mac",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom" : "mac",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "mac",
"scale" : "1x"
},
{
"idiom" : "mac",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom" : "mac",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "mac",
"scale" : "2x"
},
{
"idiom" : "watch"
},
{
"idiom" : "watch",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"screen-width" : ">183"
},
{
"idiom" : "watch",
"scale" : "2x"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom" : "watch"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "watch"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom" : "watch",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "watch",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
}
],
"info": {
"version": 1,
"author": "xcode"
"info" : {
"author" : "xcode",
"version" : 1
}
}
}

View File

@@ -179,6 +179,10 @@
<BundleResource Include="Resources\generate.png" />
<BundleResource Include="Resources\generate%402x.png" />
<BundleResource Include="Resources\generate%403x.png" />
<ImageAsset Include="Resources\Assets.xcassets\Contents.json" />
<ImageAsset Include="Resources\Assets.xcassets\empty_items_state.imageset\Empty-items-state-dark.pdf" />
<ImageAsset Include="Resources\Assets.xcassets\empty_items_state.imageset\Empty-items-state.pdf" />
<ImageAsset Include="Resources\Assets.xcassets\empty_items_state.imageset\Contents.json" />
</ItemGroup>
<ItemGroup>
<InterfaceDefinition Include="LaunchScreen.storyboard" />