2014-09-03 08:42:52 github_20112055 阅读数 496

要使用iOS偏好设置其实是个很简单的事情,你只要做到两点就可以了,

1.创建一个setting.Bundle

第一件事情就是在 xcode->file->New->File 中创建setting bundle 就可以了,如下图 



这里介绍一下settingbundle 的内容 

Root.plist 这个是主plist主列表的所在

.plist 其他子列表,用于多层设置的shihoushiyong

.lproj 用于设置本地化的东西

images,在设置列表中使用的图片


2.第二件事情就是设置 这和setting 的plist

通过设置里面的内容,使我们可以在系统界别的的setting中看到我们自己的应用设置,这样就可以直接动态设置一些默认的app参数

一共我们可以设置以下7种不同的参数Item,其中Group使用来显示设置分组情况的,当然每种不同的

设置控件 类型
文本框 PSTextFieldSpecifier
文字 PSTitleValueSpecifier
开关控件 PSToggleSwitchSpecifier
Slider PSSliderSpecifier
Multivalue PSMultiValueSpecifier
Group PSGroupSpecifier
子面板 PSChildPaneSpecifier.

具体怎么写,我就用苹果官方的例子让大家看一下了





3.使用

使用这个跟使用NSUserDefaults的方法是一样的,直接取key就可以了,当然你可以通过方法,进行默认值的设置,比如下面

   // Register the preference defaults early.
    NSDictionary *appDefaults = [NSDictionary
        dictionaryWithObject:[NSNumber numberWithBool:YES]
forKey:@"CacheDataAgressively"];
    [[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults];


其他知识点

这里再跟大家说一下另一种可以跨设备的存储方式,存储到iCloud,能用于多设备同步,他就是

NSUbiquitousKeyValueStore ,它只能存储大概1M的内容,而且他的用法其实根NSUserDefaults是一样的,我们可以这么来监听它,以做到多设备信息的同步

NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore];
  [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(updateKVStoreItems:)
            name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification
            object:store];
[store synchronize];


 - (void)updateKVStoreItems:(NSNotification*)notification {
     // Get the list of keys that changed.
     NSDictionary* userInfo = [notification userInfo];
     NSNumber* reasonForChange = [userInfo
  objectForKey:NSUbiquitousKeyValueStoreChangeReasonKey];
     NSInteger reason = -1;
     // If a reason could not be determined, do not update anything.
     if (!reasonForChange)
return;
// Update only for changes from the server.
     reason = [reasonForChange integerValue];
     if ((reason == NSUbiquitousKeyValueStoreServerChange) ||
           (reason == NSUbiquitousKeyValueStoreInitialSyncChange)) {
        // If something is changing externally, get the changes
        // and update the corresponding keys locally.
        NSArray* changedKeys = [userInfo
  objectForKey:NSUbiquitousKeyValueStoreChangedKeysKey];
NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore]; NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
        // This loop assumes you are using the same key names in both
        // the user defaults database and the iCloud key-value store
        for (NSString* key in changedKeys) {
           id value = [store objectForKey:key];
           [userDefaults setObject:value forKey:key];
        }
} }




2016-07-27 16:23:57 tianshats 阅读数 9881


一、什么是库

       库实际上是一种代码共享的方式,主要用于代码重用和源码隐藏,通常分为动态库和静态库。

       静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

       动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存空间。


二、什么是.a、.bundle、.framework


       在iOS中静态库以.a和.framework的形式存在,动态库以.dylib和.framework的形式存在。

       之所以.framework既可能是动态库又可能是静态库,是因为苹果公司禁止用户级App使用动态库,而自己却又堂而皇之的使用动态库,这就造成了iOS中系统级的.framework是动态库,用户级的.framework是静态库

        二者区别不大,.a是纯二进制文件,.a文件不能单独使用,至少要有.h文件配合,而.framework除了二进制文件外,还包含一些资源文件(头文件,plist等),由于自身包含了头文件,所以.framework可以单独使用。

          .a和.framework两种静态库,通常都是把需要用的到图片或者xib文件存放在一个bundle文件中,而该bundle文件的名字和.a或.framework的名字相同。关于bundle文件的制作方法,后面有专门介绍。



三、静态库使用的必要性


   1>.  代码的共享与重用

    2>.  程序模块化

    3>.  分享给别人代码库时代码隐藏

    4>.  开发第三方SDK


四、.a静态库文件


1、点击创建Project


2、在.m和.h中进行代码编写

3、根据armv7和arm64打包两个.a进行合并

合并两个.a文件

lips -create /Users/tiansha/Desktop/libTestLibrary.a /Users/tiansha/Desktop/Demo/Shengshihuihai/ShengShiHuiHai/Resource/libTestLibrary.a -output /Users/tiansha/Desktop/libTestLibrary2.a

模拟器包和真机包也可以用该方法进行合并。


4、合并后导入到项目中,并把.h文件与.a 文件一起导入到项目中



5、编译项目,导融TestLibrary 即可调用.a中的方法



总结:.a文件需要模拟器和真机文件进行合并后项目中才都可以使用,避免切换造成的开发成本高的问题。


五、资源库.bundle


1、bundle资源库的特点

