You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何追踪未注册用户是否为首次访问App?

当然可以追踪未注册用户的首次访问啦!作为App开发新手,你完全可以借助本地存储来实现这个需求——不用依赖后端服务器,操作简单还容易上手。下面给你拆解几种常用方案,附带可直接复用的代码示例:

核心思路:用本地存储标记访问状态

未注册用户没有绑定账号,没法把访问状态存在后端,所以我们可以把标记存在用户设备的本地存储里。常见的本地存储方案有:

  • iOS:UserDefaults
  • Android:SharedPreferences
  • 跨平台框架(Flutter/React Native):对应封装的本地存储插件

只要用户没卸载App或清除App数据,这个标记就会一直存在,下次启动时就能判断是不是首次访问。

具体实现方案

1. iOS(Swift)

import UIKit

// 封装一个工具类专门处理首次访问逻辑
class FirstVisitTracker {
    static let hasVisitedKey = "hasVisitedApp"
    
    // 判断是否是首次访问
    static func isFirstVisit() -> Bool {
        return !UserDefaults.standard.bool(forKey: hasVisitedKey)
    }
    
    // 标记为已访问
    static func markAsVisited() {
        UserDefaults.standard.set(true, forKey: hasVisitedKey)
    }
}

// 使用示例:在App启动的根页面调用
class MainViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if FirstVisitTracker.isFirstVisit() {
            // 展示自定义欢迎弹窗
            showWelcomeModal()
            // 一定要在展示完后标记,避免重复弹窗
            FirstVisitTracker.markAsVisited()
        }
    }
    
    private func showWelcomeModal() {
        let alert = UIAlertController(
            title: "欢迎光临!",
            message: "快来探索我们的App,找到心仪的店铺吧~",
            preferredStyle: .alert
        )
        alert.addAction(UIAlertAction(title: "马上开始", style: .default))
        present(alert, animated: true)
    }
}

2. Android(Kotlin)

import android.content.Context
import android.content.SharedPreferences
import androidx.appcompat.app.AlertDialog

// 封装工具类
class FirstVisitTracker(context: Context) {
    private val sharedPrefs = context.getSharedPreferences("AppSettings", Context.MODE_PRIVATE)
    private val hasVisitedKey = "hasVisitedApp"

    fun isFirstVisit(): Boolean {
        return !sharedPrefs.getBoolean(hasVisitedKey, false)
    }

    fun markAsVisited() {
        sharedPrefs.edit().putBoolean(hasVisitedKey, true).apply()
    }
}

// 使用示例:在MainActivity中调用
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val tracker = FirstVisitTracker(this)
        if (tracker.isFirstVisit()) {
            showWelcomeDialog()
            tracker.markAsVisited()
        }
    }

    private fun showWelcomeDialog() {
        AlertDialog.Builder(this)
            .setTitle("欢迎光临!")
            .setMessage("快来探索我们的App,找到心仪的店铺吧~")
            .setPositiveButton("马上开始") { dialog, _ -> dialog.dismiss() }
            .show()
    }
}

3. Flutter(跨平台)

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

// 封装工具类
class FirstVisitTracker {
  static const String hasVisitedKey = 'hasVisitedApp';

  static Future<bool> isFirstVisit() async {
    final prefs = await SharedPreferences.getInstance();
    // 如果没有找到标记,默认是首次访问
    return !prefs.getBool(hasVisitedKey) ?? true;
  }

  static Future<void> markAsVisited() async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setBool(hasVisitedKey, true);
  }
}

// 使用示例:在首页初始化时调用
class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  @override
  void initState() {
    super.initState();
    _checkFirstVisit();
  }

  Future<void> _checkFirstVisit() async {
    if (await FirstVisitTracker.isFirstVisit()) {
      // 展示欢迎弹窗
      showDialog(
        context: context,
        builder: (context) => AlertDialog(
          title: const Text("欢迎光临!"),
          content: const Text("快来探索我们的App,找到心仪的店铺吧~"),
          actions: [
            TextButton(
              onPressed: () => Navigator.pop(context),
              child: const Text("马上开始"),
            ),
          ],
        ),
      );
      await FirstVisitTracker.markAsVisited();
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("首页")),
      body: const Center(child: Text("App内容区域")),
    );
  }
}
注意事项
  • 本地存储的标记会在用户卸载App、清除App数据时被重置,这属于正常行为,一般场景下完全够用。
  • 如果需要跨设备/卸载重装后仍能识别,可以考虑结合设备标识符(比如iOS的IDFA、Android的广告ID),但要注意隐私合规(比如iOS需要用户授权),而且这类标识符可能被用户重置,没必要为普通欢迎场景搞这么复杂。
  • 一定要在展示完欢迎UI后再标记为已访问,避免用户还没看到弹窗就被标记,导致下次启动不展示。

内容的提问来源于stack exchange,提问作者Tree55Topz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:33:26