2013-02-23 71 views
3

MonoTouch有一個簡單的機制來檢索iOS設備的設備序列號(非UDID)嗎?有沒有我可以用來獲得這個的第三方庫?使用MonoTouch檢索iOS設備的設備序列號的最簡單方法是什麼?

萬一它很重要,我打算在內部應用程序中使用此功能,而不關心App Store審批流程。

+0

[你如何以編程方式獲取iPhone的序列號?](http://stackoverflow.com/questions/756101/how-do-you-programmatically-get-the-serial-number-of -an-iphone) – 2013-02-23 02:52:41

+0

同時http://stackoverflow.com/questions/7147416/if-i-access-the-iphone-serial-number-inside-an-app-is-it-allowed-in-the-app -sto – 2013-02-23 02:52:55

+0

我正在尋找一種基於MonoTouch的解決方案,並認爲應該有一種更簡單的方法來實現這一點,而不是編寫和綁定本地iOS庫以獲得單一功能。 – OpenAway 2013-02-23 03:11:19

回答

8

更新:從iOS 8,我們無法檢索我們的iDevice的序列號。

從MonoTouch的檢索iPhone序列號,您可以使用此工藝:

  1. 創建在Xcode靜態庫。一個有一個函數來獲取序列號
  2. 在MonoDevelop中,創建綁定項目將您的.a庫綁定到C#類/函數(http://docs.xamarin.com/guides/ios/advanced_topics/binding_objective-c_libraries
  3. 在您的應用程序中,您可以調用該綁定庫(在步驟2中)。

對於細節:

STEP 1.我library.a,我有一個類DeviceInfo,這裏是實現獲得序列號

#import "DeviceInfo.h" 

#import <dlfcn.h> 
#import <mach/port.h> 
#import <mach/kern_return.h> 
@implementation DeviceInfo 

- (NSString *) serialNumber 
{ 
    NSString *serialNumber = nil; 

    void *IOKit = dlopen("/System/Library/Frameworks/IOKit.framework/IOKit", RTLD_NOW); 
    if (IOKit) 
    { 
     mach_port_t *kIOMasterPortDefault = dlsym(IOKit, "kIOMasterPortDefault"); 
     CFMutableDictionaryRef (*IOServiceMatching)(const char *name) = dlsym(IOKit, "IOServiceMatching"); 
     mach_port_t (*IOServiceGetMatchingService)(mach_port_t masterPort, CFDictionaryRef matching) = dlsym(IOKit, "IOServiceGetMatchingService"); 
     CFTypeRef (*IORegistryEntryCreateCFProperty)(mach_port_t entry, CFStringRef key, CFAllocatorRef allocator, uint32_t options) = dlsym(IOKit, "IORegistryEntryCreateCFProperty"); 
     kern_return_t (*IOObjectRelease)(mach_port_t object) = dlsym(IOKit, "IOObjectRelease"); 

     if (kIOMasterPortDefault && IOServiceGetMatchingService && IORegistryEntryCreateCFProperty && IOObjectRelease) 
     { 
      mach_port_t platformExpertDevice = IOServiceGetMatchingService(*kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")); 
      if (platformExpertDevice) 
      { 
       CFTypeRef platformSerialNumber = IORegistryEntryCreateCFProperty(platformExpertDevice, CFSTR("IOPlatformSerialNumber"), kCFAllocatorDefault, 0); 
       if (CFGetTypeID(platformSerialNumber) == CFStringGetTypeID()) 
       { 
        serialNumber = [NSString stringWithString:(__bridge NSString*)platformSerialNumber]; 
        CFRelease(platformSerialNumber); 
       } 
       IOObjectRelease(platformExpertDevice); 
      } 
     } 
     dlclose(IOKit); 
    } 

    return serialNumber; 
} 

@end 

第2步。在Monotouch中我的Binding Library項目的ApiDefinition.cs中添加了以下綁定:

[BaseType (typeof (NSObject))] 
    public interface DeviceInfo { 
     [Export ("serialNumber")] 
     NSString GetSerialNumber(); 
    } 

步驟3.在我的應用程序中,我在步驟2中導入參考到綁定庫項目,然後使用MyBindingProject添加

;

...

string serialNumber = ""; 
      try { 
       DeviceInfo nativeDeviceInfo = new DeviceInfo(); 
       NSString temp = nativeDeviceInfo.GetSerialNumber(); 
       serialNumber = temp.ToString(); 
      } catch (Exception ex) { 
       Console.WriteLine("Cannot get serial number {0} - {1}",ex.Message, ex.StackTrace); 
      } 

希望有所幫助。如果您有任何問題,請不要猶豫。

+0

我試了一下代碼,並且適用於iOS7_beta。 Bt,我不確定是否會在不久的將來棄用它,或者IOKit.Framework的可訪問性會受到影響? 如果您能找到,請回復有效的鏈接。 – Meet 2013-08-14 06:49:32

+0

作爲更新,這似乎仍然在IOS7中工作。 – OpenAway 2013-10-26 22:21:47

+3

謝謝,我試過,但它在iOS 8 beta 5崩潰....任何其他好的方法,爲iOS 7和iOS 8?請告知 – Meet 2014-08-13 06:34:02

相關問題