iOS: NFC拉起微信小程序

一: 申請微信小程序NFC的URL Scheme

直達(dá)鏈接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/NFC.html

二: 換起NFC功能
   @property (strong, nonatomic) NFCTagReaderSession *session;
   if (NFCTagReaderSession.readingAvailable == NO) 
          [GHLoadingView showPopViewMessage:@"該機(jī)型不支持NFC功能!" success:NO andDismissTime:0.5];
          return;
      }
    self.session = [[NFCTagReaderSession alloc] initWithPollingOption:(NFCPollingISO14443 | NFCPollingISO15693 | NFCPollingISO15693) delegate:self queue:dispatch_get_main_queue()];
    self.session.alertMessage = @"查找卡片,請將卡片靠近手機(jī)";
    [self.session beginSession]; //開始識別 彈出識別提示框
三: 寫入數(shù)據(jù)
#pragma mark --- NFCTagReaderSessionDelegate ---
- (void)tagReaderSession:(NFCTagReaderSession *)session didDetectTags:(NSArray<__kindof id<NFCTag>> *)tags API_AVAILABLE(ios(13.0)) {
    
    id<NFCMiFareTag> cuurentTag = [tags firstObject];
    id<NFCMiFareTag> mifareTag = [cuurentTag asNFCMiFareTag];
    if (mifareTag.type != NFCTagTypeMiFare){
        [self invalidateSessionWitgMsg:@"NFC類型不可用" success:NO];
        return;
    }
    // 先建立連接
    MJWeakSelf
    [self.session connectToTag:mifareTag completionHandler:^(NSError * _Nullable error) {
        // 獲取卡片狀態(tài):判斷是否可以寫入
        if (error){
            [weakSelf invalidateSessionWitgMsg:@"NFC連接失敗" success:NO];
            return;
        }
        [cuurentTag queryNDEFStatusWithCompletionHandler:^(NFCNDEFStatus status, NSUInteger capacity, NSError * _Nullable error) {
            // 寫入
            if (status != NFCNDEFStatusReadWrite) {
                [weakSelf invalidateSessionWitgMsg:@"NFC無法寫入" success:NO];
                return;
            }
            NSMutableArray *nfcArray = [NSMutableArray arrayWithCapacity:2];
            {
                NSString *type = @"U";
                NSData *typeData = [type dataUsingEncoding:NSUTF8StringEncoding];
                NSString *identifier = @"1001";
                NSData *identifierData = [identifier dataUsingEncoding:NSUTF8StringEncoding];
                NSString *payloadStr = @"URL Scheme";
                NSData *payloadData = [payloadStr dataUsingEncoding:NSUTF8StringEncoding];
                Byte byte[] = {0x00};
                NSData *data = [NSData dataWithBytes:byte length:1];
                NSMutableData *tmpData = [[NSMutableData alloc] init];
                [tmpData appendData:data];
                [tmpData appendData:payloadData];
                NFCNDEFPayload *NDEFPayload = [[NFCNDEFPayload alloc] initWithFormat:NFCTypeNameFormatNFCWellKnown type:typeData identifier:identifierData payload:tmpData];
                [nfcArray addObject:NDEFPayload];
            }
            {
                NSString *type = @"android.com:pkg";
                NSData *typeData = [type dataUsingEncoding:NSUTF8StringEncoding];
                NSString *identifier = @"1001";
                NSData *identifierData = [identifier dataUsingEncoding:NSUTF8StringEncoding];
                NSString *payloadStr = @"com.tencent.mm";
                NSData *payloadData = [payloadStr dataUsingEncoding:NSUTF8StringEncoding];
                NFCNDEFPayload *NDEFPayload = [[NFCNDEFPayload alloc] initWithFormat:NFCTypeNameFormatNFCExternal type:typeData identifier:identifierData payload:payloadData];
                [nfcArray addObject:NDEFPayload];
            }
            NFCNDEFMessage *message = [[NFCNDEFMessage alloc] initWithNDEFRecords:nfcArray];
            [cuurentTag writeNDEF:message completionHandler:^(NSError * _Nullable error) {
                NSString *msg = error?@"NFC寫入失敗":@"NFC寫入成功";
                [weakSelf invalidateSessionWitgMsg:msg success:error==nil];
            }];
        }];
    }];
}
四: 參數(shù)傳遞

如果想要實(shí)現(xiàn)NFC喚起小程序打開指定界面,且傳入?yún)?shù)就得在服務(wù)端實(shí)現(xiàn)請求scheme
接口參數(shù):

NSDictionary *dic = @{
        @"jump_wxa":@{
            @"query":@"code=xxx&p=xxx",
            @"env_version":@"develop",
            @"path":@"page/index"
        },
        @"model_id":model_id,
        @"sn":@"xxxxxxx"
    };

query:傳入你想傳的參數(shù),必須符合url參數(shù)規(guī)則(xx=xx&xx=xx)
env_version:換起的小程序環(huán)境版本,
path:喚起的小程序指定頁面路徑
sn:設(shè)備的sn,可以根據(jù)實(shí)際情況傳入,沒有限制,比如傳一個當(dāng)前任務(wù)的id,同一個sn只會生成唯一的scheme
注意:在切換env_version環(huán)境的時候必須也更換sn拼接規(guī)則,不然同一個sn在開發(fā)環(huán)境生成的scheme在正式環(huán)境不會重新生成,這樣會喚起開發(fā)版的小程序.sn的拼接最好寫成:env_version+ID

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容