/IDPush

Primary LanguageSwiftOtherNOASSERTION

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

آقا وان‌سیگنال زد تحریم‌مون کرد!! طوریکه وصل نمیشه تا PlayerID بگیره. برای همین روند ثبت دستگاه توی وان‌سیگنال و بقیه کارایی که باهاش می‌کردیم رو مجبوریم خودمون یجورایی پیاده‌سازی مدیریت کنیم.


☝️ قبلا

روال کلی وان‌سیگنال اینجوری بود (و هست):

  • وان‌سیگنال به گوشی میگه می‌خوام با APNs کار کنم. پس یه شناسه دستگاه (یا همون Device Token) بهم بده.
  • دستگاه پیام‌های مناسب رو به کاربر نشون میده و ازش اجازه می‌گیره، و بعدش به اپل میگه آقا این دستگاه رو ثبتش کن و یه شناسه دستگاه بده من. در نهایت شناسه رو که گرفت، تحویل کلاینت وان‌سیگنال میده.
  • کلاینت وان‌سیگنال وقتی شناسه دستگاه رو گرفت، می‌فرسته سمت سرور وان‌سیگنال (البته بهمراه یه سری اطلاعات دیگه)، تا توی پایگاه داده خودش، یه دستگاه با اطلاعات مربوطه ثبت کنه، و برای اون دستگاه یه شناسه یکتا بسازه. دقت کنین شناسه جدید، مختص خود وان‌سیگنال هست، و برای جای دیگه استفاده نمیشه.
  • کارای ثبت دستگاه که تموم شد، و شناسه وان‌سیگنالی دستگاه که ساخته شد، سرور وان‌سیگنال، شناسه ساخته شده رو بعنوان پاسخ درخواست کلاینتش، براش می‌فرسته.
  • حالا کلاینت وان‌سیگنال می‌دونه شناسه‌اش توی سرور وان‌سیگنال چیه. و البته این شناسه رو در اختیار شمام قرار میده، تا اگه می‌خواین باهاش کار کنین.

👇 الان

الان اتفاقی که افتاده اینه که، وان‌سیگنال مارو تحریم کرده، و ارتباط بین کلاینت وان‌سیگنال، و سرور وان‌سیگنال، توی ایران برقرار نمیشه. پس سرور وان‌سیگنال، از وجود دستگاه با خبر نمیشه، و در نتیجه شناسه‌ای هم براش تولید نمی‌کنه. پس ما هم نمی‌تونیم با استفاده از وان‌سیگنال برای کاربرا نوتیفیکیشن بفرستیم؛ نه بصورت عمومی، و نه بصورت خصوصی.

حالا چیکار کنیم؟ 🤔

مجبوریم اون جای خالی بین کلاینت وان‌سیگنال و سرور وان‌سیگنال رو خودمون پر کنیم. به این صورت که بین اون دوتا بشینیم، درخواست کلاینت رو تحویل بگیریم، و تحویل سرور وان‌سیگنال بدیم. چه زندگی داریم آخه؟!... 😕


توضیحات استفاده

ایجاد پروژه در آی‌دی‌پوش و دریافت شناسه مربوط به پروژه

اولین قدم برای استفاده از این کتابخانه، ساخت پروژه در سامانه آی‌دی‌پوش و دریافت projectID هست.

⚠️ حالا فعلا نمی‌تونین پروژه بسازین!! ولی چند روز دیگه سامانه در دسترس همه خواهد بود.


نصب و اضافه‌کردن به پروژه

با استفاده از CocoaPod خیلی راحت می‌تونین این کتابخونه رو به پروژه خودتون اضافه‌اش کنین.

pod 'IDPush'

بعد توی کدتون، برای استفاده، بصورت زیر import کنین:

import IDPush

پیکربندی

برای پیکربندی، باید اول برین توی وبسایت ما، و بعد از ثبت‌نام و این کارا، یه پروژه تعریف کنین و اطلاعات مورد نیازش رو بهش بدین. بعد سامانه یه projectID بهتون میده. حالا توی نرم‌افزار آی‌او‌اس، کتابخانه رو با استفاده از این projectID پیکربندی می‌کنین.

IDPush.Setup(projectID: "abcdefghijklmnopqrstuvwxyz")

انجام امور

متد کلی برای انجام امور، بصورت زیر تعریف شده:

IDPush.Perform(action: IDPushAction, then callback: (IDPushActionError?, Any?) -> Void)
  • پارامتر action از نوع IDPushAction هست، که در واقع یکی از گزینه‌های این enum هست:
