代码中更改Icon图标、制作库 、 记录崩溃日志 、 唯一标识---iOS笔记摘录

目录
    1、代码中更改Icon图标
1. 代码中更改Icon图标(更换图标,会弹出确认框,仅支持13及以上系统)

第1步. 修改Info.plist

<key>CFBundleIcons</key>
<dict>
   <key>CFBundlePrimaryIcon</key>
   <dict>
       <key>CFBundleIconFiles</key>
       <array>
           <string>原AppIcon图标名</string>
       </array>
   </dict>
   <key>CFBundleAlternateIcons</key>
   <dict>
       <key>icon01</key>
       <dict>
           <key>CFBundleIconFiles</key>
           <array>
               <string>AppIcon图标名2</string>
           </array>
       </dict>
       <key>icon02</key>
       <dict>
           <key>CFBundleIconFiles</key>
           <array>
               <string>AppIcon图标名3</string>
           </array>
       </dict>
   </dict>
</dict>

第2步. 将所有AppIcon放入工程中(不要放在Assets.xcassets)

第3步. 代码

// 更换
if ([UIApplication sharedApplication].supportsAlternateIcons) {
       [[UIApplication sharedApplication] setAlternateIconName:图标名key字符串 completionHandler:^(NSError * _Nullable error) {
           if (!error) {
               NSLog(@"success:%@",图标名);
           }else{
               NSLog(@"error:%@",error);
           }
       }];
   } else {
       NSLog(@"不能更换icon");
       return;
   }
}

// 还原
if ([UIApplication sharedApplication].alternateIconName != nil) {  // 图标被替换过
       // 重置icon
       [[UIApplication sharedApplication] setAlternateIconName:nil completionHandler:^(NSError * _Nullable error) {
           if (!error) {
               NSLog(@"success");
           } else {
               NSLog(@"error:%@",error);
           }
       }];
   }

示例

    dispatch_async(dispatch_get_main_queue(), ^{
        // 更换图标,会弹出确认框
        if (@available(iOS 10.3, *)) {
            if ([UIApplication sharedApplication].supportsAlternateIcons) {
                [[UIApplication sharedApplication] setAlternateIconName:@"icon01" completionHandler:^(NSError * _Nullable error) {
                    if (!error) {
                        NSLog(@"success:%@",@"icon02");
                    }else{
                        NSLog(@"error:%@",error);
                    }
                }];
            } else {
                NSLog(@"不能更换icon");
                return;
            }
        } else {
            // Fallback on earlier versions
        }
    });
2. 制作静态库
  库是代码集合,是共享代码的一种方式。2种方式:
      开源:公开源代码
      闭源:静态库(.a .framework) / 动态库(.dylib .framework)
          静态库:在链接阶段,会将文件完全复制过来。冗余占内存
          动态库:程序运行时有系统加载到内存供程序调用,仅加载一次。
    
注意
  自定义的动态库不允许上传AppStore
  .a文件(纯二进制)不能单独使用,需要.h配合。
  .framework文件(包含二进制,.h,plist等)可单独使用。

制作.a

     1.新建项目(选择CocoaTouch StaticLibrary),并写入相关代码
     2.项目|buildPhases|+|New Header Phase|拖入对外头文件
     3.选择真机编译(拿到.a),选择模拟器编译(拿到.a) (2者是不一样的,Debug-iphoneos文件夹中是真机,Debug-iphonesimulator文件夹中是模拟器)
     4.终端合并2.a (lipo -create Debug-iphoneos/xxx.a Debug-iphonesimulator/xxx.a -output xxx.a)  可改变路径 /Users/cx/Desktop/...
     5.使用.a, 将.a和include中的文件拖入项目中

制作.framework

     1.新建项目(选择CocoaTouch Framework),并写入相关代码
     2.项目|buildPhases|+|New Header Phase|拖入对外头文件
       项目|编辑区左上角Add Target|Cross-platform|Aggregate| Build Phases | + | NewRunScript Phase 
# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义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/"
        项目|项目target|Build Settings|Mach-O Type 选择StaticLibrary
        选择AggregateTarget进行编译(自动弹出Product文件夹)

使用
        导入.framework
        #import<>


         查看支持的arm架构
         lipo -info framework

制作.bundle

  bundle文件:静态文件,不参加编译,作为资源解析成特殊的二进制数据

新建bundle
     新建项目(选择macOS|bundle)| 放入图片 | 编译 | 拿到.bundle
使用
[UIImageimageNamed:@"TestBundle.bundle/Contents/Resources/1.png"]
记录崩溃日志
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 设置处理崩溃方法(闪退时调用)
    NSSetUncaughtExceptionHandler(&ExceptionHandler);
}
void ExceptionHandler(NSException *exception){
    //
    NSArray *arr=[exception callStackSymbols];
    // 闪退原因
    NSString *reason=[exception reason];
    // 闪退名
    NSString *name=[exception name];
    // 当前版本号
    NSString *currentVersion=[[[NSBundle mainBundle]infoDictionary]objectForKey:@"CFBundleversion"];
    
    // 调接口
}

唯一标识
    在iOS5前可以获取唯一标识UDID(Unique Device Identifier)。

    思路(在非越狱的手机上):
    1.获取某个硬件信息生成唯一标识。第一找苹果的漏洞,第二调用私有接口。不可持续发展
    2.获取操作系统信息生成唯一标识。在系统升级、卸载重装、备份恢复都可以保留,但重置手机系统会清除。
    
    国内
    友盟用的是          Openudid + IDFA
    TalkingData用的是  Keychain + IDFA

Openudid

github上开源项目
    原理:利用iOS系统中的UIPasteboard剪贴板类通过键值对来存储一个160位的随机字符串。
    iOS7之后,苹果封堵了剪贴板通信的漏洞,之前所有的应用都可以共享同一个剪贴板存储内容。现在只有在同一CFBundleIdentifier标识下的App才能共享内容,如com.koudai.a和com.koudai.b。

keychain

    keychain钥匙串,是一个苹果用来存储密码和证书的加密存储区域,目的是为了帮助用户安全存储应用或者浏览器的密码,减少了很多输入密码和记密码的麻烦。
    keychain存储在手机的某个公共区域(不是沙盒),因此卸载应用并不影响但重置系统会清除,可以拿keychain来存储唯一标识。


UUID, 全球独立标识(Globally Unique Identifier)
    重复概率为170亿分之一
    NSString *uuid = [[NSUUID UUID] UUIDString];

IDFA

    ASIdentifierManager单例(AdSupport.framework框架)提供了一个方法advertisingIdentifier,返回一个的NSUUID实例
    重置系统或还原广告标示符(设置程序|通用|关于本机|广告|还原广告标示符)是会清除
    使用IDFA(必须勾选IDFA选项)但未集成任何广告服务的应用审核都会被拒
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342