iOS开发-获取设备信息和应用信息

目录

  1. UIDevice
    1. 设备相关信息
    2. 设备电量
    3. 近距离传感器
    4. 设备性能、界面模式
  2. NSBundle
    1. 获取应用名称
    2. 应用短版本号
    3. 应用Build版本号
    4. 应用identifier
  3. NSLocale
    1. 创建本地化对象
    2. 获取系统本地化信息
    3. 获取本地标识信息和语言码信息
    4. 获取当前语言的排版方向和字符方向
    5. 获取用户的语言偏好设置列表
    6. 监听用户本地化设置的消息
    7. 以本地化方式获取国际化信息的显示名称

UIDevice

UIDevice提供了多种属性、类函数及状态通知,帮助我们全方位了解设备状况。从检测电池电量到定位设备与临近感应,UIDevice所做的工作就是为应用程序提供用户及设备的一些信息UIDevice的属性如下:

  • 设备相关信息
// 手机中关于本机中设置的名称  @"My iPhone" 
@property(nonatomic,readonly,strong) NSString    *name;     
// 设备模式  @"iPhone", @"iPod touch",@"iPad"      
@property(nonatomic,readonly,strong) NSString    *model;
// 本地设备模式,返回值与model相同,暂不清楚两者区别
@property(nonatomic,readonly,strong) NSString    *localizedModel;
// 系统名字  @"iOS"
@property(nonatomic,readonly,strong) NSString    *systemName;
// 系统版本号  @"10.2.1"
@property(nonatomic,readonly,strong) NSString    *systemVersion;
// 获取设备唯一标识,同一个开发商的APP获取到的标识是相同的
// 与UDID不同的是,在我们删除了设备上,同一个开发商的所有APP之后,下次获取到的将是不同的标识
@property(nullable, nonatomic,readonly,strong) NSUUID      *identifierForVendor NS_AVAILABLE_IOS(6_0);
// 设备方向. UIDeviceOrientation是一个枚举
typedef NS_ENUM(NSInteger, UIDeviceOrientation) {
    UIDeviceOrientationUnknown,             // 未知
    UIDeviceOrientationPortrait,            // 竖屏,home键在下方
    UIDeviceOrientationPortraitUpsideDown,  // 竖屏,home键在上方
    UIDeviceOrientationLandscapeLeft,       // 横屏,home键在右方
    UIDeviceOrientationLandscapeRight,      // 横屏,home键在左方
    UIDeviceOrientationFaceUp,              // 平放,屏幕朝上
    UIDeviceOrientationFaceDown             // 平放,屏幕朝下
} __TVOS_PROHIBITED;
@property(nonatomic,readonly) UIDeviceOrientation orientation __TVOS_PROHIBITED;

获取设备方向

UIDevice *device = [UIDevice currentDevice];
// 判断设备是否生成设备转向通知
BOOL generatesDeviceOrientationNotifications = device.isGeneratingDeviceOrientationNotifications;
// 开启设备转向通知
// 通过调用该方法通知设备:如果用户改变了设备的朝向,我们想获悉这一点
// 在注册设备方向通知时,需要先调用该方法
[device beginGeneratingDeviceOrientationNotifications];
// 注册屏幕方向变化通知
[[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(deviceOrientationDidChanged:) 
                                                 name:@"UIDeviceOrientationDidChangeNotification"
                                               object:nil];
// 获取设备方向
UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
// 停止设备转向通知
// 在移除设备方向通知后,需要调用该方法
[device endGeneratingDeviceOrientationNotifications];

获取设备硬件类型,有三种方法,如下:
1)这种是在较高层次获取设备类型,返回的是 iPhone , iPod , iPad 。适合要求不高的。

NSString *deviceType = [[UIDevice currentDevice] model];

2)这是Linux中获取设备类型的方法,主要是C语言的方法,注意引入头文件#include <sys/sysctl.h>。输入底层获取设备类型的方法。

