Swift的OneSignal助手
OneSignal对我们实施了禁令,使得无法连接以获取PlayerID。因此,我们必须独自实现设备注册到OneSignal以及其他操作的管理。
☝️ 之前
OneSignal的常规流程是这样的(现在也是):
- OneSignal向手机发出请求,要求使用APNs,并给我提供设备的标识符(即Device Token)。
- 设备向用户展示合适的消息,并获得他们的授权。然后告诉苹果,请为该设备注册并给我一个标识符。最终,当它获取到标识符后,将其交付给OneSignal客户端。
- OneSignal客户端在收到设备标识符后,将它及其他一些信息发送到OneSignal服务器(当然,还包括一些其他信息),在本地数据库中为该设备注册一个条目,并为该设备生成一个唯一的标识符。请注意,新标识符是特定于OneSignal的,不会在其他地方使用。
- 设备注册完成后,OneSignal服务器将其创建的OneSignal设备标识符以响应形式发送给客户端。
- 现在OneSignal客户端知道它的标识符在OneSignal服务器中是什么。当然,它会将这些信息提供给您,以便您可以进行操作。
👇 现在
现在,由于OneSignal向我们实施了禁令,伊朗的OneSignal客户端和服务器之间的通信无法建立。因此,OneSignal服务器无法知道设备的存在,从而无法为设备生成标识符。因此,我们无法使用OneSignal发送通知给用户;既不能发送普通通知,也不能发送私人通知。
🤔
那我们现在怎么办?我们必须填补OneSignal客户端和服务器之间的空白。这就是在它们之间建立一个框架,接收客户端的请求,并将其传递给OneSignal服务器。这日子是怎么过的呀?!...
使用说明
ardiyoosh 上创建项目并获取项目ID
在开始使用本库的第一步是,在 ardiyoosh 系统上创建项目并获取 projectID
。
安装并将其添加到项目中
您可以使用 CocoaPod 很容易地将此库添加到您的项目中。
pod 'IDPush'
之后在您的代码中,为了使用它,请按如下方式进行 import
:
import IDPush
配置
为了进行配置,您首先需要在我们的网站上注册,创建一个项目并添加所需的信息。之后系统会为您提供一个 projectID
。现在您可以在 iOS 应用程序中使用这个 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 的实施过程如下。
在项目中需要的设置
在 Xcode 中,在项目整体设置部分,我们进入 Capabilities,然后选择 Push Notifications,Background Mode,并从 Background Mode 的子选项中选择 Remote Notifications。
配置库以供使用
首先,导入库。
import IDPush
然后,在您的项目中,使用以下代码配置库和您的 projectID
。
IDPush.Setup(projectID: "abcd...")
使用 iOS 系统 API 配置软件
在应用程序中,您需要告诉系统应用程序需要使用 Push Notification 功能,并执行相关的操作。
通常,这一过程在 AppDelegate
文件中完成,以便在应用程序打开时执行所需的工作。
下面的代码块包含用于注册设备以获取用于APNS的唯一标识符的代码,以及用于向用户展示通知的软件注册代码。为此,系统首先请求用户展示通知的权限,然后根据用户的权限展示或隐藏通知。
application.registerForRemoteNotifications()
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (_, _) in
print("Permission granted: \(granted)")
}
上述代码适用于iOS 10及以上版本。从iOS 10开始,引入并添加了一个新的框架,必须使用它。所以不要忘记这一点。
import UserNotifications
⚠️ 请注意⚠️
如果您的应用程序针对iOS 10以下的版本,代码会有所不同。您可以通过互联网进行简单搜索来找到适用于旧版iOS的所需代码。
获取设备标识符并使用它
在 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
继续执行没有发生错误,那么可以使用 guard let ... else { ... }
来检查和接收该设备的 playerID
和单点加密信号。