C# 如何使用INPlayMediaIntent处理Siri套件,以便在Xamarin.iOS应用程序中播放播客插曲?
对于Siri,我已经遵循了这里提到的所有步骤: 随后还包括: IntentHandler.cs:C# 如何使用INPlayMediaIntent处理Siri套件,以便在Xamarin.iOS应用程序中播放播客插曲?,c#,xamarin,xamarin.ios,siri,sirikit,C#,Xamarin,Xamarin.ios,Siri,Sirikit,对于Siri,我已经遵循了这里提到的所有步骤: 随后还包括: IntentHandler.cs: [Register("IntentHandler")] public class IntentHandler : INExtension, IINPlayMediaIntentHandling, IINAddMediaIntentHandling { protected IntentHandler(IntPtr handle) : base(handle) {
[Register("IntentHandler")]
public class IntentHandler : INExtension, IINPlayMediaIntentHandling, IINAddMediaIntentHandling
{
protected IntentHandler(IntPtr handle) : base(handle)
{
}
public override NSObject GetHandler(INIntent intent)
{
return this;
}
//INPlayMediaIntent
public void resolveMediaItems(INPlayMediaIntent intent, Action<INPlayMediaMediaItemResolutionResult> completion)
{
var mediaItemData = new INMediaItem(identifier: SessionService.LastPlayedEpisode.PodcastId, title: SessionService.LastPlayedEpisode.Title, type: INMediaItemType.PodcastEpisode, artwork: null);
MessagingCenter.Send<object, string>(this, "PlayRecentEpisodeSiriEvent", "ResolveMediaItems");
completion(INPlayMediaMediaItemResolutionResult.GetSuccess(mediaItemData));
}
public void HandlePlayMedia(INPlayMediaIntent intent, Action<INPlayMediaIntentResponse> completion)
{
var userActivity = new NSUserActivity("INPlayMediaIntent");
var response = new INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.HandleInApp, userActivity);
completion(response);
}
public void HandleAddMedia(INAddMediaIntent intent, Action<INAddMediaIntentResponse> completion)
{
var userActivity = new NSUserActivity("INAddMediaIntent");
var response = new INAddMediaIntentResponse(INAddMediaIntentResponseCode.Success, userActivity);
completion(response);
}
}
[寄存器(“IntentHandler”)]
公共类维护者:无张力、iInPlaymedia维护者、iInAdmMediaMaintentHandling
{
受保护的IntentHandler(IntPtr句柄):基本(句柄)
{
}
公共覆盖NSObject GetHandler(INIntent intent intent)
{
归还这个;
}
//INPlayMediaIntent
public void resolveMediaItems(INPlayMediaIntent意图、操作完成)
{
var mediateItemData=new-INMediaItem(标识符:SessionService.LastPlayedEpisode.PodcastId,标题:SessionService.LastPlayedEpisode.title,类型:INMediaItemType.PodcastEpisode,插图:null);
MessagingCenter.Send(这是“PlayRecentePiSodesrievent”、“ResolveMediaItems”);
完成(inPlayMediaItemResolutionResult.GetSuccess(mediaItemData));
}
公共无效HandlePlayMedia(INPlayMediaIntent、操作完成)
{
var userActivity=new NSUserActivity(“INPlayMediaIntent”);
var响应=新的INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.HandleInApp,userActivity);
完成(答复);
}
公共无效HandLeadMedia(不包含调解意图、行动完成)
{
var userActivity=新NSUserActivity(“inaddmediainment”);
var响应=新的InAddMediaIntrentResponse(InAddMediaIntrentResponseCode.Success,userActivity);
完成(答复);
}
}
现在,当我命令Siri喜欢:“在myappname中播放每日”时,它显示:
所以,我不知道siri将如何处理媒体内容,以使用命令显示我的应用程序。任何人都知道:
在siridemo的反锁播客中播放audiochuck的重叠部分
这里siridemo=我的应用程序名,Overlap=剧集名,反锁=播客名。
当控件转到appdelegate中的HandleIntent方法时,我在mediasearch.medianame对象中只得到反锁定。那么有可能用Siri实现这一点吗
如何修复应用程序没有添加对siri错误的支持?
我找到了解决方案,它就在这里。
1。您的IntentTexttension项目中的Intent处理程序:
我犯的第一个错误是使用了INPlayMediaIntentResponseCode.Success而不是HandleInApp,我在这里纠正了这个错误。为什么要手舞足蹈?请稍候:)
[寄存器(“IntentHandler”)]
公共类维护者:不精确的,iInPlaymedia维护者
{
受保护的IntentHandler(IntPtr句柄):基(句柄){}
公共覆盖NSObject GetHandler(INIntent intent intent)
{
归还这个;
}
[导出(“handlePlayMedia:completion:”)]
公共无效HandlePlayMedia(INPlayMediaIntent、操作完成)
{
var响应=新的INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.HandleInApp,null);
完成(答复);
}
}
2。现在让我们在AppDelegate中处理它:
由于我们在Intent处理程序的HandlePlayMedia()中将HandleInApp作为响应传递,它将在主iOS项目的AppDelegate中调用handleInent()方法。魔法将在哪里发生。
public async override void HandleIntent(UIApplication应用程序、INIntent意图、Action completionHandler)
{
var playMediaIntent=intent作为INPlayMediaIntent;
//您将向siri发出的命令将在MediaSearch对象中出现
var mediaName=playMediaIntent?.MediaSearch?.mediaName;
//检查搜索到的播客和插曲是否在播客列表中,或者
//不可以,请相应处理
var响应=新的INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.Failure,userActivity);;
if(mediaName.Exist(播放列表))
{
响应=新的INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.ContinueInApp,null);
}
其他的
{
响应=新的INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.FailureUnknownMediaType,null);
}
completionHandler(响应);
}
向siri发出如下搜索命令-
在应用程序名中播放[PodcastName]的[EpisodeName]
例如:`在siridemo应用程序中销售《美国女孩》的游戏结论`
输出:
现在在MediaSearch.MediaName中,您将获得“出售美国女孩的结论”作为搜索字符串。
快乐编码 你的ios版本是什么?14.0@LeoZhu msfti是因为你想调用的短语不起作用吗?尝试更改短语或添加自定义语句。我尝试过使用不同的短语,并且根据从苹果文档中获得的演示编写了代码。实际问题是,我想这就是为什么它不起作用的原因。您知道如何调用IntentExtension吗?您是否在
Info.plist
文件中配置了Intents扩展名?