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

Delphi iOS平台调用MultipeerConnectivity的invitationHandler触发访问违规问题求助

解决Delphi中调用MCNearbyServiceAdvertiserDelegate的invitationHandler时的AccessViolation问题

首先,你的核心问题在于误解了TMCNearbyServiceAdvertiserDelegateBlockMethod1的类型——它是Delphi的对象方法类型(带of object修饰),而不是Objective-C的block指针,所以完全不需要用imp_implementationWithBlock这类函数去转换,直接调用即可。

错误原因分析

你之前尝试用imp_implementationWithBlock处理invitationHandler,但这个函数是用来把Objective-C block包装成C函数指针的工具,而invitationHandler本身已经是Delphi可以直接调用的对象方法,强行转换自然会触发访问违规错误。

正确的调用方式

直接调用invitationHandler参数,传入对应的accept布尔值和你的MCSession实例即可,不需要额外的转换步骤。修改后的代码如下:

procedure TMCNearbyServiceAdvertiserDelegate.advertiser(advertiser: MCNearbyServiceAdvertiser; didReceiveInvitationFromPeer: MCPeerID; withContext: NSData; invitationHandler: TMCNearbyServiceAdvertiserDelegateBlockMethod1);
var
  MainForm: TMainForm;
begin
  MainForm := Application.MainForm as TMainForm;
  if MainForm.fSession = nil then
  begin
    MainForm.fSession := TMCSession.Alloc;
    MainForm.fSession.initWithPeer(MainForm.fPeerId);
    MainForm.fSessionDelegate := TMCSessionDelegate.Create;
    MainForm.fSession.setDelegate(MainForm.fSessionDelegate.GetObjectID);
  end;
  // 直接调用invitationHandler,无需任何转换操作
  invitationHandler(True, MainForm.fSession);
end;

额外注意事项

  • 确保你的MCSession实例和fPeerId都已经正确初始化,避免因空指针引发潜在问题。
  • 如果需要拒绝邀请,只需要传入False和nil作为参数即可:invitationHandler(False, nil);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:12:34