public enum IDPushAction {
    case addDevice(token: String)
    case subscribe
    case unsubscribe
    case setTags(tags: [String: Any])
    case editDevice(parameters: [String: Any])
}
  • پارامتر callback هم از نوع (IDPushActionError?, Any?) -> Void هست که در واقع یه Closure هست که نتیجه اون عمل رو برمیگردونه. خودش دوتا پارامتر داره. اولی خطای احتمالی رو مشخص می‌کنه، و دومی داده دریافتی احتمالی رو. اون خطای احتمالی، یکی از خطاهای زیر خواهد بود:
public enum IDPushActionError: Error, CustomStringConvertible {
    case missingDeviceToken
    case missingPlayerID
    case isNotConfigured
    case invalidResponse
    case custom(message: String)
}

گرفتن شناسه وان‌سیگنالی دستگاه

اگه همه‌چی درست و بدون مشکل انجام بشه، و دستگاه بواسطه سرور، بدون مشکل توی وان‌سیگنال ثبت بشه، شما برای گرفتن PlayerID مربوط به وان‌سیگنال، از کد زیر می‌تونین استفاده کنین:

let playerID = IDPush.GetPlayerID()

⚠️ دقت داشته باشین، مقداری که این متد برمی‌گردونه از نوع String? هست؛ و اگه مشکلی پیش اومده باشه، یا دستگاه بدرستی ثبت نشده باشه، مقدار این متغیر برابر nil خواهد بود.



توضیحات تکمیلی

بطور کلی روند پیاده‌سازی Apple Push Notification میشه اینجوری:

تنظیمات مورد نیاز توی خود پروژه

توی ایکس‌کد، توی قسمتی که تنظیمات کلی پروژه هست، میریم به قسمت Capabilities و گزینه‌های Push Notifications و گزینه Background Mode و گزینه Remote Notifications (از زیرگزینه‌های Background Mode) رو فعال می‌کنیم.


پیکربندی کتابخانه برای استفاده

اول از همه کتابخانه رو import کنین:

import IDPush

بعد توی پروژه‌تون با استفاده از کد زیر، کتابخانه رو با projectID دریافتی‌تون، پیکربندی می‌کنین.

IDPush.Setup(projectID: "abcd...")

پیکربندی نرم‌افزار با استفاده از API سیستم عامل iOS

توی اپ، باید به سیستم عامل بگین که اپ می‌خواد از قابلیت Push Notification استفاده کنه، و امور مربوط به این روند رو انجام بدین.

معمولا روند اینه که توی فایل AppDelegate این روند رو قرار میدن، تا کارای مورد نیاز، در زمان باز شدن اپ انجام بشه.

قطعه کد زیر، کدهای مربوط به ثبت دستگاه برای دریافت شناسه یکتا برای APNS، و نیز ثبت نرم‌افزار برای نمایش این اعلان‌ها به کاربر است. برای این کار ابتدا از کاربر برای نمایش اعلان اجازه گرفته میشه، و بعد نمایش اعلان‌ها براساس اجازه کاربر نمایشه داده خواهد شد (یا نخواهد شد).

application.registerForRemoteNotifications()
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (_, _) in
    print("Permission granted: \(granted)")
}

کدی که بالا نوشته شده، برای نسخه ۱۰ به بعد iOS هست. از نسخه ۱۰، یه فریم‌ورک جدید معرفی و اضافه شده که باید از اون استفاده بشه. پس این رو هم فراموش نکنین:

import UserNotifications

⚠️ توجه داشته باشین ⚠️

اگه اپ شما برای نسخه‌های قبل از ۱۰ هست، کدها متفاوت خواهند بود. توی اینترنت با یه سرچ کوچک، می‌تونین کدهای مورد نیاز برای نسخه‌های قدیمی آی‌او‌اس رو هم پیدا کنین.


دریافت شناسه دستگاه و استفاده از اون

یه متدی توی UIApplicationDelegate هست که برای این کار در نظر گرفته شده و مورد استفاده قرار می‌گیره:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let tokenChars = (deviceToken as NSData).bytes.bindMemory(to: CChar.self, capacity: deviceToken.count)
    var tokenString = ""
    for i in 0..<deviceToken.count {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }
    print("APNs Token:", tokenString)

    IDPush.Perform(action: .addDevice(token: tokenString)) { (error, data) in
        if let error = error {
            print("IDPush.AddDevice: Error: \(error.description)")
            return
        }

        guard let playerID = IDPush.GetPlayerID() else { return }
        print("IDPush.AddDevice: Done: \(playerID)")
    }
}

توی این قطعه کد، شناسه که توسط این متد در اختیار ما قرار گرفت، با استفاده از IDPush و اکشن addDevice(token: String) این شناسه رو ثبت می‌کنیم. اگه توی Closure ادامه‌اش، خطایی رخ نداده باشه، playerID وان‌سیگنالی این دستگاه از طریق اون guard let ... else { ... } قابل بررسی و دریافت خواهد بود.


تمام

😎✋