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

iOS端如何实现定时向WhatsApp群组发送消息或图片?

iOS实现WhatsApp定时发送消息/图片方案

一、核心限制说明

iOS系统对后台任务有严格管控,无法保证App在完全后台/锁屏状态下100%触发定时任务,尤其是凌晨12点这类非活跃时段。如果要确保精准触发,优先推荐结合服务器推送唤醒(需后端配合),或用系统通知触发用户交互后发送;若要自动发送,仅能依赖App处于前台或后台活跃状态。

二、步骤1:实现定时触发逻辑

方式1:本地通知+用户交互触发(最稳定,符合iOS规范)

用UNUserNotificationCenter设置定时通知,用户点击后自动执行WhatsApp发送逻辑:

import UserNotifications

// 请求通知权限
func requestNotificationPermission() {
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { granted, _ in
        if granted {
            DispatchQueue.main.async {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
    }
}

// 预约定时通知,附带群组ID和消息内容
func scheduleBirthdayNotification(at sendDate: Date, groupJID: String, message: String) {
    let content = UNMutableNotificationContent()
    content.title = "生日问候待发送"
    content.body = "点击即可发送到目标群组"
    content.sound = UNNotificationSound.default
    
    // 解析发送时间的日期组件
    let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: sendDate)
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)
    
    // 携带参数,供点击后调用发送逻辑
    let userInfo = ["groupJID": groupJID, "message": message]
    let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
    
    UNUserNotificationCenter.current().add(request) { error in
        if let error = error {
            print("通知创建失败:\(error.localizedDescription)")
        }
    }
}

// 处理通知点击事件
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo
    guard let groupJID = userInfo["groupJID"] as? String, let message = userInfo["message"] as? String else {
        completionHandler()
        return
    }
    // 执行WhatsApp发送
    sendToWhatsAppGroup(groupJID: groupJID, message: message)
    completionHandler()
}

方式2:后台任务触发(不稳定,仅适合短期定时)

若需自动触发(无需用户点击),可使用BGTaskScheduler注册后台任务,但iOS仅会在App后台活跃时(如近期使用过、开启后台刷新权限)大概率触发,时间精度有限:

import BackgroundTasks

// 注册后台任务
func registerBackgroundTask() {
    BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.yourapp.whatsapp.send", using: nil) { task in
        self.handleBackgroundSend(task: task as! BGAppRefreshTask)
    }
}

// 处理后台发送任务
func handleBackgroundSend(task: BGAppRefreshTask) {
    // 执行WhatsApp发送逻辑
    sendToWhatsAppGroup(groupJID: "目标群组JID", message: "生日快乐!")
    
    // 标记任务完成
    task.setTaskCompleted(success: true)
    
    // 如需重复发送,可重新调度下一次任务
    scheduleNextBackgroundTask(at: nextSendDate)
}

// 调度后台任务到指定时间
func scheduleNextBackgroundTask(at sendDate: Date) {
    let request = BGAppRefreshTaskRequest(identifier: "com.yourapp.whatsapp.send")
    request.earliestBeginDate = sendDate
    
    do {
        try BGTaskScheduler.shared.submit(request)
    } catch {
        print("后台任务调度失败:\(error.localizedDescription)")
    }
}

三、步骤2:精准发送到指定WhatsApp群组

要发送到群组,必须获取群组的JID(格式为1234567890-123456789@g.us,其中前半段是群组ID,@g.us为群组标识)。获取方式:

  • 打开WhatsApp目标群组→点击群组名称→导出聊天记录(选"无媒体"),导出的TXT文件开头会显示群组JID。

修改发送函数,支持发送消息/图片:

func sendToWhatsAppGroup(groupJID: String, message: String? = nil, localImageURL: URL? = nil) {
    // 发送图片的逻辑:用系统共享面板直接分享到指定群组
    if let imageURL = localImageURL {
        let activityVC = UIActivityViewController(activityItems: [imageURL], applicationActivities: nil)
        // 过滤仅显示WhatsApp
        activityVC.excludedActivityTypes = [.airDrop, .message, .mail]
        UIApplication.shared.keyWindow?.rootViewController?.present(activityVC, animated: true)
        return
    }
    
    // 发送消息的逻辑:用URL Scheme跳转
    guard let message = message, let encodedMsg = message.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {
        return
    }
    
    let whatsURL = "whatsapp://send?text=\(encodedMsg)&to=\(groupJID)"
    guard let url = URL(string: whatsURL), UIApplication.shared.canOpenURL(url) else {
        let alert = UIAlertController(title: "抱歉", message: "您的设备未安装WhatsApp", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default))
        UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true)
        return
    }
    
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

四、替代Python+Twilio的稳定方案

如果要求100%精准触发(不受iOS后台限制),建议采用服务器端方案:

  • 后端用Swift/Node.js/Python等语言,集成Twilio或WhatsApp Business API,在指定时间调用API直接发送到群组。
  • iOS端仅负责将定时任务同步到服务器,无需本地触发。

这种方案完全规避iOS后台限制,适合凌晨12点这类必须精准执行的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:54:58