メインメニューを開く

差分

Xamarin.Mac/カスタムURLスキームを利用する

3,727 バイト追加, 2016年7月15日 (金) 08:06
ページの作成:「== 実装 == 以下でカスタムURLスキームが利用可能になる。 # Xamarin Studioでプロジェクト内の「Info.plist」を開く # 下部の「Advanced...」
== 実装 ==
以下でカスタムURLスキームが利用可能になる。
# Xamarin Studioでプロジェクト内の「Info.plist」を開く
# 下部の「Advanced」タブを開く
# URL Typesの「Add URL Type」ボタンを押す
# 「Identifier」は何でもよい。アプリのIdentifierでも入れておく。
# 「URL Schems」にURLスキーム名を入れる

次にURLスキームが叩かれた際に呼ばれるメソッドの登録と実装をする。
<source lang="csharp">
using System;
using System.Linq;
using System.Collections.Generic;

using AppKit;
using Foundation;
using ObjCRuntime;

namespace UrlScheme
{
[Register("AppDelegate")]
public class AppDelegate : NSApplicationDelegate
{
public AppDelegate()
{
}

public override void DidFinishLaunching(NSNotification notification)
{
// URLスキームで呼ばれるメソッドを指定する。
var appleEventManager = NSAppleEventManager.SharedAppleEventManager;
appleEventManager.SetEventHandler(this
, new Selector("handleGetURLEvent:withReplyEvent:")
, AEEventClass.Internet
, AEEventID.GetUrl);
}

[Export("handleGetURLEvent:withReplyEvent:")]
private void HandleGetURLEvent(NSAppleEventDescriptor descriptor, NSAppleEventDescriptor replyEvent)
{
// URIを取得する。
var uriString = descriptor.ParamDescriptorForKeyword(AEKeyword.DirectObject).StringValue;

// QueryString以外はUriクラスがパースしてくれる。
var uriObject = new Uri(uriString);

// QueryStringをパースする。
// Xamarin.MacはPCL縛りでSystem.WebのHttpUtility.ParseQueryStringが使えない。
var parameters = string.IsNullOrEmpty(uriObject.Query)
? new Dictionary<string, string>()
: uriObject.Query
.TrimStart(new[] { '?' })
.Split('&')
.Select(p => p.Split('='))
.ToDictionary(p => p[0], p => 1 < p.Length ? Uri.UnescapeDataString(p[1]) : null)
;

Console.WriteLine(parameters);
}

/// <summary>
/// Xamarin.Macに定数らしきものが見当たらなかったので作った
/// </summary>
public static class AEKeyword
{
public static readonly uint DirectObject = Create("----");
public static readonly uint ErrorNumber = Create("errn");
public static readonly uint ErrorString = Create("errs");
public static readonly uint ProcessSerialNumber = Create("psn ");
public static readonly uint PreDispatch = Create("phac");
public static readonly uint SelectProc = Create("selh");
public static readonly uint AERecorderCount = Create("recr");
public static readonly uint AEVersion = Create("vers");

static uint Create(string key)
{
return (
((uint)key[0]) << 24 |
((uint)key[1]) << 16 |
((uint)key[2]) << 8 |
((uint)key[3]) << 0);
}
}
}
}
</source>

== 関連項目 ==

== 参考文献 ==
{{reflist}}

{{stub}}

[[category: Xamarin.Mac]]
匿名利用者