پیام چابک
ویرایش
چابک برای ارسال پیام هنگامی که کاربر به سرور چابک متصل است (باز بودن اپلیکیشن) از سرویس آنی خود استفاده میکند (پیام چابک) و در صورت عدم اتصال (بسته بودن اپلیکیشن) اقدام به ارسال پوشنوتیفیکیشن میکند تا کاربر را از داشتن پیام چابک مطلع سازد. از این پس منظور از واژه پیام، همان پیام چابک است و منظور از پوش یا نوتیفیکیشن، همان پوشنوتیفیکیشن میباشد.
پیامهای چابک از طریق کانال ارسال میشوند. بنابراین برای دریافت پیام، باید ابتدا کاربر را در کانال عضو نمایید. در این قسمت شما میتوانید پیام دریافت کنید و برای آن وضعیت (status) ارسال کنید. همچنین میتوانید پیام ارسال کنید و از وضعیت تحویل آن مطلع شوید.
نکته
: برای استفاده از پیامرسانی آنی باید حتما قابلیت آنی (realtime) را فعال کنید. برای این کار مقدار پیشفرض آن را در فایل دانلود شده (Chabok.sandbox.plist یا Chabok.production.plist) از پنل تغییر دهید.
دریافت پیام
برای دریافت پیام چابک میتوانید از رویداد pushClientManagerDidReceivedMessage
استفاده کنید. در زیر نمونه کدی جهت دریافت اطلاعات از پیام چابک آمده است:
- (void)pushClientManagerDidReceivedMessage:(PushClientMessage *)message{
// Called When PushClientManager has been received new message from server
NSString *channel = message.channel;
NSString *senderId = message.senderId;
NSDictionary *customData = message.data;
NSString *body = [message.notification valueForKey:@"body"];
NSString *title = [message.notification valueForKey:@"title"];
NSString *subtitle = [message.notification valueForKey:@"subtitle"];
NSLog(@"\n\n Got the Chabok message : \n \n %@", message.toDict);
}
func pushClientManagerDidReceivedMessage(_ message: PushClientMessage?) {
// Called When PushClientManager has been received new message from server
let channel = message?.channel
let customData = message?.data
let senderId = message?.senderId
let body = message?.notification["body"] as? String
let title = message?.notification["title"] as? String
let subtitle = message?.notification["subtitle"] as? String
if let chabokPayload = message?.toDict {
print("\n\n Got the Chabok message : \n \n \(chabokPayload)")
}
}
چابک به طور پیشفرض برای پیامهای دریافتی (پیام چابک و پوشنوتیفیکیشن)، اعلان (نوتیفیکیشن) نمایش میدهد. برای شخصیسازی و تنظیم کلیک روی اعلان این بخش را مطالعه نمایید.
ارسال وضعیت برای پیامهای دریافتی
شما میتوانید عکسالعمل کاربر به یک پیام چابک (خوانده شدن، نادیده گرفته شدن، …) را با استفاده از کلاینت چابک مشخص کنید.
متد markAsRead
برای ارسال رویداد خوانده شدن پیام توسط کاربر به سرور می تواند مورد استفاده قرار بگیرد.
متد messageDismissed
نیز میتواند برای هر عملی که معنی باز نکردن یا نادیده گرفته شدن پیام را داشته باشد به کار رود. به دو طریق می توان این متدها را فراخوانی نمود:
[PushClientManager.defaultManager markAsRead:@"MESSAGE_ID"];
[PushClientManager.defaultManager messageDismissed:@"MESSAGE_ID"];
PushClientManager.default().mark(asRead: @"MESSAGE_ID")
PushClientManager.default().messageDismissed(@"MESSAGE_ID")
ارسال پیام
متد publish
برای ارسال پیام از سمت کلاینت به سرورهای چابک استفاده میشود. شما از این مکانیزم علاوه بر پیامهای شخصی میتوانید برای ارسال اطلاعات و دادههای کاربر به سمت سرور خود (به جای ارسال با درخواستهای کلاسیک HTTP) استفاده کنید.
ارسال پیام چابک به دو طریق زیر امکانپذیر است:
- با استفاده از متد
publish
میتوانید به یک کانال خاص (خصوصی/عمومی) برای یک کاربر خاص پیام ارسال کنید.
[PushClientManager.defaultManager publish:@"USER_ID"
toChannel:@"CHANNEL_NAME"
withText:@"Hello World!"];
PushClientManager.default().publish("USER_ID", toChannel: "CHANNEL_NAME", withText: "Hello World!")
نکته
: برای انتشار پیام در یک کانال عمومی به جای عبارتUSER_ID
باید کاراکتر*
را وارد نمایید. همینطور برای ارسال پیام در کانالهای خصوصی بایدUSER_ID
کاربر را وارد کنید. در هر دو صورت کاربر برای دریافت پیام در کانالی که ارسال مینمایید باید حتما عضو شده باشد.
روی اتصال موجود چابک میتوانید تعداد زیادی پیام سمت سرور بفرستید. در واقع برای هر درخواست یک اتصال جدید ساخته نمیشود. این ویژگی تحویل اطلاعات را در سمت سرور حتی در شرایطی که کاربر اینترنت ضعیف و یا قطع شدهای دارد، تضمین میکند. به این ترتیب که کلاینت چابک با استفاده از منطق سعی مجدد خود میتواند پیام شما را حتی در شرایط بحرانی یک و فقط یک بار بفرستد.
- برای ارسال پیام با جزئیات بیشتر میتوانید از signature دیگر متد
publish
استفاده کنید، همانند نمونه کد زیر:
NSString *toUserId = @"USER_ID"; //Required. For public channel set * (wildcard)
NSString *toChannel = @"CHANNEL"; //Required
NSString *messageBody = @"MESSAGE_BODY"; //Required
NSDictionary *customData = @{@"KEY":@"VALUE"}; //Optional
PushClientMessage *message = [[PushClientMessage new] initWithMessage:messageBody
withData:customData
toUserId:toUserId
channel:toChannel];
[message.notification setValue:@(1) forKey:@"badge"]; //Optional
[message.notification setValue:@"SOUND" forKey:@"sound"]; //Optional
[message.notification setValue:@"TITLE" forKey:@"title"]; //Optional
[message.notification setValue:@"SUBTITLE" forKey:@"subtitle"];//Optional
[PushClientManager.defaultManager publish:message];
let toUserId = "USER_ID" //Required. For public channel set * (wildcard)
let toChannel = "CHANNEL" //Required
let messageBody = "MESSAGE_BODY" //Required
let customData = ["KEY": "VALUE"] //Optional
let message = PushClientMessage(message: messageBody,
withData: customData,
toUserId: toUserId,
channel: toChannel)
message.notification["badge"] = 1 //Optional
message.notification["sound"] = "SOUND" //Optional
message.notification["title"] = "TITLE" //Optional
message.notification["subtitle"] = "SUBTITLE" //Optional
PushClientManager.default().publish(message)
در صورت رخ دادن خطا به هنگام publish
پیام، delegate method
زیر فراخوانی خواهد شد:
-(void) pushClientManagerDidFailInPublish:(NSError *)error{
NSLog(@"Error in publishing message %@",error);
}
func pushClientManagerDidFail(inPublish error: Error!) {
print("Error in publishing message \(error)")
}
دریافت گزارش تحویل پیام (Delivery)
برای فعال کردن دریافت گزارش تحویل یک پیام منتشر شده، باید ابتدا deliveryChannelEnabeled
را مقداردهی کنید:
PushClientManager.defaultManager.deliveryChannelEnabeled = YES;
Swift:
PushClientManager.default().deliveryChannelEnabeled = true
پس از آن برای دریافت گزارش تحویل پیامهای ارسالی، رویداد pushClientManagerDidReceivedDelivery
فراخوانی خواهد شد:
- (void)pushClientManagerDidReceivedDelivery:(DeliveryMessage *)delivery{
// Called When PushClientManager has received new delivery from server
NSString *messageId = delivery.messageId;
NSDate * deliverdAt = delivery.deliveredAt;
NSString *deliveredToUser = delivery.deliveredUserId;
NSLog(@"\n\n Got message delivery %@, delivered to %@ at %@", messageId, deliveredToUser, deliverdAt);
}
func pushClientManagerDidReceivedDelivery(_ delivery: DeliveryMessage?) {
// Called When PushClientManager has received new delivery from server
let messageId = delivery?.messageId
let deliverdAt: Date? = delivery?.deliveredAt
let deliveredToUser = delivery?.deliveredUserId
print("\n\n Got message delivery \(messageId ?? ""), delivered to \(deliveredToUser ?? "") at \(deliverdAt)")
}
کانال
پیامرسانی بین سرور و کلاینت چابک از طریق کانال انجام میشود. کانال یک مفهوم انتزاعی است و نقش یک مجرا را برای ارسال و دریافت پیام ایفا میکند. شما با کانال میتوانید انتشار محتوا با موضوعات مختلف را جداسازی کنید. دقت داشته باشید که از کانالها برای گروهبندی کاربران استفاده نکنید زیرا این دو مکانیزم با هم متفاوت هستند. به عنوان مثال از کانال برای جداسازی موضوعات محتوا، قابلیت چت، کامنت و … استفاده میشود. اما از گروهبندی کاربران برای ارسال کمپین یا پیام به گروهی از کاربران که به عنوان مثال در محدوده مکانی خاص قرار دارند یا ترکیب آن با ویژگیهای دیگر مانند کاربرانی که گوشیهای اندروید دارند به کار برده میشود.
به طور کلی کانالها به دو دسته عمومی (public) و خصوصی (private) تقسیم میشوند. کانال شخصی برای ارسال پیام شخصی به یک کاربر به خصوص است و کانال عمومی برای انتشار پیام برای مجموعهای از کاربران میباشد. عضویت کاربر روی یک کانال برای دریافت پیامهای ارسالی آن کانال subscribe
و لغو آن unsubscribe
نامیده میشود. چابک به طور پیشفرض هر کاربر را روی دو کانال شخصی براساس شناسه کاربر (default
) و شناسه دستگاه (installationId
) ثبت نام میکند.
نکته:
نام کانال به صورت پیشفرض به عنوان کانال عمومی در نظر گرفته میشود و اگر شما میخواهید کاربر را روی کانال شخصی ثبتنام کنید کافی است قبل از نام کانال عبارت/private
را اضافه نمایید.
عضویت روی کانال (Subscribe)
برای عضویت روی یک کانال میتوانید از متد subscribe
استفاده کنید که در زیر به آن اشاره شده است:
[self.manager subscribe:@"alert"]; // public channel
[self.manager subscribe:@"private/league"]; // private (personal) channel
manager.subscribe("alert") // public channel
manager.subscribe("private/league") // private (personal) channel
در صورت موفق بودن عمل عضویت روی یک کانال، متد delegate
زیر فراخوانی خواهد شد:
-(void) pushClientManagerDidSubscribed:(NSString *)channel{
NSLog(@"Subscribed on '%@' channel",channel);
}
func pushClientManagerDidSubscribed(_ channel: String!) {
print("Subscribed on '\(channel)' channel")
}
همچنین در صورت رخ دادن خطا به هنگام عضویت روی یک کانال، با استفاده از متد delegate
زیر میتوانید از خطای رخ داده شده با خبر شوید:
-(void) pushClientManagerDidFailInSubscribe:(NSError *)error{
NSLog(@"Error subscribing on channel %@",error);
}
func pushClientManagerDidFail(inSubscribe error: Error!) {
print("Error subscribing on channel \(error)")
}
لغو عضویت از کانال (Unsubscribe)
برای لغو عضویت از یک کانال میتوانید از متد unsubscribe
استفاده کنید که در زیر به آن اشاره شده است:
[PushClientManager.defaultManager unsubscribe:@"alert"]; // public channel
[PushClientManager.defaultManager unsubscribe:@"private/league"]; // private (personal) channel
PushClientManager.default().unsubscribe("alert") // public channel
PushClientManager.default().unsubscribe("private/league") // private (personal) channel
در صورت موفق بودن عمل لغو عضویت از یک کانال، متد delegate
زیر فراخوانی خواهد شد:
-(void) pushClientManagerDidUnsubscribed:(NSString *)channel{
NSLog(@"Unsubscribed from '%@' channel",channel);
}
func pushClientManagerDidUnsubscribed(_ channel: String!) {
print("Unsubscribed from '\(channel)' channel")
}
در صورت رخ دادن خطا به هنگام لغو عضویت از یک کانال با استفاده از متد delegate
زیر میتوانید از خطا رخ داده شده با خبر شوید:
-(void) pushClientManagerDidFailInUnsubscribe:(NSError *)error{
NSLog(@"Error in unsubscribe from channel %@",error);
}
func pushClientManagerDidFail(inUnsubscribe error: Error!) {
print("Error in unsubscribe from channel \(error)")
}