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

相关推荐
肥肥呀呀呀18 分钟前
flutter 小知识
flutter
玫瑰花开一片一片5 小时前
Flutter IOS 真机 Widget 错误。Widget 安装后系统中没有
flutter·ios·widget·ios widget
hepherd7 小时前
Flutter 环境搭建 (Android)
android·flutter·visual studio code
烎就是我7 小时前
100行代码swift从零实现一个iOS日历
ios·swift
鸿蒙布道师1 天前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师1 天前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
bst@微胖子1 天前
Flutter之路由和导航
flutter
亚洲小炫风1 天前
flutter 中各种日志
前端·flutter·日志·log
louisgeek1 天前
Flutter 动画之 Implicit 隐式动画
flutter