Bundle是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的2进制数据。

2、新建.bundle


3、加入你需要编译在bundle中的资源文件。

当然,默认的配置也是可以的,如果你需要特定的优化或者特定的路径配置,你可以进行下面第4步的配置。
4、进行可选设置
资源包只需要编译不需要安装



5、编译即可生成.bundle文件,导入项目中


6、调用方式

    UIImageView *image = [[UIImageViewalloc]initWithFrame:CGRectMake(0,0,320,480)];

    image.backgroundColor = [UIColorredColor];

    image.image = [UIImageimageNamed:@"TestBundle.bundle/Contents/Resources/1.png"];

    [self.viewaddSubview:image];


五、.framework

1、创建


2、Build Phases -> Headers,可以看出有三个选项,分别是Public,Private,Project;把需要暴露给别人的.h文件拖到Public中,剩下的不要暴露的,即为隐藏的文件,放在Project中



3、把所有需要暴露的.h文件都用#import<TestFramework/TestLibrary.h>引入,记住一定要将所有的需要暴露的.h文件都写在给定的.h文件中,不然编译后生成的.framework在引用的时候会有警告。



4、新建一个Target,选择Other - >Aggregate



5、选中新建的Target,点击Build Pharas ,选中左上角的+,New Run Script Phase,添加脚本



脚本用于合并Framework,真机和模拟器版本,以及armv7 armv7s arm64等不同architectures

# Sets the target folders and the final framework product.

# 如果工程名称和FrameworkTarget名称不一样的话,要自定义FMKNAME

# 例如: FMK_NAME = "MyFramework"

FMK_NAME=${PROJECT_NAME}


# Install dir will be the final output to the framework.

# The following line create it in the root folder of the current project.

INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework


# Working dir will be deleted after the framework creation.

WRK_DIR=build

DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework

SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework


# -configuration ${CONFIGURATION}

# Clean and Building both architectures.

xcodebuild -configuration "Release" -target"${FMK_NAME}" -sdk iphoneos clean build

xcodebuild -configuration "Release" -target"${FMK_NAME}" -sdk iphonesimulator clean build


# Cleaning the oldest.

if [ -d "${INSTALL_DIR}" ]

then

rm -rf "${INSTALL_DIR}"

fi


mkdir -p "${INSTALL_DIR}"


cp -R "${DEVICE_DIR}/""${INSTALL_DIR}/"


# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.

lipo -create "${DEVICE_DIR}/${FMK_NAME}""${SIMULATOR_DIR}/${FMK_NAME}" -output"${INSTALL_DIR}/${FMK_NAME}"


rm -r "${WRK_DIR}"


open "${SRCROOT}/Products/"


6、选中Targets中的第一个Target,点击Build Setting -> Mach-O Type,选择Static Library,到这里会有一个问题存在,就是无法在iPhone5c上使用.framework,这是我们需要在Build Setting -> Architectures ->Architectures中添加armv7s




7、选中Aggregate,进行编译,编译成功后自动打开product文件夹



8、打开终端,可以查看支持的架构

lipo -info /Users/tiansha/Desktop/Demo/TestFramework/Products/TestFramework.framework/TestFramework




9、导入项目中即可使用



注意:运行的xcode版本是7.3


2015-04-13 11:04:50 li836497449 阅读数 264


一报错 :  missing required icon file,the boundle does not contain an app icon for iPhone/iPod Touch of exactly '57*57' pixels, in .png format  for iOS versions < 7.0. 

  --需要提供57*57的图片 命名Icon.png info.plist->add row->icon files  item0 Icon.png

2018-04-20 16:12:18 qq_35122556 阅读数 296

问题很简单,不显示多半是百度地图的key 和工程的boundle Identifier  不一致导致的。

2019年-8月的百度地图demo里需要替换的key 有两个地方都在appdelegate 里.

在此提供一个boundle id:   com.baidu.mapsdk.demodqf        

ak: 4wB4dfWWHz4P1sd9fW4ssnix          工程里的Please enter your key   替换成自己的ak

省的还得注册账号才能看.

2015-05-14 09:24:15 xundh 阅读数 5023

1.在xcode外创建一个文件夹,命令为app.bundle(必须为.bundle扩展名)

以后打开此文件夹,要鼠标右键-显示包内容,直接双击不行。

2.加到xcode项目里

3.代码获取里面文件路径:

资源路径:

NSString *bundlePath = [[NSBundle mainBundle] resourcePath];

文件路径:

  NSString *url=[[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"app.bundle/datas.sqlite"];

上一级路径:

NSString *secondParentPath = [[bundlePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent]

不通过bundle获取资源:

UIImage *img=[UIImage imageNamed:@"cellicon.png"];

获取自定义的文件路径:

    NSString *newPath=[NSString stringWithFormat:@"%@%@%@",[[NSBundle mainBundle]resourcePath],@"/",@"test.txt"];
    NSFileHandle *url2=[NSFileHandle fileHandleForReadingAtPath:newPath];

    NSString *newPath=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
    NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:newPath];


iOS极光推送

阅读数 355

iOS开发学习总结

阅读数 251

没有更多推荐了,返回首页