如何在iOS中获取唯一的设备ID

时间:2016-09-01 07:26:31

标签: ios objective-c swift deviceid

我正在使用推送通知功能的iOS应用程序我需要将iOS设备的唯一设备ID发送到服务器,在android安全和每个设备的ID中获取,有没有办法获得iOS的唯一设备ID。 我找到了一些答案供应商ID和广告ID是唯一的

code:
Secure.getString(getContext().getContentResolver(),Secure.ANDROID_ID); 

7 个答案:

答案 0 :(得分:4)

要获取 UUID ,您可以使用此代码

UIDevice *currentDevice = [UIDevice currentDevice];
NSString *deviceId = [[currentDevice identifierForVendor] UUIDString];

但是对于推送通知,您需要设备令牌,它将在用户接受权限后创建,UIApplication委托方法将调用

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

答案 1 :(得分:2)

在您的应用中逐步整合 APNS ,您可以获得here

中的步骤
  

iOS9 Apple表示,每次安装应用程序时,设备令牌都可能会更改。因此,最好的方法是在每次启动上重新注册设备令牌。

<强>步骤1

  

注册推送通知有两个步骤。首先,您必须获得用户的许可才能显示任何类型的通知,之后您可以注册远程通知。如果一切顺利,系统将为您提供设备令牌,您可以将其视为此设备的“地址”。

     

此方法创建UIUserNotificationSettings的实例,并将其传递给registerUserNotificationSettings(_ :)。   UIUserNotificationSettings存储应用将使用的通知类型的设置。对于UIUserNotificationTypes,您可以使用以下任意组合:

  1. .Badge允许该应用在应用图标的角落显示一个数字。

  2. .Sound允许应用播放声音。

  3. .Alert允许该应用显示文字。

  4.   

    您当前传递的UIUserNotificationCategor的集合为nil,允许您指定应用可以处理的不同类别的通知。当您想要实现可操作的通知时,这将是必要的,稍后将使用

    - (void)applicationDidFinishLaunching:(UIApplication *)app {
     // other setup tasks here....
    
    // Register the supported interaction types.
    UIUserNotificationType types = UIUserNotificationTypeBadge |
                 UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    UIUserNotificationSettings *mySettings =
                [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
    
    // Register for remote notifications.
    [[UIApplication sharedApplication] registerForRemoteNotifications];
    }
    
      

    构建并运行。当应用程序启动时,您应该收到一个提示,要求获得向您发送通知的权限:

    enter image description here

    点击确定并噗!该应用现在可以显示通知。

    - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
    {
        if (notificationSettings.types != UIUserNotificationTypeNone) {
            //register to receive notifications
            [application registerForRemoteNotifications];
        } 
    }
    
      

    在这里,您首先要检查用户是否已授予您任何通知权限;如果有,则直接调用registerForRemoteNotifications()。   同样,调用UIApplicationDelegate中的方法来通知registerForRemoteNotifications()的状态。

    // Handle remote notification registration.
    - (void)application:(UIApplication *)app
        didRegisterForRemoteNotificationsWithDeviceToken:(NSData  *)devToken {
    const void *devTokenBytes = [devToken bytes];
    self.registered = YES;
     // send your Device Token to server
    }
    
      

    顾名思义,系统在注册成功时调用application(:didRegisterForRemoteNotificationsWithDeviceToken :),否则调用application(:didFailToRegisterForRemoteNotificationsWithError :)。

    - (void)application:(UIApplication *)app
        didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
    NSLog(@"Error in registration. Error: %@", err);
    }
    

    <强>夫特

     let defaults = NSUserDefaults.standardUserDefaults()
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
    
        // PUSH NOTIFICATION
        let deviceToken = defaults.objectForKey(UserDefaultsContracts.KEY_DEVICE_TOKEN) as String?
    
        if (deviceToken == nil) {
            print("There is no deviceToken saved yet.")
            var types: UIUserNotificationType = UIUserNotificationType.Badge |
                UIUserNotificationType.Alert |
                UIUserNotificationType.Sound
    
            var settings: UIUserNotificationSettings = UIUserNotificationSettings( forTypes: types, categories: nil )
    
            application.registerUserNotificationSettings( settings )
            application.registerForRemoteNotifications()
        }
    
        return true
    }
    
    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!) {
        print("Got token data! (deviceToken)")
        var characterSet: NSCharacterSet = NSCharacterSet( charactersInString: "<>" )
    
        var deviceTokenString: String = ( deviceToken.description as NSString )
            .stringByTrimmingCharactersInSet( characterSet )
            .stringByReplacingOccurrencesOfString( " ", withString: "" ) as String
    
        print( deviceTokenString )
    
        defaults.setObject(deviceTokenString, forKey: UserDefaultsContracts.KEY_DEVICE_TOKEN)
    }
    
    func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError!) {
        print("Couldn’t register: (error)")
    }
    }
    

    了解您在Apple Documents

    中获得的更多信息

答案 2 :(得分:2)

没有合法的方法来唯一标识iOS设备。周期。

您只能获得折衷解决方案:IDFA,供应商ID或APNS设备令牌。 上述每个ID都可以在设备生命周期内更改,因此不能用作唯一的设备标识符。

答案 3 :(得分:0)

根据Apple Documentation

  

设备令牌可以更改,因此您的应用每次都需要重新注册   它被启动并将收到的令牌传递回您的服务器。如果你   无法更新设备令牌,远程通知可能无法更新   他们的方式到用户的设备。设备令牌总是在更改时更改   用户将备份数据还原到新设备或计算机或重新安装   操作系统。将数据迁移到新设备或计算机时   用户必须先启动您的应用,然后才能进行远程通知   送到那台设备。

     

永远不要缓存设备令牌;总是从系统中获取令牌   无论什么时候需要它。如果您的应用之前已注册为远程   通知,再次调用registerForRemoteNotifications方法   不会产生任何额外开销,iOS会返回现有的开销   设备令牌立即到您的应用委托。另外,iOS调用   您的委托方法,只要设备令牌发生变化,而不仅仅是   回复您的应用注册或重新注册。

所以最好的方法是在每次发布时重新注册令牌。为此,您可以在registerForPushNotifications(application)方法中调用applicationDidFinishLaunching()

上述方法的委托方法为didRegisterForRemoteNotificationsWithDeviceTokendeviceToken可以将func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { let tokenChars = UnsafePointer<CChar>(deviceToken.bytes) var tokenString = "" for i in 0..<deviceToken.length { tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]]) } print("Device Token:", tokenString) } 发送给服务器。

Sub autosave()

'SAVE FILE
    Application.EnableEvents = False
    rtn = Application.Dialogs(xlDialogSaveAs).Show(arg1:=ThisWorkbook.Sheets("PO Calculator").Range("B15").Value)
    Application.EnableEvents = True
    If Not rtn Then Cancel = True


'no file name
'Application.Dialogs(xlDialogSaveAs).Show


End Sub

答案 4 :(得分:0)

对于Objectice-C:

let device_id = UIDevice.currentDevice().identifierForVendor?.UUIDString

对于Swift:

{{1}}

答案 5 :(得分:0)

你应该接收

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    var deviceTokenStr = String(format: "%@", deviceToken)
    deviceTokenStr = deviceTokenStr.stringByReplacingOccurrencesOfString("<", withString: "")
    deviceTokenStr = deviceTokenStr.stringByReplacingOccurrencesOfString(">", withString: "")
    deviceTokenStr = deviceTokenStr.stringByReplacingOccurrencesOfString(" ", withString: "")
}

或者,如果您想获得唯一的设备ID,可以使用

let UUID = NSUUID().UUIDString

答案 6 :(得分:0)

就像我在我的应用程序中所做的那样,你可以使用第一个生成的uuid并将其保存在Keychain文件中,以将其用作唯一的设备ID(因为uuid在每次运行时都会更改为你的应用程序和设备令牌)所以你可以保存一个uuid或你在钥匙串中生成的任何自定义ID,即使用户卸载也会永久保留,并且多次安装应用程序