Xamarin.iOSでAPNS

APNSはApple Push Notification Serviceの略でiOS用のPUSH通知です。
証明書の作成方法とかApple Developer Centerとかはそこら中にあるので割愛
サーバー側は使うサーバーによって違うので割愛(今回はWindows Azure使いました)

AppDelegate.cs

[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
+	public string DeviceToken { get; set; }

	public override bool FinishedLaunching (UIApplication app, NSDictionary options)
	{
+		// APNS サーバにアプリを登録
+		UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound | UIRemoteNotificationType.Alert;
+		UIApplication.SharedApplication.RegisterForRemoteNotificationTypes (notificationTypes);

		〜中略〜

		return true;
	}

	// DeviceTokenの取得に成功
+	public override async void RegisteredForRemoteNotifications (UIApplication application, NSData deviceToken)
+	{
+		string trimmedDeveceToken = deviceToken.Description;
+		if (!string.IsNullOrWhiteSpace (trimmedDeveceToken)) 
+		{
+			trimmedDeveceToken = trimmedDeveceToken.Trim ('');
+			trimmedDeveceToken = trimmedDeveceToken.Replace (" ", "");
+		}
+		DeviceToken = trimmedDeveceToken;
+
+		(サーバーにDeviceTokenを送信する処理)
+	}
+
+	// DeviceTokenの取得に失敗(ネットつながってないとかシミュレータとか)
+	public override void FailedToRegisterForRemoteNotifications (UIApplication application, NSError error)
+	{
+		base.FailedToRegisterForRemoteNotifications (application, error);
+	}
+
+	// PUSH通知を受け取った
+	public override void ReceivedRemoteNotification (UIApplication application, NSDictionary userInfo)
+	{
+		bool success = userInfo.TryGetValue(new NSString("inAppMessage"), out inAppMessage);
+		if (success)
+		{
+			// 通知センターに登録して各Controllerで受け取れるようにする
+			NSNotificationCenter.DefaultCenter.PostNotificationName ("ReloadChatMessage", null);
+		}
+	}

NotificationViewController.cs

public partial class NotificationViewController : UIViewController
{
+	NSObject notification;

	public override void ViewWillAppear (bool animated)
	{
		base.ViewWillAppear (animated);

+		// PUSH通知受け取り通知
+		notification = NSNotificationCenter.DefaultCenter.AddObserver ("ReloadChatMessage", async delegate(NSNotification obj) {
+			(PUSH通知受け取った時に行いたい処理)
+		});
	}

	public override void ViewDidDisappear (bool animated)
	{
		base.ViewDidDisappear (animated);

+		// PUSH通知受け取り削除
+		NSNotificationCenter.DefaultCenter.RemoveObserver (notification);
	}

Xamarin.iOSでキーボードのサイズなど取得

キーボードの表示・非表示に関する通知設定、削除
[追記]2014年1月23日
もっと簡単に各種データ取得出来たので修正

public override void ViewWillAppear (bool animated)
{
	base.ViewWillAppear (animated);

	// キーボード表示・非表示の通知開始
	NSNotificationCenter.DefaultCenter.AddObserver (UIKeyboard.WillShowNotification, KeyboardWasShown);
	NSNotificationCenter.DefaultCenter.AddObserver (UIKeyboard.WillHideNotification, KeyboardWillBeHidden);
}

public override void ViewDidDisappear (bool animated)
{
	base.ViewDidDisappear (animated);

	// キーボード表示非表示の通知削除
	NSNotificationCenter.DefaultCenter.RemoveObserver (UIKeyboard.WillShowNotification);
	NSNotificationCenter.DefaultCenter.RemoveObserver (UIKeyboard.WillHideNotification);
}

キーボードが表示された時

private void KeyboardWasShown(NSNotification notification)
{
	var keyboardFrame = UIKeyboard.FrameEndFromNotification (notification);

	UIView.BeginAnimations ("AnimateKeyboardShow");
	UIView.SetAnimationDuration (UIKeyboard.AnimationDurationFromNotification (notification));
	UIView.SetAnimationCurve ((UIViewAnimationCurve)UIKeyboard.AnimationCurveFromNotification (notification));
	UIView.SetAnimationRepeatCount (1);
	UIView.SetAnimationRepeatAutoreverses (false);
	〜ここにアニメーションの内容を書く〜
	UIView.CommitAnimations ();
}

Xamarin.iOSでカスタムUITableViewCell

昨日に引き続きな感じで。
午前中必死にxibでセル作ってーとかやったんだけどIntPrt handleが解決できなくなったので結局ゴリゴリ書くことに…

public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
{
	var cell = new UITableViewCell ();

	if (indexPath.Row == 0) {
		cell.TextLabel.Text = "Name";
		UITextField textField = new UITextField () {
			BorderStyle = UITextBorderStyle.None,
			Placeholder = "Your name",
			KeyboardType = UIKeyboardType.NamePhonePad,
			ReturnKeyType = UIReturnKeyType.Done,
			ClearButtonMode = UITextFieldViewMode.WhileEditing,
			Frame = new RectangleF(128, 7, 172, 30),
		};
		textField.ShouldReturn = delegate {
			textField.ResignFirstResponder ();
			return true;
		};
		textField.ShouldClear = delegate {
			return true;
		};
		cell.AddSubview (textField);
	}

	return cell;
}

Xamarin.iOSでUIView上の一部にUITableViewを設置する

public override void ViewDidLoad ()
{
	base.ViewDidLoad ();

	tableView = new UITableView (new RectangleF (0, 100, this.View.Frame.Width, 200), UITableViewStyle.Grouped) {
		Delegate = new TableViewDelegate(),
		DataSource = new TableViewDataSource(),
		AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth,
	};
	tableView.ScrollEnabled = false;
	tableView.SizeToFit ();
	this.View.AddSubview (tableView);
}

private class TableViewDelegate : UITableViewDelegate
{
	public TableViewDelegate() {}
}

private class TableViewDataSource : UITableViewDataSource
{
	public TableViewDataSource() {}

	public override int NumberOfSections (UITableView tableView)
	{
		return 1;
	}

	public override int RowsInSection (UITableView tableview, int section)
	{
		return 1;
	}

	public override string TitleForHeader (UITableView tableView, int section)
	{
		return "";
	}

	public override string TitleForFooter (UITableView tableView, int section)
	{
		return "";
	}

	public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
	{
		var cell = tableView.DequeueReusableCell (tabletestCell.Key) as tabletestCell;
		if (cell == null)
			cell = new tabletestCell ();
		cell.DetailTextLabel.Text = "DetailsTextLabel";

		return cell;
	}
}