آقا وانسیگنال زد تحریممون کرد!! طوریکه وصل نمیشه تا 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...")
توی اپ، باید به سیستم عامل بگین که اپ میخواد از قابلیت 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 { ... }
قابل بررسی و دریافت خواهد بود.
😎✋