IDOneSignal 0.0.2

IDOneSignal 0.0.2

Maintained by Omid Golparvar.



 
Depends on:
Alamofire>= 0
SwiftyJSON>= 0
UIDeviceComplete>= 0
 

  • By
  • Omid Golparvar

کمک‌دست وان‌سیگنال برای سوییفت

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