お知らせ一覧画面
受信したメッセージの一覧を表示するには PopinfoListViewController クラスを利用します。
このビューコントローラを表示すると、「受信したメッセージの一覧」を表示するテーブルビュー が描画されます。
ユーザーがこのテーブルビューのセル(行)をタップすると、お知らせ詳細画面 に遷移します。
この画面は ナビゲーションコントローラ がある状態でご利用ください。
詳細な組み込み例は SampleApp/SampleSwiftApp プロジェクト内の AppDelegate をご参照ください。
PopinfoListViewController *listVC = [[PopinfoListViewController alloc] initWithNibName:@"PopinfoListViewController" bundle:[NSBundle mainBundle]];
[navigationController pushViewController:listVC animated:NO];
let listVC = PopinfoListViewController(nibName:"PopinfoListViewController", bundle:Bundle.main)
navigationController.pushViewController(listVC, animated: false)
レイアウトをカスタマイズする
描画に関するソースコードは PopinfoListViewController クラスで完結しています。
マージンや高さなどは PopinfoViewConfiguration クラスで定義されます。
この2つのクラスを修正していただくことにより、レイアウト上の様々なカスタマイズが可能です。
クラスは継承してお使いください
FANSHIP SDK が提供する標準 UI は、適宜改良されていく可能性があります。
App 側でお知らせ一覧画面の UI をカスタマイズする場合は PopinfoListViewController クラスをそのまま修正するのではなく、これを継承した独自クラス で行っていただくことをおすすめします。
Storyboard を利用する場合
Storyboard を用いて実装する場合 は、 Custom Class に PopinfoListViewController を指定することも可能ですが、上記と同じ理由から PopinfoListViewController クラスを継承した独自クラス を指定することをおすすめします。
特定のカテゴリのみを一覧に表示する
お知らせ一覧画面用のクラス(PopinfoListViewController)のインスタンスを以下のように生成し、category プロパティに@”news”という文字列をあてます。
これによって、このお知らせ一覧画面には、「news」カテゴリの配信のみが表示されます。
PopinfoListViewController *newsListVC = [[PopinfoListViewController alloc] initWithNibName:@"PopinfoListViewController" bundle:[NSBundle mainBundle]];
newsListVC.category = @"news";
let newsListVC = PopinfoListViewController(nibName: "PopinfoListViewController", bundle: Bundle.main)
newsListVC.category = "news"
届いたお知らせのカテゴリに応じて、表示するお知らせ一覧を動的に変えたい
PopinfoReceiver デリゲートメソッドを記述してください。
プッシュ通知受信後、サーバーとの通信が完了したときに、このデリゲートメソッドがコールされます。
サーバーとの通信が完了しているため、このデリゲートメソッドの引数の category には届いたお知らせのカテゴリ文字列が入っています。
以下のサンプルのように、カテゴリに応じてお知らせ一覧画面に表示するお知らせのカテゴリを変える処理を記述してください。
- (void)popinfoReceiver:(PopinfoReceiver *)popinfoReceiver didReceivePopinfoMessage:(NSInteger)messageId category:(NSString *)category result:(BOOL)result
{
// PopinfoListViewController の category プロパティに category を代入し、
// お知らせ一覧画面に表示するお知らせをそのカテゴリに絞り込む。
listVC.category = category;
}
func popinfoReceiver(_ popinfoReceiver: PopinfoReceiver, didReceivePopinfoMessage messageId: Int, category: String, result: Bool) {
// PopinfoListViewController の category プロパティに category を代入し、
// お知らせ一覧画面に表示するお知らせをそのカテゴリに絞り込む。
listVC.category = category
}
引数について
messageId: 届いたお知らせのメッセージ ID です。result: サーバーとの通信の結果であり、通信が成功した時は YES、失敗した時は NO が入ります。
既読のお知らせ詳細タイトルの文字色を変更する
PopinfoViewConfiguration.m 内の kListViewColorUseWhenRead が YES になっていることを確認します。
文字色を変えたい場合は、PopinfoListViewController.m 内に記述されている tableView:cellForRowAtIndexPath: において、titleLabel.textColor = [UIColor systemGrayColor]; を message.piUnread の値に応じて変更してください。
未読/既読を管理する
メッセージの未読件数を取得してタブにバッジを表示したい
メッセージの未読数を取得する場合、PopinfoReceiver クラスの getUnreadMessagesCounts: メソッドを利用します。
// バッジを付けたい UITabBarItem を指定する
UITabBarItem *tabBarItem = [self.tabBarController.tabBar.items objectAtIndex:1];
// 未読数を取得する
int number = [[PopinfoReceiver sharedReceiver] getUnreadMessagesCounts:@""];
// 未読がある場合はタブにバッジを付ける
if (number) {
tabBarItem.badgeValue = [NSString stringWithFormat:@"%d", number];
} else {
tabBarItem.badgeValue = nil;
}
// バッジを付けたい UITabBarItem を指定する
let tabBarItem = self.tabBarController?.tabBar.items?[1]
// 未読数を取得する
let number = PopinfoReceiver.shared.getUnreadMessagesCounts("")
// 未読がある場合はタブにバッジを付ける
if number > 0 {
tabBarItem?.badgeValue = "\(number)"
} else {
tabBarItem?.badgeValue = nil
}
特定のメッセージを強制的に既読に変更したい
特定のメッセージを強制的に既読に変更する場合、PopinfoReceiver クラスの changeMessageToRead: メソッドを利用します。
ここでは、プッシュ通知到達時に、通知されたメッセージを強制的に既読に変更する例をご紹介します。
以下のように、プッシュ通知が到達した際にコールされる PopinfoReceiver デリゲートメソッド内に記述します。
- (void)popinfoReceiver:(PopinfoReceiver *)popinfoReceiver didReceivePopinfoMessage:(NSInteger)messageId popup:(NSString *)popup payload:(NSDictionary *)payload
{
[[PopinfoReceiver sharedReceiver] changeMessageToRead:messageId];
}
func popinfoReceiver(_ popinfoReceiver: PopinfoReceiver, didReceivePopinfoMessage messageId: Int, popup: String, payload: [AnyHashable : Any]) {
PopinfoReceiver.shared.changeMessage(toRead: messageId)
}