当前位置: > > > Swift - JPush极光推送的使用3(根据Alias别名,给某个指定用户发推送)

Swift - JPush极光推送的使用3(根据Alias别名,给某个指定用户发推送)

一、别名(alias)介绍
(1)我们可以给每一个安装了应用程序的用户,取不同别名来标识(比如可以使用用户账号的 userid 来作为别名)。
(2)以后给某个特定用户推送消息时,就可以用此别名来指定。
(3)每个用户只能指定一个别名。所以同一个设备,新设置的别名会覆盖旧的。
(4)如果要删除已有的别名,只要将别名设置为空字符串即可。
(5)系统不限定一个别名只能指定一个用户。如果一个别名被指定到了多个用户,当给指定这个别名发消息时,服务器端API会同时给这多个用户发送消息。

二、别名使用要求
(1)有效的别名组成:字母(区分大小写)、数字、下划线、汉字。
(2)限制:alias 命名长度限制为 40 字节。(判断长度需采用 UTF-8 编码)

三、别名使用的样例说明
下面是一个给指定用户发送消息的样例。
1,iOS客户端界面
客户端在启动后,我们可以在输入框中填写 alias 别名,点击“注册别名”按钮后,便调用 API 将该设备与这个别名关联起来。
注意:这么做只是为了演示而已,实际项目中应该是 App 在后台就自动去注册别名(比如在登录成功后),而不是由用户去干预。
               
2,服务端界面
我们输入别名、消息文本,点击“推送”按钮后,即可给指定的用户发送消息。


3,客户端显示效果
可以看到使用该别名的设备能收到消息,而其他的设备是收不到的。

四、完整代码
1,客户端代码
(1)AppDelegate.swift(这个同之前文章里的一样,没有改变。本文代码已升级至 Swfit3
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions
                        launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
      
        //通知类型(这里将声音、消息、提醒角标都给加上)
        let userSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound],
                                                      categories: nil)
        if ((UIDevice.current.systemVersion as NSString).floatValue >= 8.0) {
            //可以添加自定义categories
            JPUSHService.register(forRemoteNotificationTypes: userSettings.types.rawValue,
                                                            categories: nil)
        }
        else {
            //categories 必须为nil
            JPUSHService.register(forRemoteNotificationTypes: userSettings.types.rawValue,
                                                            categories: nil)
        }
        
        // 启动JPushSDK
        JPUSHService.setup(withOption: nil, appKey: "7b96331738ea713195698fd",
                                     channel: "Publish Channel", apsForProduction: false)

        return true
    }
 
    
    func application(_ application: UIApplication,
                     didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        //注册 DeviceToken
        JPUSHService.registerDeviceToken(deviceToken)
    }
    
    func application(_ application: UIApplication,
                     didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                     fetchCompletionHandler
                        completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        //增加IOS 7的支持
        JPUSHService.handleRemoteNotification(userInfo)
        completionHandler(UIBackgroundFetchResult.newData)
    }
    
    func application(_ application: UIApplication,
                     didFailToRegisterForRemoteNotificationsWithError error: Error) {
        //可选
        NSLog("did Fail To Register For Remote Notifications With Error: \(error)")
    }
    
    //..........
}

(2)ViewController.swift(别名注册相关)
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    //按钮点击
    @IBAction func btnTouchUp(_ sender: AnyObject) {
        //获取别名
        let alias = textField.text
        //注册别名
        JPUSHService.setAlias(alias,
                              callbackSelector: #selector(tagsAliasCallBack(resCode:tags:alias:)),
                              object: self)
    }
    
    //别名注册回调
    func tagsAliasCallBack(resCode:CInt, tags:NSSet, alias:NSString) {
        textView.text = "响应结果:\(resCode)"
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

2,服务端代码(index.php)
<?
//引入代码
require 'JPush/autoload.php';

use JPush\Client as JPush;

if(isset($_POST["message"])){
  //初始化
  $app_key = "7b528338438ec719495768fd";
  $master_secret = "32da4a2c06d27b26d12c5628";
  $client = new JPush($app_key, $master_secret);

  //简单的推送样例
  $result = $client->push()
      ->setPlatform('ios', 'android')
      ->addAlias($_POST["alias"])
      ->setNotificationAlert($_POST["message"])
      ->options(array(
          "apns_production" => true  //true表示发送到生产环境(默认值),false为开发环境
        ))
      ->send();

  echo 'Result=' . json_encode($result);
}
?>
<html>
  <head>
  </head>
  <body>
    <form action="index.php" method="post">
      别名:<input type="text" name="alias"/><br>
      消息:<input type="text" name="message"/>
      <button type="submit">推送广播通知</button>
    </form>
  </body>
</html>

评论4
  • 4楼
    2017-10-22 16:05
    LB

    大神,有java后台的吗?或者说java的后台该怎么写啊?

    站长回复

    Java后台可以去jpush官网上看看,上面有Java SDK的详细使用说明。

  • 3楼
    2017-05-04 16:45
    nick

    请问一下 你的 textView是做什么的?

    站长回复

    用来显示调用接口后的响应结果。

  • 2楼
    2017-03-07 12:04
    nimo

    能不能客户端实现对极光服务器的推送请求?

    站长回复

    当然可以,极光提供了REST API供我们调用,你可以上他们的网站上看看。

  • 1楼
    2016-07-14 11:11
    dejhbflf

    航哥,我试过后发现,为啥
    //别名注册回调
    func tagsAliasCallBack(resCode:CInt, tags:NSSet, alias:NSString) {
    textView.text = "响应结果:\(resCode)"
    }
    这个不会执行啊?

    站长回复

    这个我也不太清楚你那边是什么问题。你再检查下appKey是不是正确,还有证书是不是正确。