کمکدست وانسیگنال برای سوییفت
آقا وانسیگنال زد تحریممون کرد!! طوریکه وصل نمیشه تا 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
خواهد بود.