问题描述
我已经遵循了Siri此处提到的所有步骤: https://docs.microsoft.com/en-us/xamarin/ios/platform/sirikit/implementing-sirikit?tabs=macos
也遵循:https://developer.apple.com/documentation/sirikit/media/managing_audio_with_sirikit
IntentHandler.cs:
[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);
}
}
现在,当我向Siri发出命令时喜欢:“以myappname播放Daily节目”时,显示以下内容:
因此,我并没有真正了解siri如何处理Media内容以通过命令显示我的应用程序。任何人都知道:
- 如何在Xamarin.iOS中处理Siri Media Intent?
- 如何通过Xamarin.iOS添加Siri支持?
更新:2020年10月29日-如何播放《播客》中的特定剧集 播放列表是siri吗?
我正在尝试播放Podcast播放列表的特定剧集,但是它不起作用。我已将命令传递给siri,例如:Play the Overlap by audiochuck from CounterClock podcast in siridemo
here siridemo = my app's name,Overlap = episode name,counterclock = Podcast name.
当控件进入appdelegate中的HandleIntent方法时,我在mediasearch.medianame对象中仅获得CounterClock。因此,可以使用Siri实现这一目标吗?
如何修复应用程序未添加具有siri错误的支持?
解决方法
我有解决方案,就在这里。
1。您的IntentExtension项目中的Intent Handler:
First mistake I have done was I have used INPlayMediaIntentResponseCode.Success instead of HandleInApp,which I have corrected here. Why HandleInApp? Hold on :)
[Register("IntentHandler")]
public class IntentHandler : INExtension,IINPlayMediaIntentHandling
{
protected IntentHandler(IntPtr handle) : base(handle) { }
public override NSObject GetHandler(INIntent intent)
{
return this;
}
[Export("handlePlayMedia:completion:")]
public void HandlePlayMedia(INPlayMediaIntent intent,Action<INPlayMediaIntentResponse> completion)
{
var response = new INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.HandleInApp,null);
completion(response);
}
}
2。现在,让我们在AppDelegate中处理它:
As we have passed HandleInApp as a response in Intent handler's HandlePlayMedia() it will call HandleIntent() method in AppDelegate of your main iOS project. Where the magic will happen.
public async override void HandleIntent(UIApplication application,INIntent intent,Action<INIntentResponse> completionHandler)
{
var playMediaIntent = intent as INPlayMediaIntent;
// The command you will give to siri will come here in MediaSearch object
var mediaName = playMediaIntent?.MediaSearch?.MediaName;
// Check if the Searched Podcast and episode is there in your Podcasts list or
// not and handle it accordingly
var response = new INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.Failure,userActivity);;
if(mediaName.Exist(Playlist))
{
response = new INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.ContinueInApp,null);
}
else
{
response = new INPlayMediaIntentResponse(INPlayMediaIntentResponseCode.FailureUnknownMediaType,null);
}
completionHandler(response);
}
Give search command to siri like this -
Play [EpisodeName] of [PodcastName] in your app name
For Example: `Play Conclusion in Selling Girls of America in siridemo app`
输出:
Now in MediaSearch.MediaName you will get "Conclusion in Selling Girls of America" as search string.
快乐编码!