Получение токена устройства iOS для уведомлений о sh в RubyMotion - PullRequest
0 голосов
/ 07 мая 2020

Мне нужен токен устройства пользователя в виде шестнадцатеричной строки для отправки уведомлений pu sh. Раньше я делал это с помощью описания deviceToken, но в iOS13 это больше не работает. Я нашел несколько решений для этого в Objective- C и Swift.

Как мне преобразовать токен моего устройства (NSData) в NSString?

Проблема в том, что deviceToken.bytes возвращает Pointer в RubyMotion. И вызов bytes[index] даст другой результат по сравнению с выполнением в Objective- C. Я пробовал много разных вещей, но у меня не получается заставить их работать. Документы RubyMotion о указателях также являются скудными, так что это не помогает. Я обнаружил следующее относительно указателей на SO:

Обработка указателей с помощью RubyMotion

В нем говорится, что я должен сделать bytes + index вместо bytes[index]. В настоящее время у меня есть следующий код:

def application(application, didRegisterForRemoteNotificationsWithDeviceToken: device_token)
  string = token_to_string(device_token)
end

def token_to_string(device_token)
  data_length = device_token.length
  if data_length == 0
    nil
  else
    data_buffer = device_token.bytes
    token = NSMutableString.stringWithCapacity(data_length * 2)

    index = 0
    begin
      buffer = data_buffer + index
      token.appendFormat('%02.2hhx', buffer)
      index += 1
    end while index < data_length

    token.copy
  end
end

Он не дает никаких ошибок, но сгенерированный токен устройства кажется неправильным. Будем признательны за любые советы!

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Я пытался придумать чистое решение RubyMotion, но я просто недостаточно понимаю «указатели», чтобы заставить его работать. Итак, я пошел другим путем: расширил класс NSData.

1) Создайте папку vendor / NSData + Hex внутри вашего проекта.

2) Создайте файл NSData + Hex.h внутри папки и поместите это внутрь:

#import <Foundation/Foundation.h>

@interface NSData (Hex)

@property (nonatomic, copy, readonly) NSString *hexString;

@end

3) Теперь создайте NSData + Hex.m в той же папке и поместите это в файл:

#import "NSData+Hex.h"

@implementation NSData (Hex)

- (NSString *) hexString
{
  NSUInteger len = self.length;
  if (len == 0) {
    return nil;
  }
  const unsigned char *buffer = self.bytes;
  NSMutableString *hexString  = [NSMutableString stringWithCapacity:(len * 2)];
  for (int i = 0; i < len; ++i) {
    [hexString appendFormat:@"%02x", buffer[i]];
  }
  return [hexString copy];
}

@end

4) Добавьте это в ваш Rakefile:

app.vendor_project('vendor/NSData+Hex', :static)

5) Теперь вы можете просто позвонить deviceToken.hexString в def application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken).

Если кто-то может придумать решение на чистом RubyMotion, не стесняйтесь отвечать. На данный момент, по крайней мере, работает. :)

0 голосов
/ 07 мая 2020

Привет, я использую следующее для преобразования NSData в NSString, которым затем можно управлять в ruby.

class NSData
  def to_s
    NSString.alloc.initWithBytes(bytes, length: length, encoding: NSUTF8StringEncoding)
  end
end
...