size_t size;
// 获取machine name的长度
sysctlbyname("hw.machine", NULL, &size, NULL, 0);
// 获取machine name
char *machine = malloc(size);
sysctlbyname("hw.machine", machine, &size, NULL, 0);
// 设备硬件类型
NSString *platform = [NSString stringWithFormat:@"%s", machine];
free(machine);

3)这和2)一样,是Linux中获取设备类型的方法,主要是C语言的方法,注意引入头文件#import "sys/utsname.h"。输入底层获取设备类型的方法。

struct utsname systemInfo;
uname(&systemInfo);
// 设备硬件类型
NSString *platform = [NSString stringWithFormat:@"%s", systemInfo.machine];

以上2),3)方法中返回的platform(设备硬件类型)的对应关系如下:
(官方参数表链接:https://www.theiphonewiki.com/wiki/Models

// Simulator
@"i386":@"Simulator",
@"x86_64":@"Simulator",

// iPhone
@"iPhone1,1":@"iPhone 1",
@"iPhone1,2":@"iPhone 3",
@"iPhone2,1":@"iPhone 3S",
@"iPhone3,1" || @"iPhone3,2" || @"iPhone3,3":@"iPhone 4",
@"iPhone4,1":@"iPhone 4S",
@"iPhone5,1":@"iPhone 5",
@"iPhone5,2":@"iPhone 5",         // iPhone 5 (GSM+CDMA)
@"iPhone5,3":@"iPhone 5C",      // iPhone 5c (GSM)
@"iPhone5,4":@"iPhone 5C",      // iPhone 5c (GSM+CDMA)
@"iPhone6,1":@"iPhone 5S",       // iPhone 5s (GSM)
@"iPhone6,2":@"iPhone 5S",      // iPhone 5s (GSM+CDMA)
@"iPhone7,1":@"iPhone 6 Plus",
@"iPhone7,2":@"iPhone 6",
@"iPhone8,1":@"iPhone 6s",
@"iPhone8,2":@"iPhone 6s Plus",
@"iPhone8,3" || @"iPhone8,4":@"iPhone SE",
@"iPhone9,1":@"iPhone 7",       // 国行、日版、港行iPhone 7
@"iPhone9,3":@"iPhone 7",       // 美版、台版iPhone 7
@"iPhone9,2":@"iPhone 7 Plus",  // 港行、国行iPhone 7 Plus
@"iPhone9,4":@"iPhone 7 Plus",  // 美版、台版iPhone 7 Plus
@"iPhone10,1":@"iPhone 8",         // 国行(A1863)、日行(A1906)iPhone 8
@"iPhone10,4":@"iPhone 8",        // 美版(Global/A1905)iPhone 8
@"iPhone10,2":@"iPhone 8 Plus",  // 国行(A1864)、日行(A1898)iPhone 8 Plus
@"iPhone10,5":@"iPhone 8 Plus",  // 美版(Global/A1897)iPhone 8 Plus
@"iPhone10,3":@"iPhone X",          // 国行(A1865)、日行(A1902)iPhone X
@"iPhone10,6":@"iPhone X",          // 美版(Global/A1901)iPhone X  
@"iPhone11,2":@"iPhone XS", 
@"iPhone11,4":@"iPhone XS Max",  // 国行iPhone XS Max
@"iPhone11,6":@"iPhone XS Max",  // 美版iPhone XS Max
@"iPhone11,8":@"iPhone XR",  
@"iPhone12,1":@"iPhone 11",
@"iPhone12,3":@"iPhone 11 Pro",
@"iPhone12,5":@"iPhone 11 Pro Max", 
@"iPhone12,8":@"iPhone SE 2",
@"iPhone13,1":@"iPhone 12 mini", 
@"iPhone13,2":@"iPhone 12", 
@"iPhone13,3":@"iPhone 12 Pro",
@"iPhone13,4":@"iPhone 12 Pro Max", 
@"iPhone14,2":@"iPhone 13 Pro",
@"iPhone14,3":@"iPhone 13 Pro Max", 
@"iPhone14,4":@"iPhone 13 mini", 
@"iPhone14,5":@"iPhone 13",
@"iPhone14,6":@"iPhone SE 3", 
@"iPhone14,7":@"iPhone 14", 
@"iPhone14,8":@"iPhone 14 Plus",
@"iPhone15,2":@"iPhone 14 Pro", 
@"iPhone15,3":@"iPhone 14 Pro Max",

// iPod Touch
@"iPod1,1":@"iPod Touch 1G",
@"iPod2,1":@"iPod Touch 2G",
@"iPod3,1":@"iPod Touch 3G",
@"iPod4,1":@"iPod Touch 4G",
@"iPod5,1":@"iPod Touch (5 Gen)",
@"iPod7,1":@"iPod Touch 6",

// iPad
@"iPad1,1":@"iPad 1",
@"iPad1,2":@"iPad 3G",
@"iPad2,1":@"iPad 2",        // iPad 2 (WiFi)
@"iPad2,2" || @"iPad2,4" : @"iPad 2",
@"iPad2,3":@"iPad 2",        // iPad 2 (CDMA)
@"iPad2,5":@"iPad Mini 1",   // iPad Mini (WiFi)
@"iPad2,6":@"iPad Mini 1",
@"iPad2,7":@"iPad Mini 1",   // iPad Mini (GSM+CDMA)
@"iPad3,1":@"iPad 3",        // iPad 3 (WiFi)
@"iPad3,2":@"iPad 3",        // iPad 3 (GSM+CDMA)
@"iPad3,3":@"iPad 3",
@"iPad3,4":@"iPad 4",        // iPad 4 (WiFi)
@"iPad3,5":@"iPad 4",
@"iPad3,6":@"iPad 4",        // iPad 4 (GSM+CDMA)
@"iPad4,1":@"iPad air",      // iPad Air (WiFi)
@"iPad4,2":@"iPad air",      // iPad Air (Cellular)
@"iPad4,3":@"iPad air",
@"iPad4,4":@"iPad mini 2",   // iPad Mini 2 (WiFi)
@"iPad4,5":@"iPad mini 2",   // iPad Mini 2 (Cellular)
@"iPad4,6":@"iPad mini 2",
@"iPad4,7" || @"iPad4,8" || @"iPad4,9" : @"iPad mini 3",
@"iPad5,1":@"iPad mini 4",   // iPad Mini 4 (WiFi)
@"iPad5,2":@"iPad mini 4",   // iPad Mini 4 (LTE)
@"iPad5,3" || @"iPad5,4" : @"iPad air 2",
@"iPad6,3" || @"iPad6,4" : @"iPad Pro 9.7",
@"iPad6,7" || @"iPad6,8" : @"iPad Pro 12.9",
@"iPad6,11":@"iPad 5",        // iPad 5 (WiFi)
@"iPad6,12":@"iPad 5",        // iPad 5 (Cellular)
@"iPad7,1":@"iPad Pro 12.9 inch 2nd gen", // iPad Pro 12.9 inch 2nd gen (WiFi)
@"iPad7,2":@"iPad Pro 12.9 inch 2nd gen", // iPad Pro 12.9 inch 2nd gen (Cellular)
@"iPad7,3":@"iPad Pro 10.5 inch", // iPad Pro 10.5 inch (WiFi)
@"iPad7,4":@"iPad Pro 10.5 inch", // iPad Pro 10.5 inch (Cellular)
@"iPad7,5":@"iPad 6th gen", 
@"iPad7,6":@"iPad 6th gen",
@"iPad7,11":@"iPad 7th gen", 
@"iPad7,12":@"iPad 7th gen", 
@"iPad11,6":@"iPad 8th gen",
@"iPad11,7":@"iPad 8th gen", 
@"iPad12,1":@"iPad 9th gen", 
@"iPad12,2":@"iPad 9th gen",
@"iPad13,18":@"iPad 10th gen", 
@"iPad13,19":@"iPad 10th gen",
@"iPad11,3":@"iPad Air 3rd gen",
@"iPad11,4":@"iPad Air 3rd gen", 
@"iPad13,1":@"iPad Air 4th gen", 
@"iPad13,2":@"iPad Air 4th gen",
@"iPad13,16":@"iPad Air 5th gen", 
@"iPad13,17":@"iPad Air 5th gen", 
@"iPad8,1":@"iPad Pro 11 inch",
@"iPad8,2":@"iPad Pro 11 inch", 
@"iPad8,3":@"iPad Pro 11 inch", 
@"iPad8,4":@"iPad Pro 11 inch",
@"iPad8,5":@"iPad Pro 12.9 inch 3rd gen", 
@"iPad8,6":@"iPad Pro 12.9 inch 3rd gen",
@"iPad8,7":@"iPad Pro 12.9 inch 3rd gen", 
@"iPad8,8":@"iPad Pro 12.9 inch 3rd gen",
@"iPad8,9":@"iPad Pro 11 inch 2nd gen", 
@"iPad8,10":@"iPad Pro 11 inch 2nd gen",
@"iPad8,11":@"iPad Pro 12.9 inch 4th gen", 
@"iPad8,12":@"iPad Pro 12.9 inch 4th gen",
@"iPad13,4":@"iPad Pro 11 inch 3rd gen", 
@"iPad13,5":@"iPad Pro 11 inch 3rd gen",
@"iPad13,6":@"iPad Pro 11 inch 3rd gen", 
@"iPad13,7":@"iPad Pro 11 inch 3rd gen",
@"iPad13,8":@"iPad Pro 12.9 inch 5th gen", 
@"iPad13,9":@"iPad Pro 12.9 inch 5th gen",
@"iPad13,10":@"iPad Pro 12.9 inch 5th gen", 
@"iPad13,11":@"iPad Pro 12.9 inch 5th gen",
@"iPad11,1":@"iPad mini 5th gen", 
@"iPad11,2":@"iPad mini 5th gen",
@"iPad14,1":@"iPad mini 6th gen", 
@"iPad14,2":@"iPad mini 6th gen"

// AppleTV
@"AppleTV1,1":@"Apple TV 1",
@"AppleTV2,1":@"Apple TV 2",
@"AppleTV3,1":@"Apple TV 3", 
@"AppleTV3,2":@"Apple TV 3",
@"AppleTV5,3":@"Apple TV 4",
@"AppleTV6,2":@"Apple TV 4K",
  • 设备电量
// 通过UIDevice类,可以取得电池剩余量以及充电状态的信息,首先需要设置batteryMonitoringEnabled为YES  
@property(nonatomic,getter=isBatteryMonitoringEnabled) BOOL batteryMonitoringEnabled NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;// 默认为NO
// 电池状态, UIDeviceBatteryState是个枚举类型
typedef NS_ENUM(NSInteger, UIDeviceBatteryState) {
    UIDeviceBatteryStateUnknown,     // 无法取得充电状态情况
    UIDeviceBatteryStateUnplugged,   // 非充电状态
    UIDeviceBatteryStateCharging,    // 充电状态[电量小于100%]
    UIDeviceBatteryStateFull,        // 充满状态[连接充电器充满状态]
} __TVOS_PROHIBITED;               // available in iPhone 3.0
@property(nonatomic,readonly) UIDeviceBatteryState batteryState NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED; 
// 电池电量,取值范围为0.0-1.0,当电池状态为UIDeviceBatteryStateUnknown时为-1.0
@property(nonatomic,readonly) float batteryLevel NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;

监视设备电池状态、电池电量变化情况

// 判断设备是否开启电池监控
BOOL batteryMonitoringEnabled = device.isBatteryMonitoringEnabled;
// 开启电池监控
device.batteryMonitoringEnabled = YES;
// 注册电池状态变化通知
[[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(deviceBatteryStateDidChange) 
                                                 name:@"UIDeviceBatteryStateDidChangeNotification" 
                                               object:nil];
// 获取设备电池状态
UIDeviceBatteryState batteryState = device.batteryState;
// 注册电池电量变化通知
[[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(deviceBatteryLevelDidChange) 
                                                 name:@"UIDeviceBatteryLevelDidChangeNotification" 
                                               object:nil];
// 获取电池电量
float batteryLevel = device.batteryLevel; 
  • 近距离传感器
// 设备接近状态监控开关(判断设备是否开启接近状态监控)
@property(nonatomic,getter=isProximityMonitoringEnabled) BOOL proximityMonitoringEnabled NS_AVAILABLE_IOS(3_0);// 默认为NO
// 获取接近状态(如果设备不具备接近感应器,则总是返回NO)
// 传感器已启动前提条件下,如果用户接近近距离传感器,此时属性值为YES,并且屏幕已关闭(非休眠)。
@property(nonatomic,readonly) BOOL proximityState NS_AVAILABLE_IOS(3_0);

监控设备接近状态

// 判断设备是否开启接近状态监控
BOOL proximityMonitoringEnabled = device.isProximityMonitoringEnabled;
// 开启接近状态监控
device.proximityMonitoringEnabled = YES;
// 注册接近状态变化通知
[[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(deviceProximityStateDidChange) 
                                                 name:@"UIDeviceProximityStateDidChangeNotification" 
                                               object:nil];
// 获取接近状态
BOOL proximityState = device.proximityState;
  • 设备性能、界面模式
// 判断设备是否支持多任务
@property(nonatomic,readonly,getter=isMultitaskingSupported) BOOL multitaskingSupported NS_AVAILABLE_IOS(4_0);
// 获取用户界面模式
typedef NS_ENUM(NSInteger, UIUserInterfaceIdiom) {
    UIUserInterfaceIdiomUnspecified = -1,
    UIUserInterfaceIdiomPhone NS_ENUM_AVAILABLE_IOS(3_2),  // iPhone和iPod touch界面风格
    UIUserInterfaceIdiomPad NS_ENUM_AVAILABLE_IOS(3_2),    // iPad界面风格
    UIUserInterfaceIdiomTV NS_ENUM_AVAILABLE_IOS(9_0),     // Apple TV界面风格
    UIUserInterfaceIdiomCarPlay NS_ENUM_AVAILABLE_IOS(9_0),// CarPlay界面风格
};
@property(nonatomic,readonly) UIUserInterfaceIdiom userInterfaceIdiom NS_AVAILABLE_IOS(3_2); 

NSBundle

bundle是一个目录,其中包含了程序会使用到的资源. 这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in)。对应bundle,cocoa提供了类NSBundle。一个应用程序看上去和其他文件没有什么区别,但是实际上它是一个包含了nib文件,编译代码,以及其他资源的目录, 我们把这个目录叫做程序的main bundle(当前的可执行app在根目录下的绝对路径)。通过这个路径可以获取到应用的信息,例如应用名、版本号等。常用的信息如下:

  • 获取应用名称(显示在手机屏幕上的应用名字)。
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"]; 

在TARGETS下面的Info里面有以下几个属性

[这里创建一个名为CJDeviceInfo的工程为例]
// App安装到设备里的应用文件夹名(CJDeviceInfo)
Bundle Name - ${PRODUCT_NAME}
// 应用包名(com.circus.CJDeviceInfo)
Bundle Identifier - $(PRODUCT_BUNDLE_IDENTIFIER)
// 手机屏幕上的应用名字,默认为PRODUCT_NAME
Bundle Display Name - ${PRODUCT_NAME}
// 执行程序名,默认与PRODUCT_NAME一致
Executable File - ${EXECUTABLE_NAME}

想要修改显示在手机屏幕上的应用名字,可以直接修改info里的Bundle Display Name的值;但是如果要国际化应用名称,则需要创建InfoPlist.strings,步骤如下:
1)创建一个空文件,取名为InfoPlist.strings
2)对InfoPlist.strings进行本地化(Get Info -> Make Localization),然后设置需要的语言(如中文zh)
3)编辑不同的InfoPlist.strings文件,设置显示名字CFBundleDisplayName = "名字";
4)编辑Info.plist,添加一个新的属性Application has localized display name,设置其类型为boolean,并将其value设置为true
注意: 上面获取应用名称的方法,只能获取到直接在info中设置的Bundle Display Name信息,获取不到在InfoPlist.strings中设置的CFBundleDisplayName的信息。

  • 获取InfoPlist.strings设置的国际化的应用名称方法如下:
NSLocalizedStringFromTableInBundle(@"CFBundleDisplayName", @"InfoPlist", [NSBundle mainBundle], comment);
  • 获取应用短版本号,如1.0(用户看到的版本号,AppStore上的版本号)
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 
  • 获取应用Build版本号,如1.0.1(公司内部使用的版本号,在AppStore修改同一个版本的IPA文件时,可以通过自增Build版本号来实现上传多个)
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];  
  • 获取应用identifier,如com.Circus.CJDeviceInfo(常用于需要同一份代码打包成不同应用,通过判断identifier来实现使用不同的第三方key)
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"]; 

NSLocale

本地化封装了关于语言,文化以及技术约定和规范的信息。用于提供与用户所处地域相关的定制化信息和首选项信息的设置。NSLocale类封装了本地化相关的各种信息,NSLocale可以获取用户的本地化信息设置,例如货币类型,国家,语言,数字,日期格式的格式化,提供正确的地理位置显示等等。

  • 创建本地化对象
// 根据本地标识符创建本地化对象
NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
// 获取当前用户设置的本地化对象
NSLocale *currentLocale = [NSLocale currentLocale];
  • 获取系统本地化信息
// 获取系统所有本地化标识符数组列表
[NSLocale availableLocaleIdentifiers];
// 获取所有已知合法的国家代码数组列表
[NSLocale ISOCountryCodes];
// 获取所有已知合法的ISO货币代码数组列表
[NSLocale ISOCurrencyCodes];
// 获取所有已知合法的ISO语言代码数组列表
[NSLocale ISOLanguageCodes];
  • 获取本地标识信息和语言码信息
// 本地标识,如:en_US
[[NSLocale currentLocale] localeIdentifier];
等价于
[[NSLocale currentLocale] objectForKey:NSLocaleIdentifier];
// 语言码,如:en
[[NSLocale currentLocale] objectForKey: NSLocaleLanguageCode];
  • 获取当前语言的排版方向和字符方向
// 语言的排版方向
[NSLocale lineDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode];
// 字符方向
[NSLocale characterDirectionForLanguage:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode];
// 返回结果为枚举类型
typedef NS_ENUM(NSUInteger, NSLocaleLanguageDirection) {
    NSLocaleLanguageDirectionUnknown = kCFLocaleLanguageDirectionUnknown,         // 未知
    NSLocaleLanguageDirectionLeftToRight = kCFLocaleLanguageDirectionLeftToRight, // 从左向右
    NSLocaleLanguageDirectionRightToLeft = kCFLocaleLanguageDirectionRightToLeft, // 从右向左
    NSLocaleLanguageDirectionTopToBottom = kCFLocaleLanguageDirectionTopToBottom, // 从上到下
    NSLocaleLanguageDirectionBottomToTop = kCFLocaleLanguageDirectionBottomToTop  // 从下到上
};
  • 获取用户的语言偏好设置列表,该列表对应于iOS中Setting>General>Language弹出的面板中的语言列表,列表的第一个元素即为当前用户设置的语言。
[NSLocale preferredLanguages]
  • 监听用户本地化设置的消息
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(localChangedHandler:)
                                             name:NSCurrentLocaleDidChangeNotification object:nil];
  • 以本地化方式获取国际化信息的显示名称
// 以美国地区,英文语言为本地化(en_US)
NSLocale *curLocal = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSLog(@"%@",[curLocal displayNameForKey:NSLocaleIdentifier value:@"fr_FR"] );// French (France)
// 以中国地区,简体中文语言为本地化(zh-Hans)
curLocal = [[NSLocale alloc] initWithLocaleIdentifier:@"zh-Hans"];
NSLog(@"%@",[curLocal displayNameForKey:NSLocaleIdentifier value:@"fr_FR"] );// 法文(法国)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容