Flutter杂学: iOS 上启用自动填充和关联域

下面是详细的配置和代码,以确保在 iOS 上启用自动填充和关联域(Associated Domains)功能。

配置步骤

1. 在 Apple Developer 控制台中启用 Associated Domains

  • 登录 Apple Developer。
  • 导航至您的 App ID 设置页面。
  • 找到您要配置的 App ID,并点击编辑(Edit)。
  • 在 Capabilities 部分启用 "Associated Domains"。添加您的域名,例如 applinks:example.com 和 webcredentials:example.com。

2. 更新 Xcode 项目8

  • 打开您的 Flutter 项目的 Runner.xcworkspace 文件:open ios/Runner.xcworkspace
  • 选择项目导航器中的 Runner 项目。
  • 在目标 (Targets) 部分选择 Runner。
  • 打开 "Signing & Capabilities" 选项卡。
  • 点击左上角的 + Capability 按钮,选择 "Associated Domains"。
  • 在 Associated Domains 部分添加您的域名,如 applinks:example.com 和 webcredentials:example.com。

3. 配置服务器上的 apple-app-site-association 文件

在您的服务器上创建 .well-known 目录。

在该目录下创建一个 apple-app-site-association 文件,内容如下:

复制代码
json
{
    "applinks": {
        "apps": []
    },
    "webcredentials": {
        "apps": ["ABCDE12345.com.example.app"]
    }
}

将 ABCDE12345.com.example.app 替换为您的实际应用程序 ID。

4. 更新 Info.plist 文件

编辑 ios/Runner/Info.plist 文件,添加以下键值:

复制代码
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
<key>NSUserTrackingUsageDescription</key>
<string>We need your permission to track usage data.</string>
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>com.example.app</string> <!-- 替换为您的实际 URL Scheme -->
        </array>
    </dict>
</array>
<key>AssociatedDomains</key>
<array>
    <string>applinks:example.com</string> <!-- 替换为您的实际域名 -->
    <string>webcredentials:example.com</string> <!-- 替换为您的实际域名 -->
</array>

完整的 Flutter 示例代码

复制代码
import 'package:flutter/material.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';

class LoginPage extends StatefulWidget {
  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  final TextEditingController usernameController = TextEditingController();
  final TextEditingController passwordController = TextEditingController();
  final FlutterSecureStorage storage = FlutterSecureStorage();

  @override
  void initState() {
    super.initState();
    _loadCredentials();
  }

  Future<void> _loadCredentials() async {
    String? username = await storage.read(key: "username");
    String? password = await storage.read(key: "password");

    if (username != null && password != null) {
      setState(() {
        usernameController.text = username;
        passwordController.text = password;
      });
    }
  }

  Future<void> _saveCredentials(String username, String password) async {
    await storage.write(key: "username", value: username);
    await storage.write(key: "password", value: password);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: AutofillGroup(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Padding(
                padding: const EdgeInsets.all(16.0),
                child: TextField(
                  controller: usernameController,
                  decoration: InputDecoration(labelText: 'Username'),
                  autofillHints: [AutofillHints.username],
                ),
              ),
              Padding(
                padding: const EdgeInsets.all(16.0),
                child: TextField(
                  controller: passwordController,
                  decoration: InputDecoration(labelText: 'Password'),
                  obscureText: true,
                  autofillHints: [AutofillHints.password],
                ),
              ),
              ElevatedButton(
                onPressed: () async {
                  String username = usernameController.text;
                  String password = passwordController.text;
                  await _saveCredentials(username, password);
                  // Handle login logic here
                },
                child: Text('Login'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(home: LoginPage()));
}
  • 发布新版本
  • 构建新的应用版本:
  • flutter build ios打开 Xcode 并归档应用:打开 ios/Runner.xcworkspace。
  • 选择 Product -> Archive。
  • 将应用提交到 App Store Connect。
  • 发布新版本:
  • 登录 App Store Connect。
  • 提交新版本并等待审核通过。

总结

通过上述步骤和代码配置,您可以在 iOS 上启用自动填充和关联域功能。请确保所有步骤都正确完成,并在发布前进行充分测试。这样不仅可以提升用户体验,还可以确保应用的稳定性和安全性。如果有任何问题或需要进一步的帮助,请随时询问。

相关推荐
茶底世界之下7 小时前
雨夜街角裁成方图,人物与冷暖光还能共存吗?
ios
youdexiang9 小时前
IOS录音APP拍照记录能和音频同步吗
ios·音视频
恋猫de小郭10 小时前
感人,Flutter 居然有了一个超实用提案,期待落地
android·前端·flutter
2501_9159090610 小时前
Windows 打开 Xcode 工程,编译调试 Xcode 项目并和 Mac 同事协作
ide·windows·vscode·macos·ios·个人开发·xcode
互联网江湖10 小时前
iPhone Duo跌倒,国产折叠屏手机吃饱?
ios·智能手机·iphone
zwd20051 天前
词频是什么?生词滑块 zipf 3.0 到 5.0 怎么调:同一屏从 0 个生词到 11 个
ios·iphone·效率工具·英语学习·词频·屏幕翻译
好的佩奇1 天前
Dart 之增强枚举
android·flutter·dart
茶底世界之下1 天前
灯暖窗冷,色温要不要继续降?用 Awaking 看混合光的取舍
ios
好的佩奇1 天前
蓝牙之无线电与通信距离
android·flutter·蓝牙
2501_916007471 天前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程