کمکدست وانسیگنال برای سوییفت
آقا وانسیگنال زد تحریممون کرد!! طوریکه وصل نمیشه تا PlayerID بگیره. برای همین روند ثبت دستگاه توی وانسیگنال و بقیه کارایی که باهاش میکردیم رو مجبوریم خودمون یجورایی پیادهسازی مدیریت کنیم.
☝️ قبلا
روال کلی وانسیگنال اینجوری بود (و هست):
- وانسیگنال به گوشی میگه میخوام با APNs کار کنم. پس یه شناسه دستگاه (یا همون Device Token) بهم بده.
- دستگاه پیامهای مناسب رو به کاربر نشون میده و ازش اجازه میگیره، و بعدش به اپل میگه آقا این دستگاه رو ثبتش کن و یه شناسه دستگاه بده من. در نهایت شناسه رو که گرفت، تحویل کلاینت وانسیگنال میده.
- کلاینت وانسیگنال وقتی شناسه دستگاه رو گرفت، میفرسته سمت سرور وانسیگنال (البته بهمراه یه سری اطلاعات دیگه)، تا توی پایگاه داده خودش، یه دستگاه با اطلاعات مربوطه ثبت کنه، و برای اون دستگاه یه شناسه یکتا بسازه. دقت کنین شناسه جدید، مختص خود وانسیگنال هست، و برای جای دیگه استفاده نمیشه.
- کارای ثبت دستگاه که تموم شد، و شناسه وانسیگنالی دستگاه که ساخته شد، سرور وانسیگنال، شناسه ساخته شده رو بعنوان پاسخ درخواست کلاینتش، براش میفرسته.
- حالا کلاینت وانسیگنال میدونه شناسهاش توی سرور وانسیگنال چیه. و البته این شناسه رو در اختیار شمام قرار میده، تا اگه میخواین باهاش کار کنین.
👇 الان
الان اتفاقی که افتاده اینه که، وانسیگنال مارو تحریم کرده، و ارتباط بین کلاینت وانسیگنال، و سرور وانسیگنال، توی ایران برقرار نمیشه. پس سرور وانسیگنال، از وجود دستگاه با خبر نمیشه، و در نتیجه شناسهای هم براش تولید نمیکنه. پس ما هم نمیتونیم با استفاده از وانسیگنال برای کاربرا نوتیفیکیشن بفرستیم؛ نه بصورت عمومی، و نه بصورت خصوصی.
حالا چیکار کنیم؟ 🤔
مجبوریم اون جای خالی بین کلاینت وانسیگنال و سرور وانسیگنال رو خودمون پر کنیم. به این صورت که بین اون دوتا بشینیم، درخواست کلاینت رو تحویل بگیریم، و تحویل سرور وانسیگنال بدیم.
چه زندگی داریم آخه؟!...
توضیحات استفاده
پیکربندی
قبل از هر کاری، باید پیکربندی انجام بشه. توی پیکربندی، ما داریم اطلاعات مورد نیاز برای کارهای بعدی رو آماده میکنیم. برای پیکربندی از متد زیر استفاده میکنیم:
IDOneSignal.Setup(baseURL: String, appID: String, routes: (addDevice: String, editDevice: String))- پارامتر
baseURLمشخصکننده آدرس پایه سرور شماست (که قرار بعنوان واسط قرار بگیره). - پارامتر
appIDهمون شناسه مربوط به اپلیکیشن میشه که پنل وانسیگنال بهتون میده. - پارامتر
routesمشخصکننده آدرس نسبی، برای اکشنهای ثبت دستگاه و ویرایش دستگاه هست. البته این پارامتر دارای مقدار پیشفرض("onesignal/adddevice", "onesignal/editdevice")هست؛ یعنی میتونین مثلا یه کنترلر به نامonesignalبهمراه دوتا اکشنadddeviceوeditdeviceپیادهسازی کنین و بعد از این آدرسها برای امور مربوطه استفاده کنین.
انجام امور
متد کلی برای انجام امور، بصورت زیر تعریف شده:
IDOneSignal.Perform(action: IDOneSignalAction, then callback: (IDOneSignalActionError?, Any?) -> Void)- پارامتر
actionاز نوعIDOneSignalActionهست، که در واقع یهenumهست. من براساس نیاز خودم، اعمال ثبت دستگاه، مشترک شدن، لغو اشتراک، و ثبت برچسب رو در نظر گرفتم:
public enum IDOneSignalAction {
case addDevice(token: String)
case subscribe
case unsubscribe
case setTags(tags: [String: Any])
}- پارامتر
callbackهم از نوع(IDOneSignalActionError?, Any?) -> Voidهست که در واقع یهClosureهست که نتیجه اون عمل رو برمیگردونه. خودش دوتا پارامتر داره. اولی خطای احتمالی رو مشخص میکنه، و دومی داده دریافتی احتمالی رو. اون خطای احتمالی، یکی از خطاهای زیر خواهد بود:
public enum IDOneSignalActionError: Error, CustomStringConvertible {
case missingDeviceToken
case missingPlayerID
case isNotConfigured
case invalidResponse
case custom(message: String)
}گرفتن شناسه وانسیگنالی دستگاه
اگه همهچی درست و بدون مشکل انجام بشه، و دستگاه بواسطه سرور شما، بدون مشکل توی وانسیگنال ثبت بشه، شما برای گرفتن PlayerID مربوط به وانسیگنال، از کد زیر میتونین استفاده کنین:
let playerID = IDOneSignal.PlayerIDدقت داشته باشین که نوع این متغیر String? هست؛ و اگه مشکلی پیش اومده باشه، یا دستگاه بدرستی ثبت نشده باشه، مقدار این متغیر برابر nil خواهد